|
|
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(SIGPIPE);
110: setsig(SIGALRM);
111: setsig(SIGTERM);
112: #ifndef SYSV
113: setsig(SIGSTOP);
114: setsig(SIGTSTP);
115: setsig(SIGCONT);
116: setsig(SIGTTIN);
117: setsig(SIGTTOU);
118: setsig(SIGXCPU);
119: setsig(SIGXFSZ);
120: #endif
121: }
122:
123: ignsig(n)
124: {
125: register int s;
126:
127: if ((s = (signal(n, SIG_IGN) == SIG_IGN)) == 0)
128: {
129: trapflg[n] |= SIGMOD;
130: }
131: return(s);
132: }
133:
134: getsig(n)
135: {
136: register int i;
137:
138: if (trapflg[i = n] & SIGMOD || ignsig(i) == 0)
139: signal(i, fault);
140: }
141:
142:
143: setsig(n)
144: {
145: register int i;
146:
147: if (ignsig(i = n) == 0)
148: signal(i, sigval[i]);
149: }
150:
151: oldsigs()
152: {
153: register int i;
154: register char *t;
155:
156: i = MAXTRAP;
157: while (i--)
158: {
159: t = trapcom[i];
160: if (t == 0 || *t)
161: clrsig(i);
162: trapflg[i] = 0;
163: }
164: trapnote = 0;
165: }
166:
167: clrsig(i)
168: int i;
169: {
170: shfree(trapcom[i]);
171: trapcom[i] = 0;
172: if (trapflg[i] & SIGMOD)
173: {
174: trapflg[i] &= ~SIGMOD;
175: signal(i, sigval[i]);
176: }
177: }
178:
179: /*
180: * check for traps
181: */
182: chktrap()
183: {
184: register int i = MAXTRAP;
185: register char *t;
186:
187: trapnote &= ~TRAPSET;
188: while (--i)
189: {
190: if (trapflg[i] & TRAPSET)
191: {
192: trapflg[i] &= ~TRAPSET;
193: if (t = trapcom[i])
194: {
195: int savxit = exitval;
196:
197: execexp(t, 0);
198: exitval = savxit;
199: exitset();
200: }
201: }
202: }
203: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.