Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2016-05-17 14:59:05 +0300
committerFelix Fietkau <nbd@nbd.name>2016-05-17 14:59:05 +0300
commit93be9309b86d07eaa3b83ad07d380ca3092b29a1 (patch)
treec55000f81ba1b06d624f366468a8e660e4604ec9 /uloop-epoll.c
parent004be15be4f3a8fb0cb781769338f91d0347dafc (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.c20
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);