|
|
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, /* non-tty stop signal */ ! 33: 0, /* tty stop signal */ ! 34: 0, /* continue */ ! 35: 0, /* death of child */ ! 36: 0, /* tty input */ ! 37: 0, /* tty output */ ! 38: 0, /* lintrup (berkeley weirdness) */ ! 39: 0, /* exceeded cpu limit */ ! 40: 0, /* exceeded file limit */ ! 41: }; ! 42: ! 43: int (*(sigval[]))() = ! 44: { ! 45: 0, ! 46: done, ! 47: fault, ! 48: fault, ! 49: /* temporary hack */ ! 50: /*done,*/0, ! 51: done, ! 52: done, ! 53: done, ! 54: done, ! 55: 0, ! 56: done, ! 57: done, ! 58: done, ! 59: done, ! 60: fault, ! 61: fault, ! 62: done, ! 63: done, ! 64: done, ! 65: done, ! 66: done, ! 67: done, ! 68: done, ! 69: done, ! 70: done, ! 71: done ! 72: }; ! 73: ! 74: /* ======== fault handling routines ======== */ ! 75: ! 76: ! 77: fault(sig) ! 78: register int sig; ! 79: { ! 80: register int flag; ! 81: ! 82: signal(sig, fault); ! 83: if (sig == SIGSEGV) ! 84: { ! 85: if (setbrk(brkincr) == -1) ! 86: error(nospace); ! 87: } ! 88: else if (sig == SIGALRM) ! 89: { ! 90: if (flags & waiting) ! 91: done(); ! 92: } ! 93: else ! 94: { ! 95: flag = (trapcom[sig] ? TRAPSET : SIGSET); ! 96: trapnote |= flag; ! 97: trapflg[sig] |= flag; ! 98: if (sig == SIGINT) ! 99: wasintr++; ! 100: } ! 101: } ! 102: ! 103: stdsigs() ! 104: { ! 105: setsig(SIGHUP); ! 106: setsig(SIGINT); ! 107: ignsig(SIGQUIT); ! 108: setsig(SIGILL); ! 109: setsig(SIGTRAP); ! 110: setsig(SIGIOT); ! 111: setsig(SIGEMT); ! 112: setsig(SIGFPE); ! 113: setsig(SIGBUS); ! 114: signal(SIGSEGV, fault); ! 115: setsig(SIGSYS); ! 116: setsig(SIGPIPE); ! 117: setsig(SIGALRM); ! 118: setsig(SIGTERM); ! 119: setsig(SIGSTOP); ! 120: setsig(SIGTSTP); ! 121: setsig(SIGCONT); ! 122: setsig(SIGTTIN); ! 123: setsig(SIGTTOU); ! 124: setsig(SIGXCPU); ! 125: setsig(SIGXFSZ); ! 126: } ! 127: ! 128: ignsig(n) ! 129: { ! 130: register int s, i; ! 131: ! 132: if ((i = n) == SIGSEGV) ! 133: { ! 134: clrsig(i); ! 135: failed(badtrap, "cannot trap 11"); ! 136: } ! 137: else if ((s = (signal(i, SIG_IGN) == SIG_IGN)) == 0) ! 138: { ! 139: trapflg[i] |= SIGMOD; ! 140: } ! 141: return(s); ! 142: } ! 143: ! 144: getsig(n) ! 145: { ! 146: register int i; ! 147: ! 148: if (trapflg[i = n] & SIGMOD || ignsig(i) == 0) ! 149: signal(i, fault); ! 150: } ! 151: ! 152: ! 153: setsig(n) ! 154: { ! 155: register int i; ! 156: ! 157: if (ignsig(i = n) == 0) ! 158: signal(i, sigval[i]); ! 159: } ! 160: ! 161: oldsigs() ! 162: { ! 163: register int i; ! 164: register char *t; ! 165: ! 166: i = MAXTRAP; ! 167: while (i--) ! 168: { ! 169: t = trapcom[i]; ! 170: if (t == 0 || *t) ! 171: clrsig(i); ! 172: trapflg[i] = 0; ! 173: } ! 174: trapnote = 0; ! 175: } ! 176: ! 177: clrsig(i) ! 178: int i; ! 179: { ! 180: free(trapcom[i]); ! 181: trapcom[i] = 0; ! 182: if (trapflg[i] & SIGMOD) ! 183: { ! 184: trapflg[i] &= ~SIGMOD; ! 185: signal(i, sigval[i]); ! 186: } ! 187: } ! 188: ! 189: /* ! 190: * check for traps ! 191: */ ! 192: chktrap() ! 193: { ! 194: register int i = MAXTRAP; ! 195: register char *t; ! 196: ! 197: trapnote &= ~TRAPSET; ! 198: while (--i) ! 199: { ! 200: if (trapflg[i] & TRAPSET) ! 201: { ! 202: trapflg[i] &= ~TRAPSET; ! 203: if (t = trapcom[i]) ! 204: { ! 205: int savxit = exitval; ! 206: ! 207: execexp(t, 0); ! 208: exitval = savxit; ! 209: exitset(); ! 210: } ! 211: } ! 212: } ! 213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.