xref: /original-bsd/old/sh/fault.c (revision 62734ea8)
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 
15 STRING		trapcom[MAXTRAP];
16 BOOL		trapflg[MAXTRAP];
17 
18 /* ========	fault handling routines	   ======== */
19 
20 
21 VOID	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 
41 stdsigs()
42 {
43 	ignsig(QUIT);
44 	getsig(INTR);
45 	getsig(MEMF);
46 	getsig(ALARM);
47 }
48 
49 ignsig(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 
59 getsig(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 
68 oldsigs()
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 
84 clrsig(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 
94 chktrap()
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 }
112