]> mj.ucw.cz Git - libucw.git/blobdiff - lib/sighandler.c
taken much faster implementation of Adler32 and put into a separate source-code
[libucw.git] / lib / sighandler.c
index 00bd81ff7fc11125101aaae74202d38cda4cbdd5..d6727de8e2118c96b3e48a7ee6a9c7e0336af912 100644 (file)
@@ -7,21 +7,36 @@
 #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;
+  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");
 }