xref: /csrg-svn/old/sh/fault.c (revision 14478)
1*14478Ssam #ifndef lint
2*14478Ssam static char sccsid[] = "@(#)fault.c	4.3 08/11/83";
3*14478Ssam #endif
46692Smckusick 
56692Smckusick #
66692Smckusick /*
76692Smckusick  * UNIX shell
86692Smckusick  *
96692Smckusick  * S. R. Bourne
106692Smckusick  * Bell Telephone Laboratories
116692Smckusick  *
126692Smckusick  */
136692Smckusick 
146692Smckusick #include	"defs.h"
156692Smckusick 
166692Smckusick 
176692Smckusick STRING		trapcom[MAXTRAP];
186692Smckusick BOOL		trapflg[MAXTRAP];
1912992Ssam BOOL		trapjmp[MAXTRAP];
206692Smckusick 
216692Smckusick /* ========	fault handling routines	   ======== */
226692Smckusick 
236692Smckusick 
fault(sig)246692Smckusick VOID	fault(sig)
256692Smckusick 	REG INT		sig;
266692Smckusick {
276692Smckusick 	REG INT		flag;
286692Smckusick 
296692Smckusick 	IF sig==MEMF
306692Smckusick 	THEN	IF setbrk(brkincr) == -1
316692Smckusick 		THEN	error(nospace);
326692Smckusick 		FI
336692Smckusick 	ELIF sig==ALARM
346692Smckusick 	THEN	IF flags&waiting
356692Smckusick 		THEN	done();
366692Smckusick 		FI
376692Smckusick 	ELSE	flag = (trapcom[sig] ? TRAPSET : SIGSET);
386692Smckusick 		trapnote |= flag;
396692Smckusick 		trapflg[sig] |= flag;
406692Smckusick 	FI
4112992Ssam 	IF trapjmp[sig] ANDF sig==INTR
4212992Ssam 	THEN
4312992Ssam 		trapjmp[sig] = 0;
4412992Ssam 		longjmp(INTbuf, 1);
4512992Ssam 	FI
466692Smckusick }
476692Smckusick 
stdsigs()486692Smckusick stdsigs()
496692Smckusick {
506692Smckusick 	ignsig(QUIT);
516692Smckusick 	getsig(INTR);
526692Smckusick 	getsig(MEMF);
536692Smckusick 	getsig(ALARM);
546692Smckusick }
556692Smckusick 
ignsig(n)566692Smckusick ignsig(n)
576692Smckusick {
586692Smckusick 	REG INT		s, i;
596692Smckusick 
606692Smckusick 	IF (s=signal(i=n,1)&01)==0
616692Smckusick 	THEN	trapflg[i] |= SIGMOD;
626692Smckusick 	FI
636692Smckusick 	return(s);
646692Smckusick }
656692Smckusick 
getsig(n)666692Smckusick getsig(n)
676692Smckusick {
686692Smckusick 	REG INT		i;
696692Smckusick 
706692Smckusick 	IF trapflg[i=n]&SIGMOD ORF ignsig(i)==0
716692Smckusick 	THEN	signal(i,fault);
726692Smckusick 	FI
736692Smckusick }
746692Smckusick 
oldsigs()756692Smckusick oldsigs()
766692Smckusick {
776692Smckusick 	REG INT		i;
786692Smckusick 	REG STRING	t;
796692Smckusick 
806692Smckusick 	i=MAXTRAP;
816692Smckusick 	WHILE i--
826692Smckusick 	DO  t=trapcom[i];
836692Smckusick 	    IF t==0 ORF *t
846692Smckusick 	    THEN clrsig(i);
856692Smckusick 	    FI
866692Smckusick 	    trapflg[i]=0;
876692Smckusick 	OD
886692Smckusick 	trapnote=0;
896692Smckusick }
906692Smckusick 
clrsig(i)916692Smckusick clrsig(i)
926692Smckusick 	INT		i;
936692Smckusick {
946692Smckusick 	free(trapcom[i]); trapcom[i]=0;
956692Smckusick 	IF trapflg[i]&SIGMOD
966692Smckusick 	THEN	signal(i,fault);
976692Smckusick 		trapflg[i] &= ~SIGMOD;
986692Smckusick 	FI
996692Smckusick }
1006692Smckusick 
chktrap()1016692Smckusick chktrap()
1026692Smckusick {
1036692Smckusick 	/* check for traps */
1046692Smckusick 	REG INT		i=MAXTRAP;
1056692Smckusick 	REG STRING	t;
1066692Smckusick 
1076692Smckusick 	trapnote &= ~TRAPSET;
1086692Smckusick 	WHILE --i
1096692Smckusick 	DO IF trapflg[i]&TRAPSET
1106692Smckusick 	   THEN trapflg[i] &= ~TRAPSET;
1116692Smckusick 		IF t=trapcom[i]
1126692Smckusick 		THEN	INT	savxit=exitval;
1136692Smckusick 			execexp(t,0);
1146692Smckusick 			exitval=savxit; exitset();
1156692Smckusick 		FI
1166692Smckusick 	   FI
1176692Smckusick 	OD
1186692Smckusick }
119