From 93be9309b86d07eaa3b83ad07d380ca3092b29a1 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 17 May 2016 13:59:05 +0200 Subject: [PATCH] uloop: add back support for overriding signal handlers when signalfd is in use Signed-off-by: Felix Fietkau --- uloop-epoll.c | 20 ++++++++++++++++++-- uloop.c | 7 +++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/uloop-epoll.c b/uloop-epoll.c index 46fa101..2d1c4a7 100644 --- a/uloop-epoll.c +++ b/uloop-epoll.c @@ -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 45f7c5d..af84737 100644 --- 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);