X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=uloop-epoll.c;h=2d1c4a723dbeabb92bd78362855faada1ff91bc2;hp=46fa101fd786b5a700267bc1c7de7da09b07f42c;hb=93be9309b86d07eaa3b83ad07d380ca3092b29a1;hpb=004be15be4f3a8fb0cb781769338f91d0347dafc 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);