1*12992Ssam /* fault.c 4.2 83/06/10 */ 26692Smckusick 36692Smckusick # 46692Smckusick /* 56692Smckusick * UNIX shell 66692Smckusick * 76692Smckusick * S. R. Bourne 86692Smckusick * Bell Telephone Laboratories 96692Smckusick * 106692Smckusick */ 116692Smckusick 126692Smckusick #include "defs.h" 136692Smckusick 146692Smckusick 156692Smckusick STRING trapcom[MAXTRAP]; 166692Smckusick BOOL trapflg[MAXTRAP]; 17*12992Ssam BOOL trapjmp[MAXTRAP]; 186692Smckusick 196692Smckusick /* ======== fault handling routines ======== */ 206692Smckusick 216692Smckusick 226692Smckusick VOID fault(sig) 236692Smckusick REG INT sig; 246692Smckusick { 256692Smckusick REG INT flag; 266692Smckusick 276692Smckusick IF sig==MEMF 286692Smckusick THEN IF setbrk(brkincr) == -1 296692Smckusick THEN error(nospace); 306692Smckusick FI 316692Smckusick ELIF sig==ALARM 326692Smckusick THEN IF flags&waiting 336692Smckusick THEN done(); 346692Smckusick FI 356692Smckusick ELSE flag = (trapcom[sig] ? TRAPSET : SIGSET); 366692Smckusick trapnote |= flag; 376692Smckusick trapflg[sig] |= flag; 386692Smckusick FI 39*12992Ssam IF trapjmp[sig] ANDF sig==INTR 40*12992Ssam THEN 41*12992Ssam trapjmp[sig] = 0; 42*12992Ssam longjmp(INTbuf, 1); 43*12992Ssam FI 446692Smckusick } 456692Smckusick 466692Smckusick stdsigs() 476692Smckusick { 486692Smckusick ignsig(QUIT); 496692Smckusick getsig(INTR); 506692Smckusick getsig(MEMF); 516692Smckusick getsig(ALARM); 526692Smckusick } 536692Smckusick 546692Smckusick ignsig(n) 556692Smckusick { 566692Smckusick REG INT s, i; 576692Smckusick 586692Smckusick IF (s=signal(i=n,1)&01)==0 596692Smckusick THEN trapflg[i] |= SIGMOD; 606692Smckusick FI 616692Smckusick return(s); 626692Smckusick } 636692Smckusick 646692Smckusick getsig(n) 656692Smckusick { 666692Smckusick REG INT i; 676692Smckusick 686692Smckusick IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0 696692Smckusick THEN signal(i,fault); 706692Smckusick FI 716692Smckusick } 726692Smckusick 736692Smckusick oldsigs() 746692Smckusick { 756692Smckusick REG INT i; 766692Smckusick REG STRING t; 776692Smckusick 786692Smckusick i=MAXTRAP; 796692Smckusick WHILE i-- 806692Smckusick DO t=trapcom[i]; 816692Smckusick IF t==0 ORF *t 826692Smckusick THEN clrsig(i); 836692Smckusick FI 846692Smckusick trapflg[i]=0; 856692Smckusick OD 866692Smckusick trapnote=0; 876692Smckusick } 886692Smckusick 896692Smckusick clrsig(i) 906692Smckusick INT i; 916692Smckusick { 926692Smckusick free(trapcom[i]); trapcom[i]=0; 936692Smckusick IF trapflg[i]&SIGMOD 946692Smckusick THEN signal(i,fault); 956692Smckusick trapflg[i] &= ~SIGMOD; 966692Smckusick FI 976692Smckusick } 986692Smckusick 996692Smckusick chktrap() 1006692Smckusick { 1016692Smckusick /* check for traps */ 1026692Smckusick REG INT i=MAXTRAP; 1036692Smckusick REG STRING t; 1046692Smckusick 1056692Smckusick trapnote &= ~TRAPSET; 1066692Smckusick WHILE --i 1076692Smckusick DO IF trapflg[i]&TRAPSET 1086692Smckusick THEN trapflg[i] &= ~TRAPSET; 1096692Smckusick IF t=trapcom[i] 1106692Smckusick THEN INT savxit=exitval; 1116692Smckusick execexp(t,0); 1126692Smckusick exitval=savxit; exitset(); 1136692Smckusick FI 1146692Smckusick FI 1156692Smckusick OD 1166692Smckusick } 117