|
|
1.1 root 1: /* @(#)error.c 1.4 */
2: /*
3: * UNIX shell
4: *
5: * Bell Telephone Laboratories
6: *
7: */
8:
9: #include "defs.h"
10:
11:
12: /* ======== error handling ======== */
13:
14: failed(s1, s2, per)
15: char *s1, *s2;
16: {
17: extern int sys_nerr;
18: extern char *sys_errlist[];
19: extern int errno;
20:
21: prp();
22: prs_cntl(s1);
23: if (s2)
24: {
25: prs(colon);
26: prs(s2);
27: }
28: if (per)
29: {
30: if (errno >= 0 && errno < sys_nerr) {
31: prs(colon);
32: prs(sys_errlist[errno]);
33: } else {
34: #if NOTDEF /* prn gets negative numbers wrong */
35: prs(": error ");
36: prn(errno);
37: #else
38: prs(": Unknown error");
39: #endif
40: }
41: }
42: newline();
43: exitsh(ERROR);
44: }
45:
46: error(s)
47: char *s;
48: {
49: failed(s, NIL, 0);
50: }
51:
52: exitsh(xno)
53: int xno;
54: {
55: /*
56: * Arrive here from `FATAL' errors
57: * a) exit command,
58: * b) default trap,
59: * c) fault with no trap set.
60: *
61: * Action is to return to command level or exit.
62: */
63: exitval = xno;
64: flags |= eflag;
65: if ((flags & (forked | errflg | ttyflg)) != ttyflg)
66: done();
67: else
68: {
69: clearup();
70: restore(0);
71: clear_buff();
72: execbrk = breakcnt = funcnt = 0;
73: longjmp(errshell, 1);
74: }
75: }
76:
77: done()
78: {
79: register char *t;
80:
81: if (t = trapcom[0])
82: {
83: trapcom[0] = 0;
84: execexp(t, 0);
85: shfree(t);
86: }
87: else
88: chktrap();
89:
90: rmtemp(0);
91: rmfunctmp();
92:
93: #ifdef ACCT
94: doacct();
95: #endif
96: exit(exitval);
97: }
98:
99: rmtemp(base)
100: struct ionod *base;
101: {
102: while (iotemp > base)
103: {
104: unlink(iotemp->ioname);
105: shfree(iotemp->iolink);
106: iotemp = iotemp->iolst;
107: }
108: }
109:
110: rmfunctmp()
111: {
112: while (fiotemp)
113: {
114: unlink(fiotemp->ioname);
115: fiotemp = fiotemp->iolst;
116: }
117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.