Imported from ../bash-2.0.tar.gz.
This commit is contained in:
parent
726f63884d
commit
ccc6cda312
502 changed files with 91988 additions and 69123 deletions
282
error.c
282
error.c
|
@ -17,12 +17,22 @@
|
|||
with Bash; see the file COPYING. If not, write to the Free Software
|
||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#if defined (HAVE_VFPRINTF)
|
||||
#include <varargs.h>
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
# include <stdarg.h>
|
||||
#else
|
||||
# if defined (PREFER_VARARGS)
|
||||
# include <varargs.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
@ -35,32 +45,53 @@ extern int errno;
|
|||
#include "error.h"
|
||||
#include "command.h"
|
||||
#include "general.h"
|
||||
#include "externs.h"
|
||||
#include "input.h"
|
||||
|
||||
extern int interactive_shell;
|
||||
#if defined (HISTORY)
|
||||
# include "bashhist.h"
|
||||
#endif
|
||||
|
||||
extern int interactive_shell, interactive;
|
||||
extern char *dollar_vars[];
|
||||
extern char *shell_name;
|
||||
extern char *the_current_maintainer;
|
||||
#if defined (JOB_CONTROL)
|
||||
extern pid_t shell_pgrp;
|
||||
extern int give_terminal_to ();
|
||||
#endif /* JOB_CONTROL */
|
||||
|
||||
/* The current maintainer of the shell. You change this in the
|
||||
Makefile. */
|
||||
#if !defined (MAINTAINER)
|
||||
#define MAINTAINER "bash-maintainers@prep.ai.mit.edu"
|
||||
#endif
|
||||
|
||||
char *the_current_maintainer = MAINTAINER;
|
||||
|
||||
/* Return the name of the shell or the shell script for error reporting. */
|
||||
char *
|
||||
get_name_for_error ()
|
||||
{
|
||||
char *name = (char *) NULL;
|
||||
char *name;
|
||||
|
||||
if (!interactive_shell)
|
||||
name = (char *)NULL;
|
||||
if (interactive_shell == 0)
|
||||
name = dollar_vars[0];
|
||||
if (!name && shell_name && *shell_name)
|
||||
if (name == 0 && shell_name && *shell_name)
|
||||
name = base_pathname (shell_name);
|
||||
if (!name)
|
||||
if (name == 0)
|
||||
#if defined (PROGRAM)
|
||||
name = PROGRAM;
|
||||
#else
|
||||
name = "bash";
|
||||
#endif
|
||||
|
||||
return (name);
|
||||
}
|
||||
|
||||
/* Report an error having to do with FILENAME. */
|
||||
/* Report an error having to do with FILENAME. This does not use
|
||||
sys_error so the filename is not interpreted as a printf-style
|
||||
format string. */
|
||||
void
|
||||
file_error (filename)
|
||||
char *filename;
|
||||
|
@ -68,19 +99,31 @@ file_error (filename)
|
|||
report_error ("%s: %s", filename, strerror (errno));
|
||||
}
|
||||
|
||||
#if !defined (HAVE_VFPRINTF)
|
||||
#if !defined (USE_VARARGS)
|
||||
void
|
||||
programming_error (reason, arg1, arg2, arg3, arg4, arg5)
|
||||
char *reason;
|
||||
{
|
||||
char *h;
|
||||
|
||||
#if defined (JOB_CONTROL)
|
||||
give_terminal_to (shell_pgrp);
|
||||
#endif /* JOB_CONTROL */
|
||||
|
||||
report_error (reason, arg1, arg2);
|
||||
|
||||
#if defined (HISTORY)
|
||||
if (remember_on_history)
|
||||
{
|
||||
h = last_history_line ();
|
||||
fprintf (stderr, "last command: %s\n", h ? h : "(null)");
|
||||
}
|
||||
#endif
|
||||
|
||||
fprintf (stderr, "Report this to %s\n", the_current_maintainer);
|
||||
fprintf (stderr, "Stopping myself...");
|
||||
fflush (stderr);
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
|
@ -94,7 +137,34 @@ report_error (format, arg1, arg2, arg3, arg4, arg5)
|
|||
fprintf (stderr, "\n");
|
||||
if (exit_immediately_on_error)
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
parser_error (lineno, format, arg1, arg2, arg3, arg4, arg5);
|
||||
int lineno;
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
char *ename, *iname;
|
||||
|
||||
ename = get_name_for_error ();
|
||||
iname = bash_input.name ? bash_input.name : "stdin";
|
||||
|
||||
if (interactive)
|
||||
fprintf (stderr, "%s: ", ename);
|
||||
else if (interactive_shell)
|
||||
fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno);
|
||||
else if (STREQ (ename, iname))
|
||||
fprintf (stderr, "%s: line %d: ", ename, lineno);
|
||||
else
|
||||
fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno);
|
||||
|
||||
fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
if (exit_immediately_on_error)
|
||||
exit (2);
|
||||
}
|
||||
|
||||
void
|
||||
fatal_error (format, arg1, arg2, arg3, arg4, arg5)
|
||||
|
@ -118,41 +188,78 @@ internal_error (format, arg1, arg2, arg3, arg4, arg5)
|
|||
fprintf (stderr, "\n");
|
||||
}
|
||||
|
||||
void
|
||||
sys_error (format, arg1, arg2, arg3, arg4, arg5)
|
||||
char *format;
|
||||
{
|
||||
fprintf (stderr, "%s: ", get_name_for_error ());
|
||||
|
||||
fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
|
||||
fprintf (stderr, ": %s\n", strerror (errno));
|
||||
}
|
||||
|
||||
#else /* We have VARARGS support, so use it. */
|
||||
|
||||
void
|
||||
programming_error (va_alist)
|
||||
#if defined (PREFER_STDARG)
|
||||
programming_error (const char *format, ...)
|
||||
#else
|
||||
programming_error (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *format;
|
||||
char *h;
|
||||
|
||||
#if defined (JOB_CONTROL)
|
||||
give_terminal_to (shell_pgrp);
|
||||
#endif /* JOB_CONTROL */
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, "\n");
|
||||
va_end (args);
|
||||
|
||||
#if defined (HISTORY)
|
||||
if (remember_on_history)
|
||||
{
|
||||
h = last_history_line ();
|
||||
fprintf (stderr, "last command: %s\n", h ? h : "(null)");
|
||||
}
|
||||
#endif
|
||||
|
||||
fprintf (stderr, "Tell %s to fix this someday.\n", the_current_maintainer);
|
||||
fprintf (stderr, "Stopping myself...");
|
||||
fflush (stderr);
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
void
|
||||
report_error (va_alist)
|
||||
#if defined (PREFER_STDARG)
|
||||
report_error (const char *format, ...)
|
||||
#else
|
||||
report_error (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *format;
|
||||
|
||||
fprintf (stderr, "%s: ", get_name_for_error ());
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
|
@ -162,15 +269,24 @@ report_error (va_alist)
|
|||
}
|
||||
|
||||
void
|
||||
fatal_error (va_alist)
|
||||
#if defined (PREFER_STDARG)
|
||||
fatal_error (const char *format, ...)
|
||||
#else
|
||||
fatal_error (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *format;
|
||||
|
||||
fprintf (stderr, "%s: ", get_name_for_error ());
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
|
@ -179,30 +295,122 @@ fatal_error (va_alist)
|
|||
}
|
||||
|
||||
void
|
||||
internal_error (va_alist)
|
||||
#if defined (PREFER_STDARG)
|
||||
internal_error (const char *format, ...)
|
||||
#else
|
||||
internal_error (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *format;
|
||||
|
||||
fprintf (stderr, "%s: ", get_name_for_error ());
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
itrace (va_alist)
|
||||
void
|
||||
#if defined (PREFER_STDARG)
|
||||
sys_error (const char *format, ...)
|
||||
#else
|
||||
sys_error (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *format;
|
||||
|
||||
fprintf(stderr, "TRACE: pid %d: ", getpid());
|
||||
fprintf (stderr, "%s: ", get_name_for_error ());
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, ": %s\n", strerror (errno));
|
||||
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
/* An error from the parser takes the general form
|
||||
|
||||
shell_name: input file name: line number: message
|
||||
|
||||
The input file name and line number are omitted if the shell is
|
||||
currently interactive. If the shell is not currently interactive,
|
||||
the input file name is inserted only if it is different from the
|
||||
shell name. */
|
||||
void
|
||||
#if defined (PREFER_STDARG)
|
||||
parser_error (int lineno, const char *format, ...)
|
||||
#else
|
||||
parser_error (lineno, format, va_alist)
|
||||
int lineno;
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *ename, *iname;
|
||||
|
||||
ename = get_name_for_error ();
|
||||
iname = bash_input.name ? bash_input.name : "stdin";
|
||||
|
||||
if (interactive)
|
||||
fprintf (stderr, "%s: ", ename);
|
||||
else if (interactive_shell)
|
||||
fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno);
|
||||
else if (STREQ (ename, iname))
|
||||
fprintf (stderr, "%s: line %d: ", ename, lineno);
|
||||
else
|
||||
fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno);
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
va_end (args);
|
||||
|
||||
if (exit_immediately_on_error)
|
||||
exit (2);
|
||||
}
|
||||
|
||||
void
|
||||
#if defined (PREFER_STDARG)
|
||||
itrace (const char *format, ...)
|
||||
#else
|
||||
itrace (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
|
||||
fprintf(stderr, "TRACE: pid %d: ", (int)getpid());
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
#endif
|
||||
|
||||
vfprintf (stderr, format, args);
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
|
@ -214,11 +422,16 @@ itrace (va_alist)
|
|||
#if 0
|
||||
/* A trace function for silent debugging -- doesn't require a control
|
||||
terminal. */
|
||||
trace (va_alist)
|
||||
void
|
||||
#if defined (PREFER_STDARG)
|
||||
trace (const char *format, ...)
|
||||
#else
|
||||
trace (format, va_alist)
|
||||
const char *format;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
char *format;
|
||||
static FILE *tracefp = (FILE *)NULL;
|
||||
|
||||
if (tracefp == NULL)
|
||||
|
@ -231,8 +444,12 @@ trace (va_alist)
|
|||
|
||||
fprintf(tracefp, "TRACE: pid %d: ", getpid());
|
||||
|
||||
#if defined (PREFER_STDARG)
|
||||
va_start (args, format);
|
||||
#else
|
||||
va_start (args);
|
||||
format = va_arg (args, char *);
|
||||
#endif
|
||||
|
||||
vfprintf (tracefp, format, args);
|
||||
fprintf (tracefp, "\n");
|
||||
|
||||
|
@ -240,5 +457,6 @@ trace (va_alist)
|
|||
|
||||
fflush(tracefp);
|
||||
}
|
||||
#endif
|
||||
#endif /* HAVE_VFPRINTF */
|
||||
#endif /* 0 */
|
||||
|
||||
#endif /* USE_VARARGS */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue