diff options
author | Felix Fietkau <nbd@nbd.name> | 2016-05-17 14:59:05 +0300 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2016-05-17 14:59:05 +0300 |
commit | 93be9309b86d07eaa3b83ad07d380ca3092b29a1 (patch) | |
tree | c55000f81ba1b06d624f366468a8e660e4604ec9 /uloop-epoll.c | |
parent | 004be15be4f3a8fb0cb781769338f91d0347dafc (diff) |
uloop: add back support for overriding signal handlers when signalfd is in use
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'uloop-epoll.c')
-rw-r--r-- | uloop-epoll.c | 20 |
1 files changed, 18 insertions, 2 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); |