uloop: add back support for overriding signal handlers when signalfd is in use
authorFelix Fietkau <nbd@nbd.name>
Tue, 17 May 2016 11:59:05 +0000 (13:59 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 17 May 2016 11:59:05 +0000 (13:59 +0200)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
uloop-epoll.c
uloop.c

index 46fa101fd786b5a700267bc1c7de7da09b07f42c..2d1c4a723dbeabb92bd78362855faada1ff91bc2 100644 (file)
@@ -29,6 +29,7 @@ static void
 uloop_signal_fd_cb(struct uloop_fd *fd, unsigned int events)
 {
        struct signalfd_siginfo fdsi;
+       struct sigaction act;
        int ret;
 
 retry:
@@ -39,7 +40,22 @@ retry:
        if (ret != sizeof(fdsi))
                return;
 
-       uloop_handle_signal(fdsi.ssi_signo);
+       switch (fdsi.ssi_signo) {
+       case SIGQUIT:
+       case SIGINT:
+       case SIGTERM:
+               sigaction(fdsi.ssi_signo, NULL, &act);
+               if (act.sa_handler != SIG_IGN &&
+                       act.sa_handler != SIG_DFL) {
+                       act.sa_handler(fdsi.ssi_signo);
+                       break;
+               }
+
+               /* fall through */
+       default:
+               uloop_handle_signal(fdsi.ssi_signo);
+               break;
+       }
 }
 
 static bool
@@ -58,7 +74,7 @@ uloop_setup_signalfd(bool add)
 
        if (!add) {
                uloop_fd_delete(&sfd);
-               sigprocmask(SIG_SETMASK, &prev_mask, NULL);
+               sigprocmask(SIG_BLOCK, &prev_mask, NULL);
        } else {
                sigaddset(&mask, SIGQUIT);
                sigaddset(&mask, SIGINT);
diff --git a/uloop.c b/uloop.c
index 45f7c5d83858673885a1c602a6aa9ff189da8cdf..af84737c28ce6112337ee2362e23444885d7c57f 100644 (file)
--- a/uloop.c
+++ b/uloop.c
@@ -392,14 +392,13 @@ static void uloop_ignore_signal(int signum, bool ignore)
 
 static void uloop_setup_signals(bool add)
 {
-       static struct sigaction old_sigint, old_sigchld, old_sigterm;
+       static struct sigaction old_sigint, old_sigchld, old_sigterm, old_sigquit;
 
-       if (uloop_setup_signalfd(add))
-               return;
+       uloop_setup_signalfd(add);
 
        uloop_install_handler(SIGINT, uloop_handle_signal, &old_sigint, add);
        uloop_install_handler(SIGTERM, uloop_handle_signal, &old_sigterm, add);
-       uloop_install_handler(SIGQUIT, uloop_handle_signal, &old_sigterm, add);
+       uloop_install_handler(SIGQUIT, uloop_handle_signal, &old_sigquit, add);
        uloop_install_handler(SIGCHLD, uloop_handle_signal, &old_sigchld, add);
 
        uloop_ignore_signal(SIGPIPE, add);