4.2BSD/usr/src/bin/csh/sh.sig.c
static char *sccsid = "@(#)sh.sig.c 4.1 (Berkeley) 83/06/11";
/*
* C shell - old jobs library sigrelse meant unblock mask
* AND reinstall handler, so we simulate it here.
*/
#include <signal.h>
#define mask(s) (1 << ((s)-1))
static int (*actions[NSIG])();
static int achanged[NSIG];
/*
* Perform action and save handler state.
*/
sigset(s, a)
int s, (*a)();
{
actions[s] = a;
achanged[s] = 0;
return ((int)signal(s, a));
}
/*
* Release any masking of signal and
* reinstall handler in case someone's
* done a sigignore.
*/
sigrelse(s)
int s;
{
if (achanged[s]) {
signal(s, actions[s]);
achanged[s] = 0;
}
sigsetmask(sigblock(0) &~ mask(s));
}
/*
* Ignore signal but maintain state so sigrelse
* will restore handler. We avoid the overhead
* of doing a signal for each sigrelse call by
* marking the signal's action as changed.
*/
sigignore(s)
int s;
{
if (actions[s] != SIG_IGN)
achanged[s] = 1;
signal(s, SIG_IGN);
}