X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ferror.c;h=4eff5d0f9d801bf037454948b4333cf5e73cb6e1;hb=98bc67b465ac090234038302966c7743587e321e;hp=8f679c7fc4e630503c80919f9fa7ad528ba50e3a;hpb=9243fffedb8a99ce0630e4433b1bdd9f7b839f13;p=gnulib.git diff --git a/lib/error.c b/lib/error.c index 8f679c7fc..4eff5d0f9 100644 --- a/lib/error.c +++ b/lib/error.c @@ -1,19 +1,23 @@ -/* 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, -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. + 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. -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. */ + 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 + Library General Public License for more details. + + 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 . */ @@ -43,6 +47,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ void exit (); #endif +#include "error.h" + #ifndef _ # define _(String) String #endif @@ -65,17 +71,25 @@ unsigned int error_message_count; # define program_name program_invocation_name # include -#else +/* 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; @@ -84,12 +98,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 /* _LIBC */ +# 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 format string with optional args. @@ -98,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) @@ -134,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) @@ -146,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 @@ -202,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