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