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