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:
authorMichel Stam <m.stam@fugro.nl>2014-10-13 18:14:28 +0400
committerJohn Crispin <blogic@openwrt.org>2014-10-12 15:21:20 +0400
commit464e05e33b4c086be0bd932760a41ddcf9373187 (patch)
treec285e524308c2834ad8d11837751ec6ec3596dfe /uloop.c
parent213122a0830e1ba3a05013b5cb5d17c49af13282 (diff)
uloop: Do not override signal handlers not installed by us
Signed-off-by: Michel Stam <m.stam@fugro.nl>
Diffstat (limited to 'uloop.c')
-rw-r--r--uloop.c35
1 files changed, 22 insertions, 13 deletions
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)