V10/cmd/spitbol/sigtrap.c
#include <signal.h>
static char status [NSIG];
/* status codes */
#define NONE 0
#define UNCAUGHT 1
#define CAUGHT 2
static void
trap (sig)
{
if (sig >= 0 && sig < NSIG)
status[sig] = CAUGHT;
signal (sig, trap);
}
int
sigtrap (sig)
register int sig;
{
register int cancel = 0, r = NONE;
if (sig < 0) {
cancel++;
sig = -sig;
}
if (sig > 0 && sig < NSIG) {
r = status[sig];
if (cancel) {
status[sig] = NONE;
if (r != NONE && signal (sig, SIG_IGN) != SIG_IGN)
signal (sig, SIG_DFL);
} else {
status[sig] = UNCAUGHT;
if (r == NONE && signal (sig, SIG_IGN) != SIG_IGN)
signal (sig, trap);
}
}
return r;
}