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