xref: /original-bsd/old/sh/fault.c (revision 264c46cb)
1 /*	fault.c	4.2	83/06/10	*/
2 
3 #
4 /*
5  * UNIX shell
6  *
7  * S. R. Bourne
8  * Bell Telephone Laboratories
9  *
10  */
11 
12 #include	"defs.h"
13 
14 
15 STRING		trapcom[MAXTRAP];
16 BOOL		trapflg[MAXTRAP];
17 BOOL		trapjmp[MAXTRAP];
18 
19 /* ========	fault handling routines	   ======== */
20 
21 
22 VOID	fault(sig)
23 	REG INT		sig;
24 {
25 	REG INT		flag;
26 
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 	IF trapjmp[sig] ANDF sig==INTR
40 	THEN
41 		trapjmp[sig] = 0;
42 		longjmp(INTbuf, 1);
43 	FI
44 }
45 
46 stdsigs()
47 {
48 	ignsig(QUIT);
49 	getsig(INTR);
50 	getsig(MEMF);
51 	getsig(ALARM);
52 }
53 
54 ignsig(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 
64 getsig(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 
73 oldsigs()
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 
89 clrsig(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 
99 chktrap()
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 }
117