1*d1e4d7ceSDavid van Moolenbroek /* $NetBSD: err.c,v 1.21 2013/07/16 17:47:43 christos Exp $ */
2*d1e4d7ceSDavid van Moolenbroek
3*d1e4d7ceSDavid van Moolenbroek /*-
4*d1e4d7ceSDavid van Moolenbroek * Copyright (c) 1980, 1991, 1993
5*d1e4d7ceSDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
6*d1e4d7ceSDavid van Moolenbroek *
7*d1e4d7ceSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
8*d1e4d7ceSDavid van Moolenbroek * modification, are permitted provided that the following conditions
9*d1e4d7ceSDavid van Moolenbroek * are met:
10*d1e4d7ceSDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
11*d1e4d7ceSDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
12*d1e4d7ceSDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
13*d1e4d7ceSDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
14*d1e4d7ceSDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
15*d1e4d7ceSDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors
16*d1e4d7ceSDavid van Moolenbroek * may be used to endorse or promote products derived from this software
17*d1e4d7ceSDavid van Moolenbroek * without specific prior written permission.
18*d1e4d7ceSDavid van Moolenbroek *
19*d1e4d7ceSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*d1e4d7ceSDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*d1e4d7ceSDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*d1e4d7ceSDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*d1e4d7ceSDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*d1e4d7ceSDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*d1e4d7ceSDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*d1e4d7ceSDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*d1e4d7ceSDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*d1e4d7ceSDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*d1e4d7ceSDavid van Moolenbroek * SUCH DAMAGE.
30*d1e4d7ceSDavid van Moolenbroek */
31*d1e4d7ceSDavid van Moolenbroek
32*d1e4d7ceSDavid van Moolenbroek #include <sys/cdefs.h>
33*d1e4d7ceSDavid van Moolenbroek #ifndef lint
34*d1e4d7ceSDavid van Moolenbroek #if 0
35*d1e4d7ceSDavid van Moolenbroek static char sccsid[] = "@(#)err.c 8.1 (Berkeley) 5/31/93";
36*d1e4d7ceSDavid van Moolenbroek #else
37*d1e4d7ceSDavid van Moolenbroek __RCSID("$NetBSD: err.c,v 1.21 2013/07/16 17:47:43 christos Exp $");
38*d1e4d7ceSDavid van Moolenbroek #endif
39*d1e4d7ceSDavid van Moolenbroek #endif /* not lint */
40*d1e4d7ceSDavid van Moolenbroek
41*d1e4d7ceSDavid van Moolenbroek #include <sys/types.h>
42*d1e4d7ceSDavid van Moolenbroek
43*d1e4d7ceSDavid van Moolenbroek #include <stdarg.h>
44*d1e4d7ceSDavid van Moolenbroek #include <stdlib.h>
45*d1e4d7ceSDavid van Moolenbroek #include <unistd.h>
46*d1e4d7ceSDavid van Moolenbroek
47*d1e4d7ceSDavid van Moolenbroek #include "csh.h"
48*d1e4d7ceSDavid van Moolenbroek #include "extern.h"
49*d1e4d7ceSDavid van Moolenbroek
50*d1e4d7ceSDavid van Moolenbroek char *seterr = NULL; /* Holds last error if there was one */
51*d1e4d7ceSDavid van Moolenbroek
52*d1e4d7ceSDavid van Moolenbroek #define ERR_FLAGS ((int)0xf0000000)
53*d1e4d7ceSDavid van Moolenbroek #define ERR_NAME 0x10000000
54*d1e4d7ceSDavid van Moolenbroek #define ERR_SILENT 0x20000000
55*d1e4d7ceSDavid van Moolenbroek #define ERR_OLD 0x40000000
56*d1e4d7ceSDavid van Moolenbroek
57*d1e4d7ceSDavid van Moolenbroek static const char *errorlist[] =
58*d1e4d7ceSDavid van Moolenbroek {
59*d1e4d7ceSDavid van Moolenbroek #define ERR_SYNTAX 0
60*d1e4d7ceSDavid van Moolenbroek "Syntax Error",
61*d1e4d7ceSDavid van Moolenbroek #define ERR_NOTALLOWED 1
62*d1e4d7ceSDavid van Moolenbroek "%s is not allowed",
63*d1e4d7ceSDavid van Moolenbroek #define ERR_WTOOLONG 2
64*d1e4d7ceSDavid van Moolenbroek "Word too long",
65*d1e4d7ceSDavid van Moolenbroek #define ERR_LTOOLONG 3
66*d1e4d7ceSDavid van Moolenbroek "$< line too long",
67*d1e4d7ceSDavid van Moolenbroek #define ERR_DOLZERO 4
68*d1e4d7ceSDavid van Moolenbroek "No file for $0",
69*d1e4d7ceSDavid van Moolenbroek #define ERR_DOLQUEST 5
70*d1e4d7ceSDavid van Moolenbroek "$? not allowed here",
71*d1e4d7ceSDavid van Moolenbroek #define ERR_INCBR 6
72*d1e4d7ceSDavid van Moolenbroek "Incomplete [] modifier",
73*d1e4d7ceSDavid van Moolenbroek #define ERR_EXPORD 7
74*d1e4d7ceSDavid van Moolenbroek "$ expansion must end before ]",
75*d1e4d7ceSDavid van Moolenbroek #define ERR_BADMOD 8
76*d1e4d7ceSDavid van Moolenbroek "Bad : modifier in $ (%c)",
77*d1e4d7ceSDavid van Moolenbroek #define ERR_SUBSCRIPT 9
78*d1e4d7ceSDavid van Moolenbroek "Subscript error",
79*d1e4d7ceSDavid van Moolenbroek #define ERR_BADNUM 10
80*d1e4d7ceSDavid van Moolenbroek "Badly formed number",
81*d1e4d7ceSDavid van Moolenbroek #define ERR_NOMORE 11
82*d1e4d7ceSDavid van Moolenbroek "No more words",
83*d1e4d7ceSDavid van Moolenbroek #define ERR_FILENAME 12
84*d1e4d7ceSDavid van Moolenbroek "Missing file name",
85*d1e4d7ceSDavid van Moolenbroek #define ERR_GLOB 13
86*d1e4d7ceSDavid van Moolenbroek "Internal glob error",
87*d1e4d7ceSDavid van Moolenbroek #define ERR_COMMAND 14
88*d1e4d7ceSDavid van Moolenbroek "Command not found",
89*d1e4d7ceSDavid van Moolenbroek #define ERR_TOOFEW 15
90*d1e4d7ceSDavid van Moolenbroek "Too few arguments",
91*d1e4d7ceSDavid van Moolenbroek #define ERR_TOOMANY 16
92*d1e4d7ceSDavid van Moolenbroek "Too many arguments",
93*d1e4d7ceSDavid van Moolenbroek #define ERR_DANGER 17
94*d1e4d7ceSDavid van Moolenbroek "Too dangerous to alias that",
95*d1e4d7ceSDavid van Moolenbroek #define ERR_EMPTYIF 18
96*d1e4d7ceSDavid van Moolenbroek "Empty if",
97*d1e4d7ceSDavid van Moolenbroek #define ERR_IMPRTHEN 19
98*d1e4d7ceSDavid van Moolenbroek "Improper then",
99*d1e4d7ceSDavid van Moolenbroek #define ERR_NOPAREN 20
100*d1e4d7ceSDavid van Moolenbroek "Words not parenthesized",
101*d1e4d7ceSDavid van Moolenbroek #define ERR_NOTFOUND 21
102*d1e4d7ceSDavid van Moolenbroek "%s not found",
103*d1e4d7ceSDavid van Moolenbroek #define ERR_MASK 22
104*d1e4d7ceSDavid van Moolenbroek "Improper mask",
105*d1e4d7ceSDavid van Moolenbroek #define ERR_LIMIT 23
106*d1e4d7ceSDavid van Moolenbroek "No such limit",
107*d1e4d7ceSDavid van Moolenbroek #define ERR_TOOLARGE 24
108*d1e4d7ceSDavid van Moolenbroek "Argument too large",
109*d1e4d7ceSDavid van Moolenbroek #define ERR_SCALEF 25
110*d1e4d7ceSDavid van Moolenbroek "Improper or unknown scale factor",
111*d1e4d7ceSDavid van Moolenbroek #define ERR_UNDVAR 26
112*d1e4d7ceSDavid van Moolenbroek "Undefined variable",
113*d1e4d7ceSDavid van Moolenbroek #define ERR_DEEP 27
114*d1e4d7ceSDavid van Moolenbroek "Directory stack not that deep",
115*d1e4d7ceSDavid van Moolenbroek #define ERR_BADSIG 28
116*d1e4d7ceSDavid van Moolenbroek "Bad signal number",
117*d1e4d7ceSDavid van Moolenbroek #define ERR_UNKSIG 29
118*d1e4d7ceSDavid van Moolenbroek "Unknown signal; kill -l lists signals",
119*d1e4d7ceSDavid van Moolenbroek #define ERR_VARBEGIN 30
120*d1e4d7ceSDavid van Moolenbroek "Variable name must begin with a letter",
121*d1e4d7ceSDavid van Moolenbroek #define ERR_VARTOOLONG 31
122*d1e4d7ceSDavid van Moolenbroek "Variable name too long",
123*d1e4d7ceSDavid van Moolenbroek #define ERR_VARALNUM 32
124*d1e4d7ceSDavid van Moolenbroek "Variable name must contain alphanumeric characters",
125*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBCONTROL 33
126*d1e4d7ceSDavid van Moolenbroek "No job control in this shell",
127*d1e4d7ceSDavid van Moolenbroek #define ERR_EXPRESSION 34
128*d1e4d7ceSDavid van Moolenbroek "Expression Syntax",
129*d1e4d7ceSDavid van Moolenbroek #define ERR_NOHOMEDIR 35
130*d1e4d7ceSDavid van Moolenbroek "No home directory",
131*d1e4d7ceSDavid van Moolenbroek #define ERR_CANTCHANGE 36
132*d1e4d7ceSDavid van Moolenbroek "Can't change to home directory",
133*d1e4d7ceSDavid van Moolenbroek #define ERR_NULLCOM 37
134*d1e4d7ceSDavid van Moolenbroek "Invalid null command",
135*d1e4d7ceSDavid van Moolenbroek #define ERR_ASSIGN 38
136*d1e4d7ceSDavid van Moolenbroek "Assignment missing expression",
137*d1e4d7ceSDavid van Moolenbroek #define ERR_UNKNOWNOP 39
138*d1e4d7ceSDavid van Moolenbroek "Unknown operator",
139*d1e4d7ceSDavid van Moolenbroek #define ERR_AMBIG 40
140*d1e4d7ceSDavid van Moolenbroek "Ambiguous",
141*d1e4d7ceSDavid van Moolenbroek #define ERR_EXISTS 41
142*d1e4d7ceSDavid van Moolenbroek "%s: File exists",
143*d1e4d7ceSDavid van Moolenbroek #define ERR_INTR 42
144*d1e4d7ceSDavid van Moolenbroek "Interrupted",
145*d1e4d7ceSDavid van Moolenbroek #define ERR_RANGE 43
146*d1e4d7ceSDavid van Moolenbroek "Subscript out of range",
147*d1e4d7ceSDavid van Moolenbroek #define ERR_OVERFLOW 44
148*d1e4d7ceSDavid van Moolenbroek "Line overflow",
149*d1e4d7ceSDavid van Moolenbroek #define ERR_VARMOD 45
150*d1e4d7ceSDavid van Moolenbroek "Unknown variable modifier",
151*d1e4d7ceSDavid van Moolenbroek #define ERR_NOSUCHJOB 46
152*d1e4d7ceSDavid van Moolenbroek "No such job",
153*d1e4d7ceSDavid van Moolenbroek #define ERR_TERMINAL 47
154*d1e4d7ceSDavid van Moolenbroek "Can't from terminal",
155*d1e4d7ceSDavid van Moolenbroek #define ERR_NOTWHILE 48
156*d1e4d7ceSDavid van Moolenbroek "Not in while/foreach",
157*d1e4d7ceSDavid van Moolenbroek #define ERR_NOPROC 49
158*d1e4d7ceSDavid van Moolenbroek "No more processes",
159*d1e4d7ceSDavid van Moolenbroek #define ERR_NOMATCH 50
160*d1e4d7ceSDavid van Moolenbroek "No match",
161*d1e4d7ceSDavid van Moolenbroek #define ERR_MISSING 51
162*d1e4d7ceSDavid van Moolenbroek "Missing %c",
163*d1e4d7ceSDavid van Moolenbroek #define ERR_UNMATCHED 52
164*d1e4d7ceSDavid van Moolenbroek "Unmatched %c",
165*d1e4d7ceSDavid van Moolenbroek #define ERR_NOMEM 53
166*d1e4d7ceSDavid van Moolenbroek "Out of memory",
167*d1e4d7ceSDavid van Moolenbroek #define ERR_PIPE 54
168*d1e4d7ceSDavid van Moolenbroek "Can't make pipe",
169*d1e4d7ceSDavid van Moolenbroek #define ERR_SYSTEM 55
170*d1e4d7ceSDavid van Moolenbroek "%s: %s",
171*d1e4d7ceSDavid van Moolenbroek #define ERR_STRING 56
172*d1e4d7ceSDavid van Moolenbroek "%s",
173*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBS 57
174*d1e4d7ceSDavid van Moolenbroek "usage: jobs [ -l ]",
175*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBARGS 58
176*d1e4d7ceSDavid van Moolenbroek "Arguments should be jobs or process id's",
177*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBCUR 59
178*d1e4d7ceSDavid van Moolenbroek "No current job",
179*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBPREV 60
180*d1e4d7ceSDavid van Moolenbroek "No previous job",
181*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBPAT 61
182*d1e4d7ceSDavid van Moolenbroek "No job matches pattern",
183*d1e4d7ceSDavid van Moolenbroek #define ERR_NESTING 62
184*d1e4d7ceSDavid van Moolenbroek "Fork nesting > %d; maybe `...` loop",
185*d1e4d7ceSDavid van Moolenbroek #define ERR_JOBCTRLSUB 63
186*d1e4d7ceSDavid van Moolenbroek "No job control in subshells",
187*d1e4d7ceSDavid van Moolenbroek #define ERR_BADPLPS 64
188*d1e4d7ceSDavid van Moolenbroek "Badly placed ()'s",
189*d1e4d7ceSDavid van Moolenbroek #define ERR_STOPPED 65
190*d1e4d7ceSDavid van Moolenbroek "%sThere are suspended jobs",
191*d1e4d7ceSDavid van Moolenbroek #define ERR_NODIR 66
192*d1e4d7ceSDavid van Moolenbroek "No other directory",
193*d1e4d7ceSDavid van Moolenbroek #define ERR_EMPTY 67
194*d1e4d7ceSDavid van Moolenbroek "Directory stack empty",
195*d1e4d7ceSDavid van Moolenbroek #define ERR_BADDIR 68
196*d1e4d7ceSDavid van Moolenbroek "Bad directory",
197*d1e4d7ceSDavid van Moolenbroek #define ERR_DIRUS 69
198*d1e4d7ceSDavid van Moolenbroek "usage: %s [-lvn]%s",
199*d1e4d7ceSDavid van Moolenbroek #define ERR_HFLAG 70
200*d1e4d7ceSDavid van Moolenbroek "No operand for -h flag",
201*d1e4d7ceSDavid van Moolenbroek #define ERR_NOTLOGIN 71
202*d1e4d7ceSDavid van Moolenbroek "Not a login shell",
203*d1e4d7ceSDavid van Moolenbroek #define ERR_DIV0 72
204*d1e4d7ceSDavid van Moolenbroek "Division by 0",
205*d1e4d7ceSDavid van Moolenbroek #define ERR_MOD0 73
206*d1e4d7ceSDavid van Moolenbroek "Mod by 0",
207*d1e4d7ceSDavid van Moolenbroek #define ERR_BADSCALE 74
208*d1e4d7ceSDavid van Moolenbroek "Bad scaling; did you mean \"%s\"?",
209*d1e4d7ceSDavid van Moolenbroek #define ERR_SUSPLOG 75
210*d1e4d7ceSDavid van Moolenbroek "Can't suspend a login shell (yet)",
211*d1e4d7ceSDavid van Moolenbroek #define ERR_UNKUSER 76
212*d1e4d7ceSDavid van Moolenbroek "Unknown user: %s",
213*d1e4d7ceSDavid van Moolenbroek #define ERR_NOHOME 77
214*d1e4d7ceSDavid van Moolenbroek "No $home variable set",
215*d1e4d7ceSDavid van Moolenbroek #define ERR_HISTUS 78
216*d1e4d7ceSDavid van Moolenbroek "usage: history [-rh] [# number of events]",
217*d1e4d7ceSDavid van Moolenbroek #define ERR_SPDOLLT 79
218*d1e4d7ceSDavid van Moolenbroek "$, ! or < not allowed with $# or $?",
219*d1e4d7ceSDavid van Moolenbroek #define ERR_NEWLINE 80
220*d1e4d7ceSDavid van Moolenbroek "Newline in variable name",
221*d1e4d7ceSDavid van Moolenbroek #define ERR_SPSTAR 81
222*d1e4d7ceSDavid van Moolenbroek "* not allowed with $# or $?",
223*d1e4d7ceSDavid van Moolenbroek #define ERR_DIGIT 82
224*d1e4d7ceSDavid van Moolenbroek "$?<digit> or $#<digit> not allowed",
225*d1e4d7ceSDavid van Moolenbroek #define ERR_VARILL 83
226*d1e4d7ceSDavid van Moolenbroek "Illegal variable name",
227*d1e4d7ceSDavid van Moolenbroek #define ERR_NLINDEX 84
228*d1e4d7ceSDavid van Moolenbroek "Newline in variable index",
229*d1e4d7ceSDavid van Moolenbroek #define ERR_EXPOVFL 85
230*d1e4d7ceSDavid van Moolenbroek "Expansion buffer overflow",
231*d1e4d7ceSDavid van Moolenbroek #define ERR_VARSYN 86
232*d1e4d7ceSDavid van Moolenbroek "Variable syntax",
233*d1e4d7ceSDavid van Moolenbroek #define ERR_BADBANG 87
234*d1e4d7ceSDavid van Moolenbroek "Bad ! form",
235*d1e4d7ceSDavid van Moolenbroek #define ERR_NOSUBST 88
236*d1e4d7ceSDavid van Moolenbroek "No previous substitute",
237*d1e4d7ceSDavid van Moolenbroek #define ERR_BADSUBST 89
238*d1e4d7ceSDavid van Moolenbroek "Bad substitute",
239*d1e4d7ceSDavid van Moolenbroek #define ERR_LHS 90
240*d1e4d7ceSDavid van Moolenbroek "No previous left hand side",
241*d1e4d7ceSDavid van Moolenbroek #define ERR_RHSLONG 91
242*d1e4d7ceSDavid van Moolenbroek "Right hand side too long",
243*d1e4d7ceSDavid van Moolenbroek #define ERR_BADBANGMOD 92
244*d1e4d7ceSDavid van Moolenbroek "Bad ! modifier: %c",
245*d1e4d7ceSDavid van Moolenbroek #define ERR_MODFAIL 93
246*d1e4d7ceSDavid van Moolenbroek "Modifier failed",
247*d1e4d7ceSDavid van Moolenbroek #define ERR_SUBOVFL 94
248*d1e4d7ceSDavid van Moolenbroek "Substitution buffer overflow",
249*d1e4d7ceSDavid van Moolenbroek #define ERR_BADBANGARG 95
250*d1e4d7ceSDavid van Moolenbroek "Bad ! arg selector",
251*d1e4d7ceSDavid van Moolenbroek #define ERR_NOSEARCH 96
252*d1e4d7ceSDavid van Moolenbroek "No prev search",
253*d1e4d7ceSDavid van Moolenbroek #define ERR_NOEVENT 97
254*d1e4d7ceSDavid van Moolenbroek "%s: Event not found",
255*d1e4d7ceSDavid van Moolenbroek #define ERR_TOOMANYRP 98
256*d1e4d7ceSDavid van Moolenbroek "Too many )'s",
257*d1e4d7ceSDavid van Moolenbroek #define ERR_TOOMANYLP 99
258*d1e4d7ceSDavid van Moolenbroek "Too many ('s",
259*d1e4d7ceSDavid van Moolenbroek #define ERR_BADPLP 100
260*d1e4d7ceSDavid van Moolenbroek "Badly placed (",
261*d1e4d7ceSDavid van Moolenbroek #define ERR_MISRED 101
262*d1e4d7ceSDavid van Moolenbroek "Missing name for redirect",
263*d1e4d7ceSDavid van Moolenbroek #define ERR_OUTRED 102
264*d1e4d7ceSDavid van Moolenbroek "Ambiguous output redirect",
265*d1e4d7ceSDavid van Moolenbroek #define ERR_REDPAR 103
266*d1e4d7ceSDavid van Moolenbroek "Can't << within ()'s",
267*d1e4d7ceSDavid van Moolenbroek #define ERR_INRED 104
268*d1e4d7ceSDavid van Moolenbroek "Ambiguous input redirect",
269*d1e4d7ceSDavid van Moolenbroek #define ERR_ALIASLOOP 105
270*d1e4d7ceSDavid van Moolenbroek "Alias loop",
271*d1e4d7ceSDavid van Moolenbroek #define ERR_HISTLOOP 106
272*d1e4d7ceSDavid van Moolenbroek "!# History loop",
273*d1e4d7ceSDavid van Moolenbroek #define ERR_ARCH 107
274*d1e4d7ceSDavid van Moolenbroek "%s: %s. Wrong Architecture",
275*d1e4d7ceSDavid van Moolenbroek #define ERR_FILEINQ 108
276*d1e4d7ceSDavid van Moolenbroek "Malformed file inquiry",
277*d1e4d7ceSDavid van Moolenbroek #define ERR_SELOVFL 109
278*d1e4d7ceSDavid van Moolenbroek "Selector overflow",
279*d1e4d7ceSDavid van Moolenbroek #define ERR_INVALID 110
280*d1e4d7ceSDavid van Moolenbroek "Invalid Error"
281*d1e4d7ceSDavid van Moolenbroek };
282*d1e4d7ceSDavid van Moolenbroek
283*d1e4d7ceSDavid van Moolenbroek /*
284*d1e4d7ceSDavid van Moolenbroek * The parser and scanner set up errors for later by calling seterr,
285*d1e4d7ceSDavid van Moolenbroek * which sets the variable err as a side effect; later to be tested,
286*d1e4d7ceSDavid van Moolenbroek * e.g. in process.
287*d1e4d7ceSDavid van Moolenbroek */
288*d1e4d7ceSDavid van Moolenbroek void
seterror(int id,...)289*d1e4d7ceSDavid van Moolenbroek seterror(int id, ...)
290*d1e4d7ceSDavid van Moolenbroek {
291*d1e4d7ceSDavid van Moolenbroek if (seterr == 0) {
292*d1e4d7ceSDavid van Moolenbroek char berr[BUFSIZE];
293*d1e4d7ceSDavid van Moolenbroek va_list va;
294*d1e4d7ceSDavid van Moolenbroek
295*d1e4d7ceSDavid van Moolenbroek va_start(va, id);
296*d1e4d7ceSDavid van Moolenbroek if (id < 0 || id >= (int)(sizeof(errorlist) / sizeof(errorlist[0])) - 1)
297*d1e4d7ceSDavid van Moolenbroek id = ERR_INVALID;
298*d1e4d7ceSDavid van Moolenbroek (void)vsnprintf(berr, sizeof(berr), errorlist[id], va);
299*d1e4d7ceSDavid van Moolenbroek va_end(va);
300*d1e4d7ceSDavid van Moolenbroek
301*d1e4d7ceSDavid van Moolenbroek seterr = strsave(berr);
302*d1e4d7ceSDavid van Moolenbroek }
303*d1e4d7ceSDavid van Moolenbroek }
304*d1e4d7ceSDavid van Moolenbroek
305*d1e4d7ceSDavid van Moolenbroek /*
306*d1e4d7ceSDavid van Moolenbroek * Print the error with the given id.
307*d1e4d7ceSDavid van Moolenbroek *
308*d1e4d7ceSDavid van Moolenbroek * Special ids:
309*d1e4d7ceSDavid van Moolenbroek * ERR_SILENT: Print nothing.
310*d1e4d7ceSDavid van Moolenbroek * ERR_OLD: Print the previously set error if one was there.
311*d1e4d7ceSDavid van Moolenbroek * otherwise return.
312*d1e4d7ceSDavid van Moolenbroek * ERR_NAME: If this bit is set, print the name of the function
313*d1e4d7ceSDavid van Moolenbroek * in bname
314*d1e4d7ceSDavid van Moolenbroek *
315*d1e4d7ceSDavid van Moolenbroek * This routine always resets or exits. The flag haderr
316*d1e4d7ceSDavid van Moolenbroek * is set so the routine who catches the unwind can propogate
317*d1e4d7ceSDavid van Moolenbroek * it if they want.
318*d1e4d7ceSDavid van Moolenbroek *
319*d1e4d7ceSDavid van Moolenbroek * Note that any open files at the point of error will eventually
320*d1e4d7ceSDavid van Moolenbroek * be closed in the routine process in sh.c which is the only
321*d1e4d7ceSDavid van Moolenbroek * place error unwinds are ever caught.
322*d1e4d7ceSDavid van Moolenbroek */
323*d1e4d7ceSDavid van Moolenbroek void
stderror(int id,...)324*d1e4d7ceSDavid van Moolenbroek stderror(int id, ...)
325*d1e4d7ceSDavid van Moolenbroek {
326*d1e4d7ceSDavid van Moolenbroek va_list va;
327*d1e4d7ceSDavid van Moolenbroek Char **v;
328*d1e4d7ceSDavid van Moolenbroek int flags;
329*d1e4d7ceSDavid van Moolenbroek
330*d1e4d7ceSDavid van Moolenbroek flags = id & ERR_FLAGS;
331*d1e4d7ceSDavid van Moolenbroek id &= ~ERR_FLAGS;
332*d1e4d7ceSDavid van Moolenbroek
333*d1e4d7ceSDavid van Moolenbroek if ((flags & ERR_OLD) && seterr == NULL)
334*d1e4d7ceSDavid van Moolenbroek abort();
335*d1e4d7ceSDavid van Moolenbroek
336*d1e4d7ceSDavid van Moolenbroek if (id < 0 || id > (int)(sizeof(errorlist) / sizeof(errorlist[0])))
337*d1e4d7ceSDavid van Moolenbroek id = ERR_INVALID;
338*d1e4d7ceSDavid van Moolenbroek
339*d1e4d7ceSDavid van Moolenbroek (void)fflush(cshout);
340*d1e4d7ceSDavid van Moolenbroek (void)fflush(csherr);
341*d1e4d7ceSDavid van Moolenbroek haderr = 1; /* Now to diagnostic output */
342*d1e4d7ceSDavid van Moolenbroek timflg = 0; /* This isn't otherwise reset */
343*d1e4d7ceSDavid van Moolenbroek
344*d1e4d7ceSDavid van Moolenbroek
345*d1e4d7ceSDavid van Moolenbroek if (!(flags & ERR_SILENT)) {
346*d1e4d7ceSDavid van Moolenbroek if (flags & ERR_NAME)
347*d1e4d7ceSDavid van Moolenbroek (void)fprintf(csherr, "%s: ", bname);
348*d1e4d7ceSDavid van Moolenbroek if ((flags & ERR_OLD))
349*d1e4d7ceSDavid van Moolenbroek /* Old error. */
350*d1e4d7ceSDavid van Moolenbroek (void)fprintf(csherr, "%s.\n", seterr);
351*d1e4d7ceSDavid van Moolenbroek else {
352*d1e4d7ceSDavid van Moolenbroek va_start(va, id);
353*d1e4d7ceSDavid van Moolenbroek (void)vfprintf(csherr, errorlist[id], va);
354*d1e4d7ceSDavid van Moolenbroek va_end(va);
355*d1e4d7ceSDavid van Moolenbroek (void)fprintf(csherr, ".\n");
356*d1e4d7ceSDavid van Moolenbroek }
357*d1e4d7ceSDavid van Moolenbroek }
358*d1e4d7ceSDavid van Moolenbroek
359*d1e4d7ceSDavid van Moolenbroek if (seterr) {
360*d1e4d7ceSDavid van Moolenbroek xfree((ptr_t) seterr);
361*d1e4d7ceSDavid van Moolenbroek seterr = NULL;
362*d1e4d7ceSDavid van Moolenbroek }
363*d1e4d7ceSDavid van Moolenbroek
364*d1e4d7ceSDavid van Moolenbroek if ((v = pargv) != NULL)
365*d1e4d7ceSDavid van Moolenbroek pargv = 0, blkfree(v);
366*d1e4d7ceSDavid van Moolenbroek if ((v = gargv) != NULL)
367*d1e4d7ceSDavid van Moolenbroek gargv = 0, blkfree(v);
368*d1e4d7ceSDavid van Moolenbroek
369*d1e4d7ceSDavid van Moolenbroek (void)fflush(cshout);
370*d1e4d7ceSDavid van Moolenbroek (void)fflush(csherr);
371*d1e4d7ceSDavid van Moolenbroek didfds = 0; /* Forget about 0,1,2 */
372*d1e4d7ceSDavid van Moolenbroek /*
373*d1e4d7ceSDavid van Moolenbroek * Go away if -e or we are a child shell
374*d1e4d7ceSDavid van Moolenbroek */
375*d1e4d7ceSDavid van Moolenbroek if (exiterr || child)
376*d1e4d7ceSDavid van Moolenbroek xexit(1);
377*d1e4d7ceSDavid van Moolenbroek
378*d1e4d7ceSDavid van Moolenbroek /*
379*d1e4d7ceSDavid van Moolenbroek * Reset the state of the input. This buffered seek to end of file will
380*d1e4d7ceSDavid van Moolenbroek * also clear the while/foreach stack.
381*d1e4d7ceSDavid van Moolenbroek */
382*d1e4d7ceSDavid van Moolenbroek btoeof();
383*d1e4d7ceSDavid van Moolenbroek
384*d1e4d7ceSDavid van Moolenbroek set(STRstatus, Strsave(STR1));
385*d1e4d7ceSDavid van Moolenbroek if (tpgrp > 0)
386*d1e4d7ceSDavid van Moolenbroek (void)tcsetpgrp(FSHTTY, tpgrp);
387*d1e4d7ceSDavid van Moolenbroek reset(); /* Unwind */
388*d1e4d7ceSDavid van Moolenbroek }
389