From: Michel Stam Date: Mon, 13 Oct 2014 14:14:28 +0000 (+0200) Subject: uloop: Do not override signal handlers not installed by us X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=464e05e33b4c086be0bd932760a41ddcf9373187;p=oweals%2Flibubox.git uloop: Do not override signal handlers not installed by us Signed-off-by: Michel Stam --- diff --git a/uloop.c b/uloop.c index 9fedcce..9a77ce4 100644 --- a/uloop.c +++ b/uloop.c @@ -558,28 +558,37 @@ static void uloop_sigchld(int signo) do_sigchld = true; } -static void uloop_setup_signals(bool add) +static void uloop_install_handler(int signum, void (*handler)(int), struct sigaction* old, bool add) { - static struct sigaction old_sigint, old_sigchld; struct sigaction s; + struct sigaction *act; - memset(&s, 0, sizeof(struct sigaction)); + act = NULL; + sigaction(signum, NULL, &s); if (add) { - s.sa_handler = uloop_handle_sigint; - s.sa_flags = 0; - } else { - s = old_sigint; + if (s.sa_handler == SIG_DFL) { /* Do not override existing custom signal handlers */ + memcpy(old, &s, sizeof(struct sigaction)); + s.sa_handler = handler; + s.sa_flags = 0; + act = &s; + } + } + else if (s.sa_handler == handler) { /* Do not restore if someone modified our handler */ + act = old; } - sigaction(SIGINT, &s, &old_sigint); + if (act != NULL) + sigaction(signum, act, NULL); +} - if (add) - s.sa_handler = uloop_sigchld; - else - s = old_sigchld; +static void uloop_setup_signals(bool add) +{ + static struct sigaction old_sigint, old_sigchld, old_sigterm; - sigaction(SIGCHLD, &s, &old_sigchld); + uloop_install_handler(SIGINT, uloop_handle_sigint, &old_sigint, add); + uloop_install_handler(SIGTERM, uloop_handle_sigint, &old_sigterm, add); + uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add); } static int uloop_get_next_timeout(struct timeval *tv)