|
|
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(SIGILL); ! 110: setsig(SIGTRAP); ! 111: setsig(SIGIOT); ! 112: setsig(SIGEMT); ! 113: setsig(SIGFPE); ! 114: setsig(SIGBUS); ! 115: setsig(SIGSEGV); ! 116: setsig(SIGSYS); ! 117: setsig(SIGPIPE); ! 118: setsig(SIGALRM); ! 119: setsig(SIGTERM); ! 120: #ifndef SYSV ! 121: setsig(SIGSTOP); ! 122: setsig(SIGTSTP); ! 123: setsig(SIGCONT); ! 124: setsig(SIGTTIN); ! 125: setsig(SIGTTOU); ! 126: setsig(SIGXCPU); ! 127: setsig(SIGXFSZ); ! 128: #endif ! 129: } ! 130: ! 131: ignsig(n) ! 132: { ! 133: register int s; ! 134: ! 135: if ((s = (signal(n, SIG_IGN) == SIG_IGN)) == 0) ! 136: { ! 137: trapflg[n] |= SIGMOD; ! 138: } ! 139: return(s); ! 140: } ! 141: ! 142: getsig(n) ! 143: { ! 144: register int i; ! 145: ! 146: if (trapflg[i = n] & SIGMOD || ignsig(i) == 0) ! 147: signal(i, fault); ! 148: } ! 149: ! 150: ! 151: setsig(n) ! 152: { ! 153: register int i; ! 154: ! 155: if (ignsig(i = n) == 0) ! 156: signal(i, sigval[i]); ! 157: } ! 158: ! 159: oldsigs() ! 160: { ! 161: register int i; ! 162: register char *t; ! 163: ! 164: i = MAXTRAP; ! 165: while (i--) ! 166: { ! 167: t = trapcom[i]; ! 168: if (t == 0 || *t) ! 169: clrsig(i); ! 170: trapflg[i] = 0; ! 171: } ! 172: trapnote = 0; ! 173: } ! 174: ! 175: clrsig(i) ! 176: int i; ! 177: { ! 178: shfree(trapcom[i]); ! 179: trapcom[i] = 0; ! 180: if (trapflg[i] & SIGMOD) ! 181: { ! 182: trapflg[i] &= ~SIGMOD; ! 183: signal(i, sigval[i]); ! 184: } ! 185: } ! 186: ! 187: /* ! 188: * check for traps ! 189: */ ! 190: chktrap() ! 191: { ! 192: register int i = MAXTRAP; ! 193: register char *t; ! 194: ! 195: trapnote &= ~TRAPSET; ! 196: while (--i) ! 197: { ! 198: if (trapflg[i] & TRAPSET) ! 199: { ! 200: trapflg[i] &= ~TRAPSET; ! 201: if (t = trapcom[i]) ! 202: { ! 203: int savxit = exitval; ! 204: ! 205: execexp(t, 0); ! 206: exitval = savxit; ! 207: exitset(); ! 208: } ! 209: } ! 210: } ! 211: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.