Simplify signal handling.
authorGuus Sliepen <guus@tinc-vpn.org>
Thu, 2 Jun 2011 15:14:30 +0000 (17:14 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Thu, 2 Jun 2011 15:14:30 +0000 (17:14 +0200)
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.

src/process.c

index 1ec450cd0d4bbb00961a8d5b0ab1f63e17f5a7e1..de9c71d6b8f68bb913ab003ae594c09800e6f0de 100644 (file)
@@ -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)