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