1*6692Smckusick /* fault.c 4.1 82/05/07 */ 2*6692Smckusick 3*6692Smckusick # 4*6692Smckusick /* 5*6692Smckusick * UNIX shell 6*6692Smckusick * 7*6692Smckusick * S. R. Bourne 8*6692Smckusick * Bell Telephone Laboratories 9*6692Smckusick * 10*6692Smckusick */ 11*6692Smckusick 12*6692Smckusick #include "defs.h" 13*6692Smckusick 14*6692Smckusick 15*6692Smckusick STRING trapcom[MAXTRAP]; 16*6692Smckusick BOOL trapflg[MAXTRAP]; 17*6692Smckusick 18*6692Smckusick /* ======== fault handling routines ======== */ 19*6692Smckusick 20*6692Smckusick 21*6692Smckusick VOID fault(sig) 22*6692Smckusick REG INT sig; 23*6692Smckusick { 24*6692Smckusick REG INT flag; 25*6692Smckusick 26*6692Smckusick signal(sig,fault); 27*6692Smckusick IF sig==MEMF 28*6692Smckusick THEN IF setbrk(brkincr) == -1 29*6692Smckusick THEN error(nospace); 30*6692Smckusick FI 31*6692Smckusick ELIF sig==ALARM 32*6692Smckusick THEN IF flags&waiting 33*6692Smckusick THEN done(); 34*6692Smckusick FI 35*6692Smckusick ELSE flag = (trapcom[sig] ? TRAPSET : SIGSET); 36*6692Smckusick trapnote |= flag; 37*6692Smckusick trapflg[sig] |= flag; 38*6692Smckusick FI 39*6692Smckusick } 40*6692Smckusick 41*6692Smckusick stdsigs() 42*6692Smckusick { 43*6692Smckusick ignsig(QUIT); 44*6692Smckusick getsig(INTR); 45*6692Smckusick getsig(MEMF); 46*6692Smckusick getsig(ALARM); 47*6692Smckusick } 48*6692Smckusick 49*6692Smckusick ignsig(n) 50*6692Smckusick { 51*6692Smckusick REG INT s, i; 52*6692Smckusick 53*6692Smckusick IF (s=signal(i=n,1)&01)==0 54*6692Smckusick THEN trapflg[i] |= SIGMOD; 55*6692Smckusick FI 56*6692Smckusick return(s); 57*6692Smckusick } 58*6692Smckusick 59*6692Smckusick getsig(n) 60*6692Smckusick { 61*6692Smckusick REG INT i; 62*6692Smckusick 63*6692Smckusick IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0 64*6692Smckusick THEN signal(i,fault); 65*6692Smckusick FI 66*6692Smckusick } 67*6692Smckusick 68*6692Smckusick oldsigs() 69*6692Smckusick { 70*6692Smckusick REG INT i; 71*6692Smckusick REG STRING t; 72*6692Smckusick 73*6692Smckusick i=MAXTRAP; 74*6692Smckusick WHILE i-- 75*6692Smckusick DO t=trapcom[i]; 76*6692Smckusick IF t==0 ORF *t 77*6692Smckusick THEN clrsig(i); 78*6692Smckusick FI 79*6692Smckusick trapflg[i]=0; 80*6692Smckusick OD 81*6692Smckusick trapnote=0; 82*6692Smckusick } 83*6692Smckusick 84*6692Smckusick clrsig(i) 85*6692Smckusick INT i; 86*6692Smckusick { 87*6692Smckusick free(trapcom[i]); trapcom[i]=0; 88*6692Smckusick IF trapflg[i]&SIGMOD 89*6692Smckusick THEN signal(i,fault); 90*6692Smckusick trapflg[i] &= ~SIGMOD; 91*6692Smckusick FI 92*6692Smckusick } 93*6692Smckusick 94*6692Smckusick chktrap() 95*6692Smckusick { 96*6692Smckusick /* check for traps */ 97*6692Smckusick REG INT i=MAXTRAP; 98*6692Smckusick REG STRING t; 99*6692Smckusick 100*6692Smckusick trapnote &= ~TRAPSET; 101*6692Smckusick WHILE --i 102*6692Smckusick DO IF trapflg[i]&TRAPSET 103*6692Smckusick THEN trapflg[i] &= ~TRAPSET; 104*6692Smckusick IF t=trapcom[i] 105*6692Smckusick THEN INT savxit=exitval; 106*6692Smckusick execexp(t,0); 107*6692Smckusick exitval=savxit; exitset(); 108*6692Smckusick FI 109*6692Smckusick FI 110*6692Smckusick OD 111*6692Smckusick } 112