Commit | Line | Data |
---|---|---|
b79f4fa9 DF |
1 | /* |
2 | * Copyright (c) 1980 Regents of the University of California. | |
094e80ed | 3 | * All rights reserved. The Berkeley Software License Agreement |
b79f4fa9 DF |
4 | * specifies the terms and conditions for redistribution. |
5 | */ | |
6 | ||
35371dec | 7 | #ifndef lint |
094e80ed EW |
8 | static char *sccsid = "@(#)err.c 5.2 (Berkeley) %G%"; |
9 | #endif | |
830edfac BJ |
10 | |
11 | #include "sh.h" | |
12 | #include <sys/ioctl.h> | |
13 | ||
14 | /* | |
15 | * C Shell | |
16 | */ | |
17 | ||
18 | bool errspl; /* Argument to error was spliced by seterr2 */ | |
19 | char one[2] = { '1', 0 }; | |
20 | char *onev[2] = { one, NOSTR }; | |
21 | /* | |
22 | * Print error string s with optional argument arg. | |
23 | * This routine always resets or exits. The flag haderr | |
24 | * is set so the routine who catches the unwind can propogate | |
25 | * it if they want. | |
26 | * | |
27 | * Note that any open files at the point of error will eventually | |
28 | * be closed in the routine process in sh.c which is the only | |
29 | * place error unwinds are ever caught. | |
30 | */ | |
35371dec | 31 | /*VARARGS1*/ |
830edfac BJ |
32 | error(s, arg) |
33 | char *s; | |
34 | { | |
35 | register char **v; | |
36 | register char *ep; | |
37 | ||
38 | /* | |
39 | * Must flush before we print as we wish output before the error | |
40 | * to go on (some form of) standard output, while output after | |
41 | * goes on (some form of) diagnostic output. | |
42 | * If didfds then output will go to 1/2 else to FSHOUT/FSHDIAG. | |
43 | * See flush in sh.print.c. | |
44 | */ | |
45 | flush(); | |
46 | haderr = 1; /* Now to diagnostic output */ | |
47 | timflg = 0; /* This isn't otherwise reset */ | |
48 | if (v = pargv) | |
49 | pargv = 0, blkfree(v); | |
50 | if (v = gargv) | |
51 | gargv = 0, blkfree(v); | |
52 | ||
53 | /* | |
54 | * A zero arguments causes no printing, else print | |
55 | * an error diagnostic here. | |
56 | */ | |
57 | if (s) | |
58 | printf(s, arg), printf(".\n"); | |
59 | ||
60 | didfds = 0; /* Forget about 0,1,2 */ | |
61 | if ((ep = err) && errspl) { | |
62 | errspl = 0; | |
63 | xfree(ep); | |
64 | } | |
65 | errspl = 0; | |
66 | ||
67 | /* | |
68 | * Reset the state of the input. | |
69 | * This buffered seek to end of file will also | |
70 | * clear the while/foreach stack. | |
71 | */ | |
72 | btoeof(); | |
73 | ||
74 | /* | |
75 | * Go away if -e or we are a child shell | |
76 | */ | |
77 | if (exiterr || child) | |
78 | exit(1); | |
79 | ||
80 | setq("status", onev, &shvhed); | |
81 | if (tpgrp > 0) | |
35371dec | 82 | (void) ioctl(FSHTTY, TIOCSPGRP, (char *)&tpgrp); |
830edfac BJ |
83 | reset(); /* Unwind */ |
84 | } | |
85 | ||
86 | /* | |
87 | * Perror is the shells version of perror which should otherwise | |
88 | * never be called. | |
89 | */ | |
90 | Perror(s) | |
91 | char *s; | |
92 | { | |
93 | ||
94 | /* | |
95 | * Perror uses unit 2, thus if we didn't set up the fd's | |
96 | * we must set up unit 2 now else the diagnostic will disappear | |
97 | */ | |
98 | if (!didfds) { | |
99 | register int oerrno = errno; | |
100 | ||
35371dec | 101 | (void) dcopy(SHDIAG, 2); |
830edfac BJ |
102 | errno = oerrno; |
103 | } | |
104 | perror(s); | |
105 | error(NOSTR); /* To exit or unwind */ | |
106 | } | |
107 | ||
108 | bferr(cp) | |
109 | char *cp; | |
110 | { | |
111 | ||
112 | flush(); | |
113 | haderr = 1; | |
114 | printf("%s: ", bname); | |
115 | error(cp); | |
116 | } | |
117 | ||
118 | /* | |
119 | * The parser and scanner set up errors for later by calling seterr, | |
120 | * which sets the variable err as a side effect; later to be tested, | |
121 | * e.g. in process. | |
122 | */ | |
123 | seterr(s) | |
124 | char *s; | |
125 | { | |
126 | ||
127 | if (err == 0) | |
128 | err = s, errspl = 0; | |
129 | } | |
130 | ||
131 | /* Set err to a splice of cp and dp, to be freed later in error() */ | |
132 | seterr2(cp, dp) | |
133 | char *cp, *dp; | |
134 | { | |
135 | ||
136 | if (err) | |
137 | return; | |
138 | err = strspl(cp, dp); | |
139 | errspl++; | |
140 | } | |
141 | ||
142 | /* Set err to a splice of cp with a string form of character d */ | |
143 | seterrc(cp, d) | |
144 | char *cp, d; | |
145 | { | |
146 | char chbuf[2]; | |
147 | ||
148 | chbuf[0] = d; | |
149 | chbuf[1] = 0; | |
150 | seterr2(cp, chbuf); | |
151 | } |