From: Robert Spalek Date: Thu, 24 Jun 2004 12:29:44 +0000 (+0000) Subject: sighandler.c: X-Git-Tag: holmes-import~1037 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=dfcd26e4f180ac3501f1b0a88b56dd1620af6299;p=libucw.git sighandler.c: - used sigaction() instead of signal() - no need to re-register the signal handler now :-) - renamed my_sighandler_t to sh_sighandler_t and changed the interface --- diff --git a/lib/lib.h b/lib/lib.h index 39ee0de6..99ee39cc 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -208,9 +208,12 @@ int careful_read(int fd, void *buf, int len); int careful_write(int fd, void *buf, int len); /* sighandler.c */ -typedef void (*my_sighandler_t)(void); -extern my_sighandler_t signal_handler[]; -void *handle_signal(int signum); +typedef int (*sh_sighandler_t)(int); + /* obtains signum, returns nonzero if abort() should be called */ +extern sh_sighandler_t signal_handler[]; + +struct sigaction; +void handle_signal(int signum, struct sigaction *oldact); #endif diff --git a/lib/sighandler.c b/lib/sighandler.c index 00bd81ff..3b9dfa0c 100644 --- a/lib/sighandler.c +++ b/lib/sighandler.c @@ -7,21 +7,28 @@ #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; + if (sigaction(signum, &act, oldact) < 0) + die("sigaction: %m"); }