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;
}