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