X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/1691e80890e5d8ba258c51c214a3e91880e1db2b..e6917522:/sbr/signals.c?ds=sidebyside diff --git a/sbr/signals.c b/sbr/signals.c index a8c12d62..7645c1cc 100644 --- a/sbr/signals.c +++ b/sbr/signals.c @@ -2,40 +2,16 @@ /* * 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 #include - -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); /* @@ -43,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; @@ -67,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 } @@ -82,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) @@ -105,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; +}