|
|
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.