/* 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 <djm@gnu.ai.mit.edu>. */
#endif
#include <stdio.h>
-#include <libintl.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+#endif
+
#ifdef _LIBC
# include <wchar.h>
# define mbsrtowcs __mbsrtowcs
#include "error.h"
+#if !_LIBC
+# include "unlocked-io.h"
+#endif
+
#ifndef _
# define _(String) String
#endif
# define program_name program_invocation_name
# include <errno.h>
+# include <libio/libioP.h>
/* In GNU libc we want do not want to use the common name `error' directly.
Instead make it a weak alias. */
# define error_at_line __error_at_line
# ifdef USE_IN_LIBIO
-# include <libio/iolibio.h>
-# define fflush(s) _IO_fflush (s)
+# include <libio/iolibio.h>
+# 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;
}
# 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
++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)
++error_message_count;
if (errnum)
- fprintf (stderr, ": %s", strerror (errnum));
+ print_errno_message (errnum);
putc ('\n', stderr);
fflush (stderr);
if (status)
++error_message_count;
if (errnum)
- fprintf (stderr, ": %s", strerror (errnum));
+ print_errno_message (errnum);
putc ('\n', stderr);
fflush (stderr);
if (status)