X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsighandler.c;h=d6727de8e2118c96b3e48a7ee6a9c7e0336af912;hb=0d56b467cc2184f00a4e390f95596704d819dfa3;hp=00bd81ff7fc11125101aaae74202d38cda4cbdd5;hpb=f5cb619eb24ba3501a1b1a1c3edd93689714b1f6;p=libucw.git diff --git a/lib/sighandler.c b/lib/sighandler.c index 00bd81ff..d6727de8 100644 --- a/lib/sighandler.c +++ b/lib/sighandler.c @@ -7,21 +7,36 @@ #include "lib/lib.h" #include +#include #include -my_sighandler_t signal_handler[_NSIG]; +sh_sighandler_t signal_handler[_NSIG]; static void signal_handler_internal(int sig) { - signal(sig, signal_handler_internal); if (signal_handler[sig]) - signal_handler[sig](); + { + if (!signal_handler[sig](sig)) + return; + } abort(); } -void * -handle_signal(int signum) +void +handle_signal(int signum, struct sigaction *oldact) { - return signal(signum, signal_handler_internal); + struct sigaction act; + bzero(&act, sizeof(act)); + act.sa_handler = signal_handler_internal; + act.sa_flags = SA_NOMASK; + if (sigaction(signum, &act, oldact) < 0) + die("sigaction: %m"); +} + +void +unhandle_signal(int signum, struct sigaction *oldact) +{ + if (sigaction(signum, oldact, NULL) < 0) + die("sigaction: %m"); }