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