xref: /csrg-svn/old/sh/error.c (revision 14478)
1*14478Ssam #ifndef lint
2*14478Ssam static char sccsid[] = "@(#)error.c	4.2 08/11/83";
3*14478Ssam #endif
46690Smckusick 
56690Smckusick #
66690Smckusick /*
76690Smckusick  * UNIX shell
86690Smckusick  *
96690Smckusick  * S. R. Bourne
106690Smckusick  * Bell Telephone Laboratories
116690Smckusick  *
126690Smckusick  */
136690Smckusick 
146690Smckusick #include	"defs.h"
156690Smckusick 
166690Smckusick 
176690Smckusick /* ========	error handling	======== */
186690Smckusick 
exitset()196690Smckusick exitset()
206690Smckusick {
216690Smckusick 	assnum(&exitadr,exitval);
226690Smckusick }
236690Smckusick 
sigchk()246690Smckusick sigchk()
256690Smckusick {
266690Smckusick 	/* Find out if it is time to go away.
276690Smckusick 	 * `trapnote' is set to SIGSET when fault is seen and
286690Smckusick 	 * no trap has been set.
296690Smckusick 	 */
306690Smckusick 	IF trapnote&SIGSET
316690Smckusick 	THEN	exitsh(SIGFAIL);
326690Smckusick 	FI
336690Smckusick }
346690Smckusick 
failed(s1,s2)356690Smckusick failed(s1,s2)
366690Smckusick 	STRING	s1, s2;
376690Smckusick {
386690Smckusick 	prp(); prs(s1);
396690Smckusick 	IF s2
406690Smckusick 	THEN	prs(colon); prs(s2);
416690Smckusick 	FI
426690Smckusick 	newline(); exitsh(ERROR);
436690Smckusick }
446690Smckusick 
error(s)456690Smckusick error(s)
466690Smckusick 	STRING	s;
476690Smckusick {
486690Smckusick 	failed(s,NIL);
496690Smckusick }
506690Smckusick 
exitsh(xno)516690Smckusick exitsh(xno)
526690Smckusick 	INT	xno;
536690Smckusick {
546690Smckusick 	/* Arrive here from `FATAL' errors
556690Smckusick 	 *  a) exit command,
566690Smckusick 	 *  b) default trap,
576690Smckusick 	 *  c) fault with no trap set.
586690Smckusick 	 *
596690Smckusick 	 * Action is to return to command level or exit.
606690Smckusick 	 */
616690Smckusick 	exitval=xno;
626690Smckusick 	IF (flags & (forked|errflg|ttyflg)) != ttyflg
636690Smckusick 	THEN	done();
646690Smckusick 	ELSE	clearup();
656690Smckusick 		longjmp(errshell,1);
666690Smckusick 	FI
676690Smckusick }
686690Smckusick 
done()696690Smckusick done()
706690Smckusick {
716690Smckusick 	REG STRING	t;
726690Smckusick 	IF t=trapcom[0]
736690Smckusick 	THEN	trapcom[0]=0; /*should free but not long */
746690Smckusick 		execexp(t,0);
756690Smckusick 	FI
766690Smckusick 	rmtemp(0);
776690Smckusick 	exit(exitval);
786690Smckusick }
796690Smckusick 
rmtemp(base)806690Smckusick rmtemp(base)
816690Smckusick 	IOPTR		base;
826690Smckusick {
836690Smckusick 	WHILE iotemp>base
846690Smckusick 	DO  unlink(iotemp->ioname);
856690Smckusick 	    iotemp=iotemp->iolst;
866690Smckusick 	OD
876690Smckusick }
88