Research V7 development
[unix-history] / usr / src / cmd / sh / fault.c
CommitLineData
7c658c65
B
1#
2/*
3 * UNIX shell
4 *
5 * S. R. Bourne
6 * Bell Telephone Laboratories
7 *
8 */
9
10#include "defs.h"
11
12
13STRING trapcom[MAXTRAP];
14BOOL trapflg[MAXTRAP];
15
16/* ======== fault handling routines ======== */
17
18
19VOID fault(sig)
20 REG INT sig;
21{
22 REG INT flag;
23
24 signal(sig,fault);
25 IF sig==MEMF
26 THEN IF setbrk(brkincr) == -1
27 THEN error(nospace);
28 FI
29 ELIF sig==ALARM
30 THEN IF flags&waiting
31 THEN done();
32 FI
33 ELSE flag = (trapcom[sig] ? TRAPSET : SIGSET);
34 trapnote |= flag;
35 trapflg[sig] |= flag;
36 FI
37}
38
39stdsigs()
40{
41 ignsig(QUIT);
42 getsig(INTR);
43 getsig(MEMF);
44 getsig(ALARM);
45}
46
47ignsig(n)
48{
49 REG INT s, i;
50
51 IF (s=signal(i=n,1)&01)==0
52 THEN trapflg[i] |= SIGMOD;
53 FI
54 return(s);
55}
56
57getsig(n)
58{
59 REG INT i;
60
61 IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0
62 THEN signal(i,fault);
63 FI
64}
65
66oldsigs()
67{
68 REG INT i;
69 REG STRING t;
70
71 i=MAXTRAP;
72 WHILE i--
73 DO t=trapcom[i];
74 IF t==0 ORF *t
75 THEN clrsig(i);
76 FI
77 trapflg[i]=0;
78 OD
79 trapnote=0;
80}
81
82clrsig(i)
83 INT i;
84{
85 free(trapcom[i]); trapcom[i]=0;
86 IF trapflg[i]&SIGMOD
87 THEN signal(i,fault);
88 trapflg[i] &= ~SIGMOD;
89 FI
90}
91
92chktrap()
93{
94 /* check for traps */
95 REG INT i=MAXTRAP;
96 REG STRING t;
97
98 trapnote &= ~TRAPSET;
99 WHILE --i
100 DO IF trapflg[i]&TRAPSET
101 THEN trapflg[i] &= ~TRAPSET;
102 IF t=trapcom[i]
103 THEN INT savxit=exitval;
104 execexp(t,0);
105 exitval=savxit; exitset();
106 FI
107 FI
108 OD
109}