BSD 4_1c_2 release
[unix-history] / usr / src / bin / sh / fault.c
/* fault.c 4.1 82/05/07 */
#
/*
* UNIX shell
*
* S. R. Bourne
* Bell Telephone Laboratories
*
*/
#include "defs.h"
STRING trapcom[MAXTRAP];
BOOL trapflg[MAXTRAP];
/* ======== fault handling routines ======== */
VOID fault(sig)
REG INT sig;
{
REG INT flag;
signal(sig,fault);
IF sig==MEMF
THEN IF setbrk(brkincr) == -1
THEN error(nospace);
FI
ELIF sig==ALARM
THEN IF flags&waiting
THEN done();
FI
ELSE flag = (trapcom[sig] ? TRAPSET : SIGSET);
trapnote |= flag;
trapflg[sig] |= flag;
FI
}
stdsigs()
{
ignsig(QUIT);
getsig(INTR);
getsig(MEMF);
getsig(ALARM);
}
ignsig(n)
{
REG INT s, i;
IF (s=signal(i=n,1)&01)==0
THEN trapflg[i] |= SIGMOD;
FI
return(s);
}
getsig(n)
{
REG INT i;
IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0
THEN signal(i,fault);
FI
}
oldsigs()
{
REG INT i;
REG STRING t;
i=MAXTRAP;
WHILE i--
DO t=trapcom[i];
IF t==0 ORF *t
THEN clrsig(i);
FI
trapflg[i]=0;
OD
trapnote=0;
}
clrsig(i)
INT i;
{
free(trapcom[i]); trapcom[i]=0;
IF trapflg[i]&SIGMOD
THEN signal(i,fault);
trapflg[i] &= ~SIGMOD;
FI
}
chktrap()
{
/* check for traps */
REG INT i=MAXTRAP;
REG STRING t;
trapnote &= ~TRAPSET;
WHILE --i
DO IF trapflg[i]&TRAPSET
THEN trapflg[i] &= ~TRAPSET;
IF t=trapcom[i]
THEN INT savxit=exitval;
execexp(t,0);
exitval=savxit; exitset();
FI
FI
OD
}