|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.