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