summaryrefslogtreecommitdiff
path: root/lib/error.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2001-10-21 07:59:04 +0000
committerJim Meyering <jim@meyering.net>2001-10-21 07:59:04 +0000
commit7d6185f0f51bbd09c29e121d25841a573e776e06 (patch)
tree2ae116f065fc770e0051a5e82a70016574ff2a49 /lib/error.c
parentad2abcb447fb91730533a201f869f4f2f840f221 (diff)
downloadcoreutils-7d6185f0f51bbd09c29e121d25841a573e776e06.tar.xz
(strerror_r): Do not declare unless !_LIBC.
Do not check for HAVE_DECL_STRERROR_R missing unless STRERROR_R_CHAR_P. Use strerror_r that is only a macro, even if it is not a function. (strerror): Check for HAVE_DECL_STRERROR before declaring. (private_strerror): Use prototypes, not old-style function definition. (print_errno_message): New function. Support the POSIX 'int'-flavored strerror_r, as well as the traditional char*-flavored one. (error_tail, error, error_at_line): Use it.
Diffstat (limited to 'lib/error.c')
-rw-r--r--lib/error.c99
1 files changed, 51 insertions, 48 deletions
diff --git a/lib/error.c b/lib/error.c
index b85b76d32..9c0700c2e 100644
--- a/lib/error.c
+++ b/lib/error.c
@@ -55,13 +55,6 @@ void exit ();
#include "error.h"
-#ifndef HAVE_DECL_STRERROR_R
-"this configure-time declaration test was not run"
-#endif
-#if !HAVE_DECL_STRERROR_R
-char *strerror_r ();
-#endif
-
#ifndef _
# define _(String) String
#endif
@@ -102,21 +95,30 @@ extern void __error_at_line (int status, int errnum, const char *file_name,
#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;
@@ -127,9 +129,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
@@ -186,20 +222,7 @@ 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);
-# 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
- }
+ print_errno_message (errnum);
# if _LIBC && USE_IN_LIBIO
if (_IO_fwide (stderr, 0) > 0)
putwc (L'\n', stderr);
@@ -261,17 +284,7 @@ error (status, errnum, message, va_alist)
++error_message_count;
if (errnum)
- {
-# if defined HAVE_STRERROR_R || _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
- }
+ print_errno_message (errnum);
putc ('\n', stderr);
fflush (stderr);
if (status)
@@ -362,17 +375,7 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
++error_message_count;
if (errnum)
- {
-# if defined HAVE_STRERROR_R || _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
- }
+ print_errno_message (errnum);
putc ('\n', stderr);
fflush (stderr);
if (status)