|
|
1.1 ! root 1: /* @(#)fault.c 1.5 */ ! 2: /* ! 3: * UNIX shell ! 4: * ! 5: * Bell Telephone Laboratories ! 6: * ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: ! 11: extern int done(); ! 12: ! 13: char *trapcom[MAXTRAP]; ! 14: BOOL trapflg[MAXTRAP] = ! 15: { ! 16: 0, ! 17: 0, /* hangup */ ! 18: 0, /* interrupt */ ! 19: 0, /* quit */ ! 20: 0, /* illegal instr */ ! 21: 0, /* trace trap */ ! 22: 0, /* IOT */ ! 23: 0, /* EMT */ ! 24: 0, /* float pt. exp */ ! 25: 0, /* kill */ ! 26: 0, /* bus error */ ! 27: 0, /* memory faults */ ! 28: 0, /* bad sys call */ ! 29: 0, /* bad pipe call */ ! 30: 0, /* alarm */ ! 31: 0, /* software termination */ ! 32: 0, /* unassigned */ ! 33: #ifndef SYSV ! 34: 0, /* non-tty stop signal */ ! 35: 0, /* tty stop signal */ ! 36: 0, /* continue */ ! 37: 0, /* death of child */ ! 38: 0, /* tty input */ ! 39: 0, /* tty output */ ! 40: 0, /* lintrup (berkeley weirdness) */ ! 41: 0, /* exceeded cpu limit */ ! 42: 0, /* exceeded file limit */ ! 43: #endif ! 44: }; ! 45: ! 46: int (*(sigval[]))() = ! 47: { ! 48: 0, ! 49: done, ! 50: fault, ! 51: fault, ! 52: /* temporary hack */ ! 53: /*done,*/0, ! 54: done, ! 55: done, ! 56: done, ! 57: done, ! 58: 0, ! 59: done, ! 60: done, ! 61: done, ! 62: done, ! 63: fault, ! 64: fault, ! 65: done, ! 66: 0, ! 67: #ifndef SYSV ! 68: 0, ! 69: 0, ! 70: 0, ! 71: 0, ! 72: 0, ! 73: 0, ! 74: 0, ! 75: 0, ! 76: 0 ! 77: #endif ! 78: }; ! 79: ! 80: /* ======== fault handling routines ======== */ ! 81: ! 82: ! 83: fault(sig) ! 84: register int sig; ! 85: { ! 86: register int flag; ! 87: ! 88: signal(sig, fault); ! 89: if (sig == SIGALRM) ! 90: { ! 91: if (flags & waiting) ! 92: done(); ! 93: } ! 94: else ! 95: { ! 96: flag = (trapcom[sig] ? TRAPSET : SIGSET); ! 97: trapnote |= flag; ! 98: trapflg[sig] |= flag; ! 99: if (sig == SIGINT) ! 100: wasintr++; ! 101: } ! 102: } ! 103: ! 104: stdsigs() ! 105: { ! 106: setsig(SIGHUP); ! 107: setsig(SIGINT); ! 108: ignsig(SIGQUIT); ! 109: setsig(SIGPIPE); ! 110: setsig(SIGALRM); ! 111: setsig(SIGTERM); ! 112: #ifndef SYSV ! 113: setsig(SIGSTOP); ! 114: setsig(SIGTSTP); ! 115: setsig(SIGCONT); ! 116: setsig(SIGTTIN); ! 117: setsig(SIGTTOU); ! 118: setsig(SIGXCPU); ! 119: setsig(SIGXFSZ); ! 120: #endif ! 121: } ! 122: ! 123: ignsig(n) ! 124: { ! 125: register int s; ! 126: ! 127: if ((s = (signal(n, SIG_IGN) == SIG_IGN)) == 0) ! 128: { ! 129: trapflg[n] |= SIGMOD; ! 130: } ! 131: return(s); ! 132: } ! 133: ! 134: getsig(n) ! 135: { ! 136: register int i; ! 137: ! 138: if (trapflg[i = n] & SIGMOD || ignsig(i) == 0) ! 139: signal(i, fault); ! 140: } ! 141: ! 142: ! 143: setsig(n) ! 144: { ! 145: register int i; ! 146: ! 147: if (ignsig(i = n) == 0) ! 148: signal(i, sigval[i]); ! 149: } ! 150: ! 151: oldsigs() ! 152: { ! 153: register int i; ! 154: register char *t; ! 155: ! 156: i = MAXTRAP; ! 157: while (i--) ! 158: { ! 159: t = trapcom[i]; ! 160: if (t == 0 || *t) ! 161: clrsig(i); ! 162: trapflg[i] = 0; ! 163: } ! 164: trapnote = 0; ! 165: } ! 166: ! 167: clrsig(i) ! 168: int i; ! 169: { ! 170: shfree(trapcom[i]); ! 171: trapcom[i] = 0; ! 172: if (trapflg[i] & SIGMOD) ! 173: { ! 174: trapflg[i] &= ~SIGMOD; ! 175: signal(i, sigval[i]); ! 176: } ! 177: } ! 178: ! 179: /* ! 180: * check for traps ! 181: */ ! 182: chktrap() ! 183: { ! 184: register int i = MAXTRAP; ! 185: register char *t; ! 186: ! 187: trapnote &= ~TRAPSET; ! 188: while (--i) ! 189: { ! 190: if (trapflg[i] & TRAPSET) ! 191: { ! 192: trapflg[i] &= ~TRAPSET; ! 193: if (t = trapcom[i]) ! 194: { ! 195: int savxit = exitval; ! 196: ! 197: execexp(t, 0); ! 198: exitval = savxit; ! 199: exitset(); ! 200: } ! 201: } ! 202: } ! 203: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.