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