1 /* fault.c 4.1 82/05/07 */ 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 18 /* ======== fault handling routines ======== */ 19 20 21 VOID fault(sig) 22 REG INT sig; 23 { 24 REG INT flag; 25 26 signal(sig,fault); 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 } 40 41 stdsigs() 42 { 43 ignsig(QUIT); 44 getsig(INTR); 45 getsig(MEMF); 46 getsig(ALARM); 47 } 48 49 ignsig(n) 50 { 51 REG INT s, i; 52 53 IF (s=signal(i=n,1)&01)==0 54 THEN trapflg[i] |= SIGMOD; 55 FI 56 return(s); 57 } 58 59 getsig(n) 60 { 61 REG INT i; 62 63 IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0 64 THEN signal(i,fault); 65 FI 66 } 67 68 oldsigs() 69 { 70 REG INT i; 71 REG STRING t; 72 73 i=MAXTRAP; 74 WHILE i-- 75 DO t=trapcom[i]; 76 IF t==0 ORF *t 77 THEN clrsig(i); 78 FI 79 trapflg[i]=0; 80 OD 81 trapnote=0; 82 } 83 84 clrsig(i) 85 INT i; 86 { 87 free(trapcom[i]); trapcom[i]=0; 88 IF trapflg[i]&SIGMOD 89 THEN signal(i,fault); 90 trapflg[i] &= ~SIGMOD; 91 FI 92 } 93 94 chktrap() 95 { 96 /* check for traps */ 97 REG INT i=MAXTRAP; 98 REG STRING t; 99 100 trapnote &= ~TRAPSET; 101 WHILE --i 102 DO IF trapflg[i]&TRAPSET 103 THEN trapflg[i] &= ~TRAPSET; 104 IF t=trapcom[i] 105 THEN INT savxit=exitval; 106 execexp(t,0); 107 exitval=savxit; exitset(); 108 FI 109 FI 110 OD 111 } 112