1: #ifndef lint 2: static char sccsid[] = "@(#)fault.c 4.3 8/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: }