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