xref: /csrg-svn/old/sh/error.c (revision 6690)
1*6690Smckusick /*	error.c	4.1	82/05/07	*/
2*6690Smckusick 
3*6690Smckusick #
4*6690Smckusick /*
5*6690Smckusick  * UNIX shell
6*6690Smckusick  *
7*6690Smckusick  * S. R. Bourne
8*6690Smckusick  * Bell Telephone Laboratories
9*6690Smckusick  *
10*6690Smckusick  */
11*6690Smckusick 
12*6690Smckusick #include	"defs.h"
13*6690Smckusick 
14*6690Smckusick 
15*6690Smckusick /* ========	error handling	======== */
16*6690Smckusick 
17*6690Smckusick exitset()
18*6690Smckusick {
19*6690Smckusick 	assnum(&exitadr,exitval);
20*6690Smckusick }
21*6690Smckusick 
22*6690Smckusick sigchk()
23*6690Smckusick {
24*6690Smckusick 	/* Find out if it is time to go away.
25*6690Smckusick 	 * `trapnote' is set to SIGSET when fault is seen and
26*6690Smckusick 	 * no trap has been set.
27*6690Smckusick 	 */
28*6690Smckusick 	IF trapnote&SIGSET
29*6690Smckusick 	THEN	exitsh(SIGFAIL);
30*6690Smckusick 	FI
31*6690Smckusick }
32*6690Smckusick 
33*6690Smckusick failed(s1,s2)
34*6690Smckusick 	STRING	s1, s2;
35*6690Smckusick {
36*6690Smckusick 	prp(); prs(s1);
37*6690Smckusick 	IF s2
38*6690Smckusick 	THEN	prs(colon); prs(s2);
39*6690Smckusick 	FI
40*6690Smckusick 	newline(); exitsh(ERROR);
41*6690Smckusick }
42*6690Smckusick 
43*6690Smckusick error(s)
44*6690Smckusick 	STRING	s;
45*6690Smckusick {
46*6690Smckusick 	failed(s,NIL);
47*6690Smckusick }
48*6690Smckusick 
49*6690Smckusick exitsh(xno)
50*6690Smckusick 	INT	xno;
51*6690Smckusick {
52*6690Smckusick 	/* Arrive here from `FATAL' errors
53*6690Smckusick 	 *  a) exit command,
54*6690Smckusick 	 *  b) default trap,
55*6690Smckusick 	 *  c) fault with no trap set.
56*6690Smckusick 	 *
57*6690Smckusick 	 * Action is to return to command level or exit.
58*6690Smckusick 	 */
59*6690Smckusick 	exitval=xno;
60*6690Smckusick 	IF (flags & (forked|errflg|ttyflg)) != ttyflg
61*6690Smckusick 	THEN	done();
62*6690Smckusick 	ELSE	clearup();
63*6690Smckusick 		longjmp(errshell,1);
64*6690Smckusick 	FI
65*6690Smckusick }
66*6690Smckusick 
67*6690Smckusick done()
68*6690Smckusick {
69*6690Smckusick 	REG STRING	t;
70*6690Smckusick 	IF t=trapcom[0]
71*6690Smckusick 	THEN	trapcom[0]=0; /*should free but not long */
72*6690Smckusick 		execexp(t,0);
73*6690Smckusick 	FI
74*6690Smckusick 	rmtemp(0);
75*6690Smckusick 	exit(exitval);
76*6690Smckusick }
77*6690Smckusick 
78*6690Smckusick rmtemp(base)
79*6690Smckusick 	IOPTR		base;
80*6690Smckusick {
81*6690Smckusick 	WHILE iotemp>base
82*6690Smckusick 	DO  unlink(iotemp->ioname);
83*6690Smckusick 	    iotemp=iotemp->iolst;
84*6690Smckusick 	OD
85*6690Smckusick }
86