From: Paul Eggert Date: Fri, 6 Dec 2002 08:08:13 +0000 (+0000) Subject: import from gnulib X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=4f5e37c861a0c11c26613334e470bc18d34ee872;p=chaz%2Ftar import from gnulib --- diff --git a/lib/error.c b/lib/error.c index aa0d8bb..18c779e 100644 --- a/lib/error.c +++ b/lib/error.c @@ -1,22 +1,18 @@ /* Error handler for noninteractive utilities - Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc. - 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. + Copyright (C) 1990-1998, 2000, 2001, 2002 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. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, + This program 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 - Lesser General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; 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 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. */ /* Written by David MacKenzie . */ @@ -25,7 +21,13 @@ #endif #include -#include + +#ifdef _LIBC +# include +#else +# include "gettext.h" +#endif + #ifdef _LIBC # include # define mbsrtowcs __mbsrtowcs @@ -53,6 +55,10 @@ void exit (); #include "error.h" +#if !_LIBC +# include "unlocked-io.h" +#endif + #ifndef _ # define _(String) String #endif @@ -74,6 +80,7 @@ unsigned int error_message_count; # define program_name program_invocation_name # include +# include /* In GNU libc we want do not want to use the common name `error' directly. Instead make it a weak alias. */ @@ -87,27 +94,38 @@ extern void __error_at_line (int status, int errnum, const char *file_name, # define error_at_line __error_at_line # ifdef USE_IN_LIBIO -# include -# define fflush(s) _IO_fflush (s) +# include +# define fflush(s) INTUSE(_IO_fflush) (s) +# undef putc +# define putc(c, fp) INTUSE(_IO_putc) (c, fp) # endif #else /* not _LIBC */ +# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P +# ifndef HAVE_DECL_STRERROR_R +"this configure-time declaration test was not run" +# endif +char *strerror_r (); +# endif + /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; -# ifdef HAVE_STRERROR_R +# if HAVE_STRERROR_R || defined strerror_r # define __strerror_r strerror_r # else # if HAVE_STRERROR -# ifndef strerror /* On some systems, strerror is a macro */ +# ifndef HAVE_DECL_STRERROR +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRERROR char *strerror (); # endif # else static char * -private_strerror (errnum) - int errnum; +private_strerror (int errnum) { extern char *sys_errlist[]; extern int sys_nerr; @@ -118,9 +136,43 @@ private_strerror (errnum) } # define strerror private_strerror # endif /* HAVE_STRERROR */ -# endif /* HAVE_STRERROR_R */ +# endif /* HAVE_STRERROR_R || defined strerror_r */ #endif /* not _LIBC */ +static void +print_errno_message (int errnum) +{ + char const *s; + +#if defined HAVE_STRERROR_R || _LIBC + char errbuf[1024]; +# if STRERROR_R_CHAR_P || _LIBC + s = __strerror_r (errnum, errbuf, sizeof errbuf); +# else + if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) + s = errbuf; + else + s = 0; +# endif +#else + s = strerror (errnum); +#endif + +#if !_LIBC + if (! s) + s = _("Unknown system error"); +#endif + +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + { + __fwprintf (stderr, L": %s", s); + return; + } +#endif + + fprintf (stderr, ": %s", s); +} #ifdef VA_START static void @@ -177,25 +229,12 @@ error_tail (int status, int errnum, const char *message, va_list args) ++error_message_count; if (errnum) - { -#if defined HAVE_STRERROR_R || _LIBC - char errbuf[1024]; - char *s = __strerror_r (errnum, errbuf, sizeof errbuf); + print_errno_message (errnum); # if _LIBC && USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L": %s", s); - else -# endif - fprintf (stderr, ": %s", s); -#else - fprintf (stderr, ": %s", strerror (errnum)); -#endif - } -#if _LIBC && USE_IN_LIBIO if (_IO_fwide (stderr, 0) > 0) putwc (L'\n', stderr); else -#endif +# endif putc ('\n', stderr); fflush (stderr); if (status) @@ -252,7 +291,7 @@ error (status, errnum, message, va_alist) ++error_message_count; if (errnum) - fprintf (stderr, ": %s", strerror (errnum)); + print_errno_message (errnum); putc ('\n', stderr); fflush (stderr); if (status) @@ -343,7 +382,7 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist) ++error_message_count; if (errnum) - fprintf (stderr, ": %s", strerror (errnum)); + print_errno_message (errnum); putc ('\n', stderr); fflush (stderr); if (status)