no more pagsiz.h
[unix-history] / usr / src / old / sh / fault.c
CommitLineData
13d82c60
KM
1/* fault.c 4.1 82/05/07 */
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];
17
18/* ======== fault handling routines ======== */
19
20
21VOID fault(sig)
22 REG INT sig;
23{
24 REG INT flag;
25
26 signal(sig,fault);
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
39}
40
41stdsigs()
42{
43 ignsig(QUIT);
44 getsig(INTR);
45 getsig(MEMF);
46 getsig(ALARM);
47}
48
49ignsig(n)
50{
51 REG INT s, i;
52
53 IF (s=signal(i=n,1)&01)==0
54 THEN trapflg[i] |= SIGMOD;
55 FI
56 return(s);
57}
58
59getsig(n)
60{
61 REG INT i;
62
63 IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0
64 THEN signal(i,fault);
65 FI
66}
67
68oldsigs()
69{
70 REG INT i;
71 REG STRING t;
72
73 i=MAXTRAP;
74 WHILE i--
75 DO t=trapcom[i];
76 IF t==0 ORF *t
77 THEN clrsig(i);
78 FI
79 trapflg[i]=0;
80 OD
81 trapnote=0;
82}
83
84clrsig(i)
85 INT i;
86{
87 free(trapcom[i]); trapcom[i]=0;
88 IF trapflg[i]&SIGMOD
89 THEN signal(i,fault);
90 trapflg[i] &= ~SIGMOD;
91 FI
92}
93
94chktrap()
95{
96 /* check for traps */
97 REG INT i=MAXTRAP;
98 REG STRING t;
99
100 trapnote &= ~TRAPSET;
101 WHILE --i
102 DO IF trapflg[i]&TRAPSET
103 THEN trapflg[i] &= ~TRAPSET;
104 IF t=trapcom[i]
105 THEN INT savxit=exitval;
106 execexp(t,0);
107 exitval=savxit; exitset();
108 FI
109 FI
110 OD
111}