diff options
| author | tim <tim> | 1997-05-14 15:30:41 +0000 |
|---|---|---|
| committer | Toby Goodwin <toby@paccrat.org> | 2015-05-16 21:23:00 +0100 |
| commit | 53cf1b1c1c3f0c2b5067afccc2976b99a574a089 (patch) | |
| tree | a31f167c3779362e29ab377d662052b6257253a8 /signal.c | |
| parent | b87bfedf65c289bf0ee5338c9e10492b70b1e8e0 (diff) | |
Initial revision
Diffstat (limited to 'signal.c')
| -rw-r--r-- | signal.c | 80 |
1 files changed, 0 insertions, 80 deletions
diff --git a/signal.c b/signal.c deleted file mode 100644 index 1c3f812..0000000 --- a/signal.c +++ /dev/null @@ -1,80 +0,0 @@ -/* signal.c: a Hugh-approved signal handler. */ - -#include <signal.h> -#include <setjmp.h> -#include "rc.h" -#include "sigmsgs.h" -#include "jbwrap.h" - -Jbwrap slowbuf; -volatile SIG_ATOMIC_T slow, interrupt_happened; -void (*sighandlers[NUMOFSIGNALS])(int); - -static volatile SIG_ATOMIC_T sigcount, caught[NUMOFSIGNALS]; - -extern void catcher(int s) { - if (caught[s] == 0) { - sigcount++; - caught[s] = 1; - } - signal(s, catcher); - interrupt_happened = TRUE; -#ifndef HAVE_RESTARTABLE_SYSCALLS - if (slow) - longjmp(slowbuf.j, 1); -#endif -} - -extern void sigchk() { - void (*h)(int); - int s, i; - if (sigcount == 0) - return; /* ho hum; life as usual */ - if (forked) - exit(1); /* exit unconditionally on a signal in a child process */ - for (i = 0, s = -1; i < NUMOFSIGNALS; i++) - if (caught[i] != 0) { - s = i; - --sigcount; - caught[s] = 0; - break; - } - if (s == -1) - panic("all-zero sig vector with nonzero sigcount"); - if ((h = sighandlers[s]) == SIG_DFL) - panic("caught signal set to SIG_DFL"); - if (h == SIG_IGN) - panic("caught signal set to SIG_IGN"); - (*h)(s); -} - -extern void (*rc_signal(int s, void (*h)(int)))(int) { - void (*old)(int); - sigchk(); - old = sighandlers[s]; - if (h == SIG_DFL || h == SIG_IGN) { - signal(s, h); - sighandlers[s] = h; - } else { - sighandlers[s] = h; - signal(s, catcher); - } - return old; -} - -extern void initsignal() { - void (*h)(int); - int i; - for (i = 1; i < NUMOFSIGNALS; i++) { - if ((h = signal(i, SIG_DFL)) != SIG_DFL) - signal(i, h); - sighandlers[i] = h; - } - -#ifdef SIGCLD - /* Ensure that SIGCLD is not SIG_IGN. Solaris's rshd does this. :-( */ - h = signal(SIGCLD, SIG_DFL); - if (h != SIG_IGN) - signal(SIGCLD, h); -#endif -} |