From: Guus Sliepen Date: Thu, 2 Jun 2011 15:14:30 +0000 (+0200) Subject: Simplify signal handling. X-Git-Tag: release-1.1pre1~29 X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=e452a933f9c53fd58db9d932afd15319129dd988 Simplify signal handling. We don't override any signal handlers anymore except those for SIGPIPE and SIGCHLD. Fatal signals (SIGSEGV, SIGBUS etc.) will terminate tincd and optionally dump core. The previous behaviour was to terminate gracefully and try to restart, but that usually failed and made any core dump useless. --- diff --git a/src/process.c b/src/process.c index 1ec450cd..de9c71d6 100644 --- a/src/process.c +++ b/src/process.c @@ -40,10 +40,6 @@ extern char *identname; extern char **g_argv; extern bool use_logfile; -#ifndef HAVE_MINGW -static sigset_t emptysigset; -#endif - static void memory_full(int size) { logger(LOG_ERR, "Memory exhausted (couldn't allocate %d bytes), exitting.", size); exit(1); @@ -342,38 +338,6 @@ bool execute_script(const char *name, char **envp) { */ #ifndef HAVE_MINGW -static RETSIGTYPE fatal_signal_square(int a) { - logger(LOG_ERR, "Got another fatal signal %d (%s): not restarting.", a, - strsignal(a)); - exit(1); -} - -static RETSIGTYPE fatal_signal_handler(int a) { - struct sigaction act; - logger(LOG_ERR, "Got fatal signal %d (%s)", a, strsignal(a)); - - if(do_detach) { - logger(LOG_NOTICE, "Trying to re-execute in 5 seconds..."); - - act.sa_handler = fatal_signal_square; - act.sa_mask = emptysigset; - act.sa_flags = 0; - sigaction(SIGSEGV, &act, NULL); - - close_network_connections(); - sleep(5); - exit_control(); - execvp(g_argv[0], g_argv); - } else { - logger(LOG_NOTICE, "Not restarting."); - exit(1); - } -} - -static RETSIGTYPE unexpected_signal_handler(int a) { - logger(LOG_WARNING, "Got unexpected signal %d (%s)", a, strsignal(a)); -} - static RETSIGTYPE ignore_signal_handler(int a) { ifdebug(SCARY_THINGS) logger(LOG_DEBUG, "Ignored signal %d (%s)", a, strsignal(a)); } @@ -382,12 +346,8 @@ static struct { int signal; void (*handler)(int); } sighandlers[] = { - {SIGSEGV, fatal_signal_handler}, - {SIGBUS, fatal_signal_handler}, - {SIGILL, fatal_signal_handler}, {SIGPIPE, ignore_signal_handler}, {SIGCHLD, ignore_signal_handler}, - {SIGABRT, SIG_DFL}, {0, NULL} }; #endif @@ -395,29 +355,10 @@ static struct { void setup_signals(void) { #ifndef HAVE_MINGW int i; - struct sigaction act; - - sigemptyset(&emptysigset); - act.sa_handler = NULL; - act.sa_mask = emptysigset; - act.sa_flags = 0; - - /* Set a default signal handler for every signal, errors will be - ignored. */ - for(i = 1; i < NSIG; i++) { - if(!do_detach) - act.sa_handler = SIG_DFL; - else - act.sa_handler = unexpected_signal_handler; - sigaction(i, &act, NULL); - } + struct sigaction act = {NULL}; - /* If we didn't detach, allow coredumps */ - if(!do_detach) - sighandlers[0].handler = SIG_DFL; + sigemptyset(&act.sa_mask); - /* Then, for each known signal that we want to catch, assign a - handler to the signal, with error checking this time. */ for(i = 0; sighandlers[i].signal; i++) { act.sa_handler = sighandlers[i].handler; if(sigaction(sighandlers[i].signal, &act, NULL) < 0)