|
|
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 == SIGSEGV) ! 90: { ! 91: if (setbrk(brkincr) == -1) ! 92: error(nospace); ! 93: } ! 94: else if (sig == SIGALRM) ! 95: { ! 96: if (flags & waiting) ! 97: done(); ! 98: } ! 99: else ! 100: { ! 101: flag = (trapcom[sig] ? TRAPSET : SIGSET); ! 102: trapnote |= flag; ! 103: trapflg[sig] |= flag; ! 104: if (sig == SIGINT) ! 105: wasintr++; ! 106: } ! 107: } ! 108: ! 109: stdsigs() ! 110: { ! 111: setsig(SIGHUP); ! 112: setsig(SIGINT); ! 113: ignsig(SIGQUIT); ! 114: setsig(SIGILL); ! 115: setsig(SIGTRAP); ! 116: setsig(SIGIOT); ! 117: setsig(SIGEMT); ! 118: setsig(SIGFPE); ! 119: setsig(SIGBUS); ! 120: signal(SIGSEGV, fault); ! 121: setsig(SIGSYS); ! 122: setsig(SIGPIPE); ! 123: setsig(SIGALRM); ! 124: setsig(SIGTERM); ! 125: #ifndef SYSV ! 126: setsig(SIGSTOP); ! 127: setsig(SIGTSTP); ! 128: setsig(SIGCONT); ! 129: setsig(SIGTTIN); ! 130: setsig(SIGTTOU); ! 131: setsig(SIGXCPU); ! 132: setsig(SIGXFSZ); ! 133: #endif ! 134: } ! 135: ! 136: ignsig(n) ! 137: { ! 138: register int s, i; ! 139: ! 140: if ((i = n) == SIGSEGV) ! 141: { ! 142: clrsig(i); ! 143: failed(badtrap, "cannot trap 11"); ! 144: } ! 145: else if ((s = (signal(i, SIG_IGN) == SIG_IGN)) == 0) ! 146: { ! 147: trapflg[i] |= SIGMOD; ! 148: } ! 149: return(s); ! 150: } ! 151: ! 152: getsig(n) ! 153: { ! 154: register int i; ! 155: ! 156: if (trapflg[i = n] & SIGMOD || ignsig(i) == 0) ! 157: signal(i, fault); ! 158: } ! 159: ! 160: ! 161: setsig(n) ! 162: { ! 163: register int i; ! 164: ! 165: if (ignsig(i = n) == 0) ! 166: signal(i, sigval[i]); ! 167: } ! 168: ! 169: oldsigs() ! 170: { ! 171: register int i; ! 172: register char *t; ! 173: ! 174: i = MAXTRAP; ! 175: while (i--) ! 176: { ! 177: t = trapcom[i]; ! 178: if (t == 0 || *t) ! 179: clrsig(i); ! 180: trapflg[i] = 0; ! 181: } ! 182: trapnote = 0; ! 183: } ! 184: ! 185: clrsig(i) ! 186: int i; ! 187: { ! 188: free(trapcom[i]); ! 189: trapcom[i] = 0; ! 190: if (trapflg[i] & SIGMOD) ! 191: { ! 192: trapflg[i] &= ~SIGMOD; ! 193: signal(i, sigval[i]); ! 194: } ! 195: } ! 196: ! 197: /* ! 198: * check for traps ! 199: */ ! 200: chktrap() ! 201: { ! 202: register int i = MAXTRAP; ! 203: register char *t; ! 204: ! 205: trapnote &= ~TRAPSET; ! 206: while (--i) ! 207: { ! 208: if (trapflg[i] & TRAPSET) ! 209: { ! 210: trapflg[i] &= ~TRAPSET; ! 211: if (t = trapcom[i]) ! 212: { ! 213: int savxit = exitval; ! 214: ! 215: execexp(t, 0); ! 216: exitval = savxit; ! 217: exitset(); ! 218: } ! 219: } ! 220: } ! 221: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.