]> diplodocus.org Git - nmh/blobdiff - sbr/signals.c
Newer versions of Automake want to include the test-driver script,
[nmh] / sbr / signals.c
index 9f5f3792c93dd295db4c9e64061f2458f2380e64..7645c1ccd52e9a6e591dd5d81b12e6be0ff61ddc 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * signals.c -- general signals interface for nmh
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
 #include <h/mh.h>
 #include <h/signals.h>
 
-
-int
-SIGPROCMASK (int how, const sigset_t *set, sigset_t *oset)
-{
-#ifdef POSIX_SIGNALS
-    return sigprocmask(how, set, oset);
-#else
-# ifdef BSD_SIGNALS
-    switch(how) {
-    case SIG_BLOCK:
-       *oset = sigblock(*set);
-       break;
-    case SIG_UNBLOCK:
-       sigfillset(*oset);
-       *oset = sigsetmask(*oset);
-       sigsetmask(*oset & ~(*set));
-       break;
-    case SIG_SETMASK:
-       *oset = sigsetmask(*set);
-       break;
-    default:
-       adios(NULL, "unknown flag in SIGPROCMASK");
-       break;
-    }
-    return 0;
-# endif
-#endif
-}
+/* sbr/m_mktemp.c */
+extern void remove_registered_files(int);
 
 
 /*
@@ -47,12 +19,14 @@ SIGPROCMASK (int how, const sigset_t *set, sigset_t *oset)
  * signals, if the machine supports them.  Also, (assuming
  * OS support), it restarts interrupted system calls for all
  * signals except SIGALRM.
+ *
+ * Since we are now assuming POSIX signal support everywhere, we always
+ * use reliable signals.
  */
 
 SIGNAL_HANDLER
 SIGNAL (int sig, SIGNAL_HANDLER func)
 {
-#ifdef POSIX_SIGNALS
     struct sigaction act, oact;
 
     act.sa_handler = func;
@@ -71,9 +45,6 @@ SIGNAL (int sig, SIGNAL_HANDLER func)
     if (sigaction(sig, &act, &oact) < 0)
        return (SIG_ERR);
     return (oact.sa_handler);
-#else
-    return signal (sig, func);
-#endif
 }
 
 
@@ -86,7 +57,6 @@ SIGNAL (int sig, SIGNAL_HANDLER func)
 SIGNAL_HANDLER
 SIGNAL2 (int sig, SIGNAL_HANDLER func)
 {
-#ifdef POSIX_SIGNALS
     struct sigaction act, oact;
 
     if (sigaction(sig, NULL, &oact) < 0)
@@ -109,12 +79,32 @@ SIGNAL2 (int sig, SIGNAL_HANDLER func)
            return (SIG_ERR);
     }
     return (oact.sa_handler);
-#else
-    SIGNAL_HANDLER ofunc;
-
-    if ((ofunc = signal (sig, SIG_IGN)) != SIG_IGN)
-       signal (sig, func);
-    return ofunc;
-#endif
 }
 
+
+/*
+ * For use by nmh_init().
+ */
+int
+setup_signal_handlers() {
+    /*
+     * Catch HUP, INT, QUIT, and TERM so that we can clean up tmp
+     * files when the user terminates the process early.  And also a
+     * few other common signals that can be thrown due to bugs, stack
+     * overflow, etc.
+     */
+
+    if (SIGNAL(SIGHUP,  remove_registered_files) == SIG_ERR  ||
+        SIGNAL(SIGINT,  remove_registered_files) == SIG_ERR  ||
+        SIGNAL(SIGQUIT, remove_registered_files) == SIG_ERR  ||
+        SIGNAL(SIGTERM, remove_registered_files) == SIG_ERR  ||
+        SIGNAL(SIGILL,  remove_registered_files) == SIG_ERR  ||
+#       ifdef SIGBUS
+        SIGNAL(SIGBUS,  remove_registered_files) == SIG_ERR  ||
+#       endif
+        SIGNAL(SIGSEGV, remove_registered_files) == SIG_ERR) {
+        return NOTOK;
+    }
+
+    return OK;
+}