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