1 /* error.c -- Functions for handling errors. */
3 /* Copyright (C) 1993-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
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.
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.
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/>.
23 #include "bashtypes.h"
26 #if defined (HAVE_UNISTD_H)
30 #if defined (PREFER_STDARG)
51 # include "bashhist.h"
54 extern int executing_line_number
__P((void));
56 extern char *shell_name
;
57 #if defined (JOB_CONTROL)
58 extern pid_t shell_pgrp
;
59 extern int give_terminal_to
__P((pid_t
, int));
60 #endif /* JOB_CONTROL */
62 #if defined (ARRAY_VARS)
63 extern const char * const bash_badsub_errmsg
;
66 static void error_prolog
__P((int));
68 /* The current maintainer of the shell. You change this in the
70 #if !defined (MAINTAINER)
71 #define MAINTAINER "bash-maintainers@gnu.org"
74 const char * const the_current_maintainer
= MAINTAINER
;
76 int gnu_error_format
= 0;
79 error_prolog (print_lineno
)
85 ename
= get_name_for_error ();
86 line
= (print_lineno
&& interactive_shell
== 0) ? executing_line_number () : -1;
89 fprintf (stderr
, "%s:%s%d: ", ename
, gnu_error_format
? "" : _(" line "), line
);
91 fprintf (stderr
, "%s: ", ename
);
94 /* Return the name of the shell or the shell script for error reporting. */
99 #if defined (ARRAY_VARS)
100 SHELL_VAR
*bash_source_v
;
101 ARRAY
*bash_source_a
;
105 if (interactive_shell
== 0)
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);
112 if (name
== 0 || *name
== '\0') /* XXX - was just name == 0 */
114 name
= dollar_vars
[0];
116 if (name
== 0 && shell_name
&& *shell_name
)
117 name
= base_pathname (shell_name
);
119 #if defined (PROGRAM)
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
132 file_error (filename
)
133 const char *filename
;
135 report_error ("%s: %s", filename
, strerror (errno
));
139 #if defined (PREFER_STDARG)
140 programming_error (const char *format
, ...)
142 programming_error (format
, va_alist
)
150 #if defined (JOB_CONTROL)
151 give_terminal_to (shell_pgrp
, 0);
152 #endif /* JOB_CONTROL */
154 SH_VA_START (args
, format
);
156 vfprintf (stderr
, format
, args
);
157 fprintf (stderr
, "\n");
160 #if defined (HISTORY)
161 if (remember_on_history
)
163 h
= last_history_line ();
164 fprintf (stderr
, _("last command: %s\n"), h
? h
: "(null)");
169 fprintf (stderr
, "Report this to %s\n", the_current_maintainer
);
172 fprintf (stderr
, _("Aborting..."));
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. */
183 #if defined (PREFER_STDARG)
184 report_error (const char *format
, ...)
186 report_error (format
, va_alist
)
195 SH_VA_START (args
, format
);
197 vfprintf (stderr
, format
, args
);
198 fprintf (stderr
, "\n");
201 if (exit_immediately_on_error
)
206 #if defined (PREFER_STDARG)
207 fatal_error (const char *format
, ...)
209 fatal_error (format
, va_alist
)
218 SH_VA_START (args
, format
);
220 vfprintf (stderr
, format
, args
);
221 fprintf (stderr
, "\n");
228 #if defined (PREFER_STDARG)
229 internal_error (const char *format
, ...)
231 internal_error (format
, va_alist
)
240 SH_VA_START (args
, format
);
242 vfprintf (stderr
, format
, args
);
243 fprintf (stderr
, "\n");
249 #if defined (PREFER_STDARG)
250 internal_warning (const char *format
, ...)
252 internal_warning (format
, va_alist
)
260 fprintf (stderr
, _("warning: "));
262 SH_VA_START (args
, format
);
264 vfprintf (stderr
, format
, args
);
265 fprintf (stderr
, "\n");
271 #if defined (PREFER_STDARG)
272 sys_error (const char *format
, ...)
274 sys_error (format
, va_alist
)
285 SH_VA_START (args
, format
);
287 vfprintf (stderr
, format
, args
);
288 fprintf (stderr
, ": %s\n", strerror (e
));
293 /* An error from the parser takes the general form
295 shell_name: input file name: line number: message
297 The input file name and line number are omitted if the shell is
298 currently interactive. If the shell is not currently interactive,
299 the input file name is inserted only if it is different from the
302 #if defined (PREFER_STDARG)
303 parser_error (int lineno
, const char *format
, ...)
305 parser_error (lineno
, format
, va_alist
)
314 ename
= get_name_for_error ();
315 iname
= yy_input_name ();
318 fprintf (stderr
, "%s: ", ename
);
319 else if (interactive_shell
)
320 fprintf (stderr
, "%s: %s:%s%d: ", ename
, iname
, gnu_error_format
? "" : _(" line "), lineno
);
321 else if (STREQ (ename
, iname
))
322 fprintf (stderr
, "%s:%s%d: ", ename
, gnu_error_format
? "" : _(" line "), lineno
);
324 fprintf (stderr
, "%s: %s:%s%d: ", ename
, iname
, gnu_error_format
? "" : _(" line "), lineno
);
326 SH_VA_START (args
, format
);
328 vfprintf (stderr
, format
, args
);
329 fprintf (stderr
, "\n");
333 if (exit_immediately_on_error
)
339 #if defined (PREFER_STDARG)
340 itrace (const char *format
, ...)
342 itrace (format
, va_alist
)
349 fprintf(stderr
, "TRACE: pid %ld: ", (long)getpid());
351 SH_VA_START (args
, format
);
353 vfprintf (stderr
, format
, args
);
354 fprintf (stderr
, "\n");
361 /* A trace function for silent debugging -- doesn't require a control
364 #if defined (PREFER_STDARG)
365 trace (const char *format
, ...)
367 trace (format
, va_alist
)
373 static FILE *tracefp
= (FILE *)NULL
;
376 tracefp
= fopen("/tmp/bash-trace.log", "a+");
381 fcntl (fileno (tracefp
), F_SETFD
, 1); /* close-on-exec */
383 fprintf(tracefp
, "TRACE: pid %ld: ", (long)getpid());
385 SH_VA_START (args
, format
);
387 vfprintf (tracefp
, format
, args
);
388 fprintf (tracefp
, "\n");
397 /* **************************************************************** */
399 /* Common error reporting */
401 /* **************************************************************** */
404 static const char * const cmd_error_table
[] = {
405 N_("unknown command error"), /* CMDERR_DEFAULT */
406 N_("bad command type"), /* CMDERR_BADTYPE */
407 N_("bad connector"), /* CMDERR_BADCONN */
408 N_("bad jump"), /* CMDERR_BADJUMP */
413 command_error (func
, code
, e
, flags
)
415 int code
, e
, flags
; /* flags currently unused */
417 if (code
> CMDERR_LAST
)
418 code
= CMDERR_DEFAULT
;
420 programming_error ("%s: %s: %d", func
, _(cmd_error_table
[code
]), e
);
424 command_errstr (code
)
427 if (code
> CMDERR_LAST
)
428 code
= CMDERR_DEFAULT
;
430 return (_(cmd_error_table
[code
]));
438 report_error ("%s: %s", s
, _(bash_badsub_errmsg
));
446 report_error (_("%s: unbound variable"), s
);
453 report_error (_("%s: readonly variable"), s
);