xref: /minix3/bin/csh/err.c (revision d1e4d7ce7de96b58a7e34cb41f3fd9aa036d9692)
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