chiark / gitweb /
reset signal handlers on startup
authorLennart Poettering <lennart@poettering.net>
Wed, 27 Jan 2010 05:19:28 +0000 (06:19 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 27 Jan 2010 05:19:28 +0000 (06:19 +0100)
manager.c
util.c
util.h

index b3123f2b1d2d57ac29f02b55acac9cec704a42af..f15cf79869f3a23028e60025037c759661612ca2 100644 (file)
--- a/manager.c
+++ b/manager.c
@@ -15,6 +15,7 @@
 #include "macro.h"
 #include "strv.h"
 #include "log.h"
 #include "macro.h"
 #include "strv.h"
 #include "log.h"
+#include "util.h"
 
 Manager* manager_new(void) {
         Manager *m;
 
 Manager* manager_new(void) {
         Manager *m;
@@ -41,6 +42,8 @@ Manager* manager_new(void) {
         if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
                 goto fail;
 
         if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
                 goto fail;
 
+        assert_se(reset_all_signal_handlers() == 0);
+
         assert_se(sigemptyset(&mask) == 0);
         assert_se(sigaddset(&mask, SIGCHLD) == 0);
         assert_se(sigaddset(&mask, SIGINT) == 0);
         assert_se(sigemptyset(&mask) == 0);
         assert_se(sigaddset(&mask, SIGCHLD) == 0);
         assert_se(sigaddset(&mask, SIGINT) == 0);
diff --git a/util.c b/util.c
index c7b2ca8516fa663f0d65158850e29088241dd143..4774610265f61a39e683a72ed69054d8592cb484 100644 (file)
--- a/util.c
+++ b/util.c
@@ -468,3 +468,25 @@ char *path_make_absolute(const char *p, const char *prefix) {
 
         return r;
 }
 
         return r;
 }
+
+int reset_all_signal_handlers(void) {
+        int sig;
+
+        for (sig = 1; sig < _NSIG; sig++) {
+                struct sigaction sa;
+
+                if (sig == SIGKILL || sig == SIGSTOP)
+                        continue;
+
+                zero(sa);
+                sa.sa_handler = SIG_DFL;
+
+                /* On Linux the first two RT signals are reserved by
+                 * glibc, and sigaction() will return EINVAL for them. */
+                if ((sigaction(sig, &sa, NULL) < 0))
+                        if (errno != EINVAL)
+                                return -errno;
+        }
+
+    return 0;
+}
diff --git a/util.h b/util.h
index f14751ea5e2d2ea45e93ea248e0c738eaae65550..a9690603317179081364ee079414ca355a305b52 100644 (file)
--- a/util.h
+++ b/util.h
@@ -99,4 +99,6 @@ bool is_path(const char *p);
 bool path_is_absolute(const char *p);
 char *path_make_absolute(const char *p, const char *prefix);
 
 bool path_is_absolute(const char *p);
 char *path_make_absolute(const char *p, const char *prefix);
 
+int reset_all_signal_handlers(void);
+
 #endif
 #endif