]> git.ipfire.org Git - thirdparty/bash.git/blame - error.c
Bash-5.0 patch 4: the wait builtin without arguments only waits for known children...
[thirdparty/bash.git] / error.c
CommitLineData
726f6388 1/* error.c -- Functions for handling errors. */
3185942a
JA
2
3/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
726f6388
JA
4
5 This file is part of GNU Bash, the Bourne Again SHell.
6
3185942a
JA
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
726f6388 11
3185942a
JA
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
726f6388 16
3185942a
JA
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
726f6388 20
ccc6cda3
JA
21#include "config.h"
22
d166f048 23#include "bashtypes.h"
726f6388
JA
24#include <fcntl.h>
25
ccc6cda3
JA
26#if defined (HAVE_UNISTD_H)
27# include <unistd.h>
28#endif
29
30#if defined (PREFER_STDARG)
31# include <stdarg.h>
32#else
7117c2d2 33# include <varargs.h>
726f6388
JA
34#endif
35
d166f048
JA
36#include <stdio.h>
37
726f6388
JA
38#include <errno.h>
39#if !defined (errno)
40extern int errno;
41#endif /* !errno */
42
43#include "bashansi.h"
b80f6443
JA
44#include "bashintl.h"
45
46#include "shell.h"
d233b485 47#include "execute_cmd.h"
726f6388 48#include "flags.h"
ccc6cda3 49#include "input.h"
726f6388 50
ccc6cda3
JA
51#if defined (HISTORY)
52# include "bashhist.h"
53#endif
54
7117c2d2
JA
55extern int executing_line_number __P((void));
56
726f6388
JA
57#if defined (JOB_CONTROL)
58extern pid_t shell_pgrp;
f73dda09 59extern int give_terminal_to __P((pid_t, int));
726f6388
JA
60#endif /* JOB_CONTROL */
61
b80f6443 62#if defined (ARRAY_VARS)
3185942a 63extern const char * const bash_badsub_errmsg;
b80f6443
JA
64#endif
65
7117c2d2
JA
66static void error_prolog __P((int));
67
ccc6cda3
JA
68/* The current maintainer of the shell. You change this in the
69 Makefile. */
70#if !defined (MAINTAINER)
bb70624e 71#define MAINTAINER "bash-maintainers@gnu.org"
ccc6cda3
JA
72#endif
73
3185942a 74const char * const the_current_maintainer = MAINTAINER;
ccc6cda3 75
b80f6443
JA
76int gnu_error_format = 0;
77
7117c2d2
JA
78static void
79error_prolog (print_lineno)
80 int print_lineno;
81{
b80f6443 82 char *ename;
7117c2d2
JA
83 int line;
84
b80f6443
JA
85 ename = get_name_for_error ();
86 line = (print_lineno && interactive_shell == 0) ? executing_line_number () : -1;
7117c2d2 87
b80f6443 88 if (line > 0)
3185942a 89 fprintf (stderr, "%s:%s%d: ", ename, gnu_error_format ? "" : _(" line "), line);
b80f6443
JA
90 else
91 fprintf (stderr, "%s: ", ename);
7117c2d2
JA
92}
93
726f6388
JA
94/* Return the name of the shell or the shell script for error reporting. */
95char *
96get_name_for_error ()
97{
ccc6cda3 98 char *name;
b80f6443
JA
99#if defined (ARRAY_VARS)
100 SHELL_VAR *bash_source_v;
101 ARRAY *bash_source_a;
102#endif
726f6388 103
ccc6cda3
JA
104 name = (char *)NULL;
105 if (interactive_shell == 0)
b80f6443
JA
106 {
107#if defined (ARRAY_VARS)
108 bash_source_v = find_variable ("BASH_SOURCE");
109 if (bash_source_v && array_p (bash_source_v) &&
110 (bash_source_a = array_cell (bash_source_v)))
111 name = array_reference (bash_source_a, 0);
3185942a 112 if (name == 0 || *name == '\0') /* XXX - was just name == 0 */
b80f6443
JA
113#endif
114 name = dollar_vars[0];
115 }
ccc6cda3 116 if (name == 0 && shell_name && *shell_name)
726f6388 117 name = base_pathname (shell_name);
ccc6cda3
JA
118 if (name == 0)
119#if defined (PROGRAM)
120 name = PROGRAM;
121#else
726f6388 122 name = "bash";
ccc6cda3 123#endif
726f6388
JA
124
125 return (name);
126}
127
ccc6cda3
JA
128/* Report an error having to do with FILENAME. This does not use
129 sys_error so the filename is not interpreted as a printf-style
130 format string. */
726f6388
JA
131void
132file_error (filename)
f73dda09 133 const char *filename;
726f6388
JA
134{
135 report_error ("%s: %s", filename, strerror (errno));
136}
137
726f6388 138void
ccc6cda3
JA
139#if defined (PREFER_STDARG)
140programming_error (const char *format, ...)
141#else
142programming_error (format, va_alist)
143 const char *format;
726f6388 144 va_dcl
ccc6cda3 145#endif
726f6388
JA
146{
147 va_list args;
ccc6cda3 148 char *h;
726f6388
JA
149
150#if defined (JOB_CONTROL)
f73dda09 151 give_terminal_to (shell_pgrp, 0);
726f6388
JA
152#endif /* JOB_CONTROL */
153
7117c2d2 154 SH_VA_START (args, format);
ccc6cda3 155
726f6388
JA
156 vfprintf (stderr, format, args);
157 fprintf (stderr, "\n");
158 va_end (args);
159
ccc6cda3
JA
160#if defined (HISTORY)
161 if (remember_on_history)
162 {
163 h = last_history_line ();
b80f6443 164 fprintf (stderr, _("last command: %s\n"), h ? h : "(null)");
ccc6cda3
JA
165 }
166#endif
167
bb70624e 168#if 0
d166f048 169 fprintf (stderr, "Report this to %s\n", the_current_maintainer);
bb70624e
JA
170#endif
171
b80f6443 172 fprintf (stderr, _("Aborting..."));
726f6388 173 fflush (stderr);
ccc6cda3 174
726f6388
JA
175 abort ();
176}
177
7117c2d2
JA
178/* Print an error message and, if `set -e' has been executed, exit the
179 shell. Used in this file by file_error and programming_error. Used
180 outside this file mostly to report substitution and expansion errors,
181 and for bad invocation options. */
726f6388 182void
ccc6cda3
JA
183#if defined (PREFER_STDARG)
184report_error (const char *format, ...)
185#else
186report_error (format, va_alist)
187 const char *format;
726f6388 188 va_dcl
ccc6cda3 189#endif
726f6388
JA
190{
191 va_list args;
726f6388 192
7117c2d2 193 error_prolog (1);
ccc6cda3 194
7117c2d2 195 SH_VA_START (args, format);
ccc6cda3 196
726f6388
JA
197 vfprintf (stderr, format, args);
198 fprintf (stderr, "\n");
199
200 va_end (args);
201 if (exit_immediately_on_error)
98043138
CR
202 {
203 if (last_command_exit_value == 0)
204 last_command_exit_value = 1;
205 exit_shell (last_command_exit_value);
206 }
726f6388
JA
207}
208
209void
ccc6cda3
JA
210#if defined (PREFER_STDARG)
211fatal_error (const char *format, ...)
212#else
213fatal_error (format, va_alist)
214 const char *format;
726f6388 215 va_dcl
ccc6cda3 216#endif
726f6388
JA
217{
218 va_list args;
726f6388 219
7117c2d2 220 error_prolog (0);
ccc6cda3 221
7117c2d2 222 SH_VA_START (args, format);
ccc6cda3 223
726f6388
JA
224 vfprintf (stderr, format, args);
225 fprintf (stderr, "\n");
226
227 va_end (args);
7117c2d2 228 sh_exit (2);
726f6388
JA
229}
230
231void
ccc6cda3
JA
232#if defined (PREFER_STDARG)
233internal_error (const char *format, ...)
234#else
235internal_error (format, va_alist)
236 const char *format;
237 va_dcl
238#endif
239{
240 va_list args;
241
7117c2d2 242 error_prolog (1);
ccc6cda3 243
7117c2d2 244 SH_VA_START (args, format);
ccc6cda3
JA
245
246 vfprintf (stderr, format, args);
247 fprintf (stderr, "\n");
248
249 va_end (args);
250}
251
cce855bc
JA
252void
253#if defined (PREFER_STDARG)
254internal_warning (const char *format, ...)
255#else
256internal_warning (format, va_alist)
257 const char *format;
258 va_dcl
259#endif
260{
261 va_list args;
262
3185942a
JA
263 error_prolog (1);
264 fprintf (stderr, _("warning: "));
cce855bc 265
7117c2d2 266 SH_VA_START (args, format);
cce855bc
JA
267
268 vfprintf (stderr, format, args);
269 fprintf (stderr, "\n");
270
271 va_end (args);
272}
273
a0c0a00f
CR
274void
275#if defined (PREFER_STDARG)
276internal_inform (const char *format, ...)
277#else
278internal_inform (format, va_alist)
279 const char *format;
280 va_dcl
281#endif
282{
283 va_list args;
284
285 error_prolog (1);
286 /* TRANSLATORS: this is a prefix for informational messages. */
287 fprintf (stderr, _("INFORM: "));
288
289 SH_VA_START (args, format);
290
291 vfprintf (stderr, format, args);
292 fprintf (stderr, "\n");
293
294 va_end (args);
295}
296
ccc6cda3
JA
297void
298#if defined (PREFER_STDARG)
299sys_error (const char *format, ...)
300#else
301sys_error (format, va_alist)
302 const char *format;
726f6388 303 va_dcl
ccc6cda3 304#endif
726f6388 305{
7117c2d2 306 int e;
726f6388 307 va_list args;
726f6388 308
7117c2d2
JA
309 e = errno;
310 error_prolog (0);
ccc6cda3 311
7117c2d2 312 SH_VA_START (args, format);
ccc6cda3
JA
313
314 vfprintf (stderr, format, args);
7117c2d2 315 fprintf (stderr, ": %s\n", strerror (e));
ccc6cda3
JA
316
317 va_end (args);
318}
319
320/* An error from the parser takes the general form
321
322 shell_name: input file name: line number: message
323
324 The input file name and line number are omitted if the shell is
325 currently interactive. If the shell is not currently interactive,
326 the input file name is inserted only if it is different from the
327 shell name. */
328void
329#if defined (PREFER_STDARG)
330parser_error (int lineno, const char *format, ...)
331#else
332parser_error (lineno, format, va_alist)
333 int lineno;
334 const char *format;
335 va_dcl
336#endif
337{
338 va_list args;
339 char *ename, *iname;
340
341 ename = get_name_for_error ();
7117c2d2 342 iname = yy_input_name ();
ccc6cda3
JA
343
344 if (interactive)
345 fprintf (stderr, "%s: ", ename);
346 else if (interactive_shell)
3185942a 347 fprintf (stderr, "%s: %s:%s%d: ", ename, iname, gnu_error_format ? "" : _(" line "), lineno);
ccc6cda3 348 else if (STREQ (ename, iname))
3185942a 349 fprintf (stderr, "%s:%s%d: ", ename, gnu_error_format ? "" : _(" line "), lineno);
ccc6cda3 350 else
3185942a 351 fprintf (stderr, "%s: %s:%s%d: ", ename, iname, gnu_error_format ? "" : _(" line "), lineno);
ccc6cda3 352
7117c2d2 353 SH_VA_START (args, format);
ccc6cda3 354
726f6388
JA
355 vfprintf (stderr, format, args);
356 fprintf (stderr, "\n");
357
358 va_end (args);
ccc6cda3
JA
359
360 if (exit_immediately_on_error)
0001803f 361 exit_shell (last_command_exit_value = 2);
726f6388
JA
362}
363
28ef6c31 364#ifdef DEBUG
ac50fbac
CR
365/* This assumes ASCII and is suitable only for debugging */
366char *
367strescape (str)
368 const char *str;
369{
370 char *r, *result;
371 unsigned char *s;
372
373 r = result = (char *)xmalloc (strlen (str) * 2 + 1);
374
375 for (s = (unsigned char *)str; s && *s; s++)
376 {
377 if (*s < ' ')
378 {
379 *r++ = '^';
380 *r++ = *s+64;
381 }
382 else if (*s == 127)
383 {
384 *r++ = '^';
385 *r++ = '?';
386 }
387 else
388 *r++ = *s;
389 }
390
391 *r = '\0';
392 return result;
393}
394
ccc6cda3
JA
395void
396#if defined (PREFER_STDARG)
397itrace (const char *format, ...)
398#else
399itrace (format, va_alist)
400 const char *format;
726f6388 401 va_dcl
ccc6cda3 402#endif
726f6388
JA
403{
404 va_list args;
726f6388 405
f73dda09 406 fprintf(stderr, "TRACE: pid %ld: ", (long)getpid());
ccc6cda3 407
7117c2d2 408 SH_VA_START (args, format);
ccc6cda3 409
726f6388
JA
410 vfprintf (stderr, format, args);
411 fprintf (stderr, "\n");
412
413 va_end (args);
414
415 fflush(stderr);
416}
417
726f6388
JA
418/* A trace function for silent debugging -- doesn't require a control
419 terminal. */
ccc6cda3
JA
420void
421#if defined (PREFER_STDARG)
422trace (const char *format, ...)
423#else
424trace (format, va_alist)
425 const char *format;
726f6388 426 va_dcl
ccc6cda3 427#endif
726f6388
JA
428{
429 va_list args;
726f6388
JA
430 static FILE *tracefp = (FILE *)NULL;
431
432 if (tracefp == NULL)
bb70624e 433 tracefp = fopen("/tmp/bash-trace.log", "a+");
726f6388
JA
434
435 if (tracefp == NULL)
436 tracefp = stderr;
437 else
438 fcntl (fileno (tracefp), F_SETFD, 1); /* close-on-exec */
439
f73dda09 440 fprintf(tracefp, "TRACE: pid %ld: ", (long)getpid());
726f6388 441
7117c2d2 442 SH_VA_START (args, format);
ccc6cda3 443
726f6388
JA
444 vfprintf (tracefp, format, args);
445 fprintf (tracefp, "\n");
446
447 va_end (args);
448
449 fflush(tracefp);
450}
ccc6cda3 451
28ef6c31 452#endif /* DEBUG */
b72432fd 453
7117c2d2
JA
454/* **************************************************************** */
455/* */
456/* Common error reporting */
457/* */
458/* **************************************************************** */
459
460
3185942a 461static const char * const cmd_error_table[] = {
b80f6443
JA
462 N_("unknown command error"), /* CMDERR_DEFAULT */
463 N_("bad command type"), /* CMDERR_BADTYPE */
464 N_("bad connector"), /* CMDERR_BADCONN */
465 N_("bad jump"), /* CMDERR_BADJUMP */
b72432fd
JA
466 0
467};
468
469void
470command_error (func, code, e, flags)
471 const char *func;
472 int code, e, flags; /* flags currently unused */
473{
474 if (code > CMDERR_LAST)
475 code = CMDERR_DEFAULT;
476
b80f6443 477 programming_error ("%s: %s: %d", func, _(cmd_error_table[code]), e);
b72432fd
JA
478}
479
480char *
481command_errstr (code)
482 int code;
483{
484 if (code > CMDERR_LAST)
485 code = CMDERR_DEFAULT;
486
b80f6443 487 return (_(cmd_error_table[code]));
b72432fd 488}
7117c2d2
JA
489
490#ifdef ARRAY_VARS
491void
492err_badarraysub (s)
493 const char *s;
494{
b80f6443 495 report_error ("%s: %s", s, _(bash_badsub_errmsg));
7117c2d2
JA
496}
497#endif
498
499void
500err_unboundvar (s)
501 const char *s;
502{
b80f6443 503 report_error (_("%s: unbound variable"), s);
7117c2d2
JA
504}
505
506void
507err_readonly (s)
508 const char *s;
509{
b80f6443 510 report_error (_("%s: readonly variable"), s);
7117c2d2 511}