Ignore signals in all but the main thread.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 15 Jan 2011 21:15:39 +0000 (22:15 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 15 Jan 2011 21:15:39 +0000 (22:15 +0100)
src/net.c
src/net.h
src/process.c
src/threads.h

index 2ffe03a7b39a7985fdb01a7ab1108880a62c0184..3eec9a647b5e3b2e77116323b05637b5dcdab8cf 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -38,6 +38,7 @@
 
 int contradicting_add_edge = 0;
 int contradicting_del_edge = 0;
+bool running = true;
 
 /* Purge edges and subnets of unreachable nodes. Use carefully. */
 
@@ -244,16 +245,6 @@ void handle_meta_connection_data(void *data) {
        }
 }
 
-static void sigterm_handler(int signal, short events, void *data) {
-       logger(LOG_NOTICE, "Got %s signal", strsignal(signal));
-       exit(0);
-}
-
-static void sighup_handler(int signal, short events, void *data) {
-       logger(LOG_NOTICE, "Got %s signal", strsignal(signal));
-       reload_configuration();
-}
-
 int reload_configuration(void) {
        connection_t *c;
        splay_node_t *node, *next;
@@ -361,15 +352,6 @@ int main_loop(void) {
 
        event_add(&timeout_event);
 
-#ifdef SIGHUP
-       signal(SIGHUP, sighup_handler);
-#endif
-#ifdef SIGTERM
-       signal(SIGTERM, sigterm_handler);
-#endif
-#ifdef SIGQUIT
-       signal(SIGQUIT, sigterm_handler);
-#endif
 
        while(true) {
                mutex_unlock(&mutex);
index 2be797d947c55a2ea3c2eca3df1eff8905a917de..d39dd93f4bc8bd91cd190d3c82b1d53ff885a33c 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -158,5 +158,6 @@ extern void load_all_subnets();
 #endif
 
 extern mutex_t mutex;
+extern bool running;
 
 #endif                                                 /* __TINC_NET_H__ */
index c1ad81fac1dbd4cbbe844f35db5c73922fd448c1..e6b108f5ab10e68b9c2d6acf61daf7e869dff6dc 100644 (file)
@@ -342,6 +342,14 @@ bool execute_script(const char *name, char **envp) {
 */
 
 #ifndef HAVE_MINGW
+static RETSIGTYPE sigterm_handler(int a) {
+       logger(LOG_NOTICE, "Got %s signal", "TERM");
+       if(running)
+               running = false;
+       else
+               exit(1);
+}
+
 static RETSIGTYPE fatal_signal_square(int a) {
        logger(LOG_ERR, "Got another fatal signal %d (%s): not restarting.", a,
                   strsignal(a));
@@ -382,11 +390,15 @@ static struct {
        int signal;
        void (*handler)(int);
 } sighandlers[] = {
+       {SIGTERM, sigterm_handler},
+       {SIGQUIT, sigterm_handler},
+       {SIGINT, sigterm_handler},
        {SIGSEGV, fatal_signal_handler},
        {SIGBUS, fatal_signal_handler},
        {SIGILL, fatal_signal_handler},
        {SIGPIPE, ignore_signal_handler},
        {SIGCHLD, ignore_signal_handler},
+       {SIGALRM, ignore_signal_handler},
        {0, NULL}
 };
 #endif
index 85aaced7ecc843f5cdf0b2c998660ab22a979139..3ec8c681aec1d60ffb6d6cba67fd2c6606a4ce3d 100644 (file)
@@ -29,7 +29,14 @@ typedef pthread_t thread_t;
 typedef pthread_mutex_t mutex_t;
 
 static inline bool thread_create(thread_t *tid, void (*func)(void *), void *arg) {
-       return !pthread_create(tid, NULL, (void *(*)(void *))func, arg);
+       bool result;
+
+       sigset_t old, block;
+       sigfillset(&block);
+       pthread_sigmask(SIG_SETMASK, &block, &old);
+       result = pthread_create(tid, NULL, (void *(*)(void *))func, arg);
+       pthread_sigmask(SIG_SETMASK, &old, NULL);
+       return !result;
 }
 static inline void thread_destroy(thread_t *tid) {
        pthread_cancel(*tid);