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