]> mj.ucw.cz Git - libucw.git/commitdiff
sighandler.c:
authorRobert Spalek <robert@ucw.cz>
Thu, 24 Jun 2004 12:29:44 +0000 (12:29 +0000)
committerRobert Spalek <robert@ucw.cz>
Thu, 24 Jun 2004 12:29:44 +0000 (12:29 +0000)
- 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

lib/lib.h
lib/sighandler.c

index 39ee0de69874dce4cb3939bb03e58e342c387187..99ee39ccdf64cd94b4c04b78addc03344197d0f0 100644 (file)
--- 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
index 00bd81ff7fc11125101aaae74202d38cda4cbdd5..3b9dfa0cff7d4792637863480ec9251a651d1a7e 100644 (file)
@@ -7,21 +7,28 @@
 #include "lib/lib.h"
 
 #include <stdlib.h>
+#include <string.h>
 #include <signal.h>
 
-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");
 }