X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ferror.c;h=4eff5d0f9d801bf037454948b4333cf5e73cb6e1;hb=98bc67b465ac090234038302966c7743587e321e;hp=b167b830c9278d12eea84794e2377844f228cf07;hpb=552dcada1af3c14c4d357bff0ffff55ce4183102;p=gnulib.git diff --git a/lib/error.c b/lib/error.c index b167b830c..4eff5d0f9 100644 --- a/lib/error.c +++ b/lib/error.c @@ -1,23 +1,27 @@ -/* 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,98 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. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. - This program is distributed in the hope that it will be useful, + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library 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. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* Written by David MacKenzie . */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -43,13 +47,12 @@ void exit (); #endif +#include "error.h" + #ifndef _ # define _(String) String #endif -/* Get prototypes for the functions defined here. */ -#include - /* 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. */ @@ -68,17 +71,25 @@ unsigned int error_message_count; # define program_name program_invocation_name # include -#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 /* not _LIBC */ /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; -# if HAVE_STRERROR -# ifndef strerror /* On some systems, strerror is a macro */ -char *strerror (); -# endif +# ifdef HAVE_STRERROR_R +# define __strerror_r strerror_r # else +# if HAVE_STRERROR +# ifndef strerror /* On some systems, strerror is a macro */ +char *strerror (); +# endif +# else static char * private_strerror (errnum) int errnum; @@ -87,11 +98,12 @@ 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 */ +# define strerror private_strerror +# endif /* HAVE_STRERROR */ +# endif /* HAVE_STRERROR_R */ #endif /* not _LIBC */ /* Print the program name and error message MESSAGE, which is a printf-style @@ -101,7 +113,7 @@ private_strerror (errnum) /* VARARGS */ void -#if defined(VA_START) && __STDC__ +#if defined VA_START && __STDC__ error (int status, int errnum, const char *message, ...) #else error (status, errnum, message, va_alist) @@ -137,7 +149,17 @@ 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]; + /* Don't use __strerror_r's return value because on some systems + (at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */ + __strerror_r (errnum, errbuf, sizeof errbuf); + fprintf (stderr, ": %s", errbuf); +#else + fprintf (stderr, ": %s", strerror (errnum)); +#endif + } putc ('\n', stderr); fflush (stderr); if (status) @@ -149,7 +171,7 @@ error (status, errnum, message, va_alist) int error_one_per_line; void -#if defined(VA_START) && __STDC__ +#if defined VA_START && __STDC__ error_at_line (int status, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) #else @@ -205,9 +227,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