diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/error.c | 76 | ||||
-rw-r--r-- | lib/error.h | 57 |
2 files changed, 89 insertions, 44 deletions
diff --git a/lib/error.c b/lib/error.c index e5f1daba4..66a484431 100644 --- a/lib/error.c +++ b/lib/error.c @@ -1,10 +1,14 @@ -/* error.c -- error handler for noninteractive utilities - Copyright (C) 1990, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc. +/* Error handler for noninteractive utilities + Copyright (C) 1990,91,92,93,94,95,96,97 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,13 +16,14 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ /* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */ -#if HAVE_CONFIG_H -# include <config.h> +#ifdef HAVE_CONFIG_H +#include <config.h> #endif #include <stdio.h> @@ -43,13 +48,12 @@ void exit (); #endif +#include "error.h" + #ifndef _ -# define _(String) String +#define _(String) String #endif -/* Get prototypes for the functions defined here. */ -#include <error.h> - /* If NULL, error will flush stdout, then print on stderr the program name, a colon and a space. Otherwise, error will call this function without parameters instead. */ @@ -65,15 +69,21 @@ unsigned int error_message_count; #ifdef _LIBC /* In the GNU C library, there is a predefined variable for this. */ -# define program_name program_invocation_name -# include <errno.h> +#define program_name program_invocation_name +#include <errno.h> -#else /* not _LIBC */ +/* In GNU libc we want do not want to use the common name `error' directly. + Instead make it a weak alias. */ +#define error __error +#define error_at_line __error_at_line + +#else /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; +#ifndef HAVE_STRERROR_R # if HAVE_STRERROR # ifndef strerror /* On some systems, strerror is a macro */ char *strerror (); @@ -87,13 +97,13 @@ private_strerror (errnum) extern int sys_nerr; if (errnum > 0 && errnum <= sys_nerr) - return sys_errlist[errnum]; + return _(sys_errlist[errnum]); return _("Unknown system error"); } # define strerror private_strerror # endif /* HAVE_STRERROR */ - -#endif /* not _LIBC */ +#endif /* HAVE_STRERROR_R */ +#endif /* _LIBC */ /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. @@ -138,7 +148,14 @@ error (status, errnum, message, va_alist) ++error_message_count; if (errnum) - fprintf (stderr, ": %s", strerror (errnum)); + { +#if defined HAVE_STRERROR_R || defined _LIBC + char errbuf[1024]; + fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf)); +#else + fprintf (stderr, ": %s", strerror (errnum)); +#endif + } putc ('\n', stderr); fflush (stderr); if (status) @@ -206,9 +223,24 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist) ++error_message_count; if (errnum) - fprintf (stderr, ": %s", strerror (errnum)); + { +#if defined HAVE_STRERROR_R || defined _LIBC + char errbuf[1024]; + fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf)); +#else + fprintf (stderr, ": %s", strerror (errnum)); +#endif + } putc ('\n', stderr); fflush (stderr); if (status) exit (status); } + +#ifdef _LIBC +/* Make the weak alias. */ +#undef error +#undef error_at_line +weak_alias (__error, error) +weak_alias (__error_at_line, error_at_line) +#endif diff --git a/lib/error.h b/lib/error.h index 7a803d0c1..20f75824d 100644 --- a/lib/error.h +++ b/lib/error.h @@ -1,10 +1,14 @@ -/* error.h -- declaration for error-reporting function - Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Declaration for error-reporting function + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,26 +16,31 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ -#ifndef ERROR_H_ -# define ERROR_H_ +#ifndef _ERROR_H +#define _ERROR_H 1 -# ifndef __attribute__ +#ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ -# define __attribute__(Spec) /* empty */ -# endif +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) -# define __format__ format -# define __printf__ printf -# endif +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf # endif +#endif -# if defined (__STDC__) && __STDC__ +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (__STDC__) && __STDC__ /* Print a message with `fprintf (stderr, FORMAT, ...)'; if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). @@ -49,11 +58,11 @@ extern void error_at_line (int status, int errnum, const char *fname, function without parameters instead. */ extern void (*error_print_progname) (void); -# else +#else void error (); void error_at_line (); extern void (*error_print_progname) (); -# endif +#endif /* This variable is incremented each time `error' is called. */ extern unsigned int error_message_count; @@ -62,4 +71,8 @@ extern unsigned int error_message_count; variable controls whether this mode is selected or not. */ extern int error_one_per_line; -#endif /* not ERROR_H_ */ +#ifdef __cplusplus +} +#endif + +#endif /* error.h */ |