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