From f014cdaf037082c87ff5e1ccaa91e02a98d9867b Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Mon, 12 Apr 2010 23:16:42 +0300 Subject: [PATCH] Improve signal/sigaction wrapper --- bin/override.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/bin/override.c b/bin/override.c index 60bee0ce3e..a8b0754887 100644 --- a/bin/override.c +++ b/bin/override.c @@ -173,26 +173,51 @@ int rand (void) /** Signals **/ #include +static bool blocked_signal (int num) +{ + switch (num) + { + case SIGINT: + case SIGHUP: + case SIGQUIT: + case SIGTERM: + case SIGPIPE: + case SIGCHLD: + return true; + } + return false; +} + void (*signal (int signum, void (*handler) (int))) (int) { if (override) { - const char *msg = "Error"; - - if ((signum == SIGPIPE && handler == SIG_IGN) - || (signum != SIGPIPE && handler == SIG_DFL)) - /* Same settings we already use */ - msg = "Warning"; - LOG(msg, "%d, %p", signum, handler); + if (handler != SIG_IGN && handler != SIG_DFL) + goto error; + if (!blocked_signal (signum)) + goto error; + /* For our blocked signals, the handler won't matter much... */ + LOG("Warning", "%d, %p", signum, handler); } return CALL(signal, signum, handler); +error: + LOG("Blocked", "%d, %p", signum, handler); + return SIG_DFL; } int sigaction (int signum, const struct sigaction *act, struct sigaction *old) { - if (act != NULL) - LOG("Error", "%d, %p, %p", signum, act, old); + if (override && act != NULL) + { + if ((act->sa_flags & SA_SIGINFO) + || (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL)) + goto error; + LOG("Warning", "%d, %p, %p", signum, act, old); + } return CALL(sigaction, signum, act, old); +error: + LOG("Blocked", "%d, %p, %p", signum, act, old); + return -1; } -- 2.39.2