summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2011-05-24 14:27:04 -0600
committerEric Blake <eblake@redhat.com>2011-06-01 08:19:59 -0600
commit6b66ce308dae8448f02da645a9fd8fb992349f06 (patch)
treed5ff88e4b838f9b8d336a9dcf1c74a7beab0cc20
parent90a65c17c1754d1890af4f00374d7af435d8cc7e (diff)
downloadgnulib-6b66ce308dae8448f02da645a9fd8fb992349f06.tar.gz
perror: call strerror_r directly
No need to make a wrapper that burns static storage when we can just use stack storage. * modules/perror (Files): Drop strerror-impl.h. * lib/perror.c (perror): Use our own stack buffer, rather than calling a wrapper that uses static storage. * doc/posix-functions/perror.texi (perror): Document a limitation of our replacement. Signed-off-by: Eric Blake <eblake@redhat.com>
-rw-r--r--ChangeLog7
-rw-r--r--doc/posix-functions/perror.texi4
-rw-r--r--lib/perror.c14
-rw-r--r--modules/perror1
4 files changed, 22 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index f62e43b6e3..0685dccc5a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2011-06-01 Eric Blake <eblake@redhat.com>
+ perror: call strerror_r directly
+ * modules/perror (Files): Drop strerror-impl.h.
+ * lib/perror.c (perror): Use our own stack buffer, rather than
+ calling a wrapper that uses static storage.
+ * doc/posix-functions/perror.texi (perror): Document a limitation
+ of our replacement.
+
strerror_r: fix includes for FreeBSD
* lib/strerror_r.c (includes): Use <stdlib.h> unconditionally,
since we use abort on some platforms.
diff --git a/doc/posix-functions/perror.texi b/doc/posix-functions/perror.texi
index cf6ac79d1c..167cf39aea 100644
--- a/doc/posix-functions/perror.texi
+++ b/doc/posix-functions/perror.texi
@@ -24,4 +24,8 @@ Portability problems not fixed by Gnulib:
POSIX requires that this function set the stream error bit (detected
by @code{ferror}) on write failure, but not all platforms do this:
glibc 2.13.
+@item
+POSIX requires that this function not alter stream orientation, but
+the gnulib replacement locks in byte orientation and fails on wide
+character streams.
@end itemize
diff --git a/lib/perror.c b/lib/perror.c
index 29af3c5a56..88981d1658 100644
--- a/lib/perror.c
+++ b/lib/perror.c
@@ -40,10 +40,18 @@
void
perror (const char *string)
{
- const char *errno_description = my_strerror (errno);
+ char stackbuf[256];
+ int ret;
+
+ /* Our implementation guarantees that this will be a non-empty
+ string, even if it returns EINVAL; and stackbuf should be sized
+ large enough to avoid ERANGE. */
+ ret = strerror_r (errno, stackbuf, sizeof stackbuf);
+ if (ret == ERANGE)
+ abort ();
if (string != NULL && *string != '\0')
- fprintf (stderr, "%s: %s\n", string, errno_description);
+ fprintf (stderr, "%s: %s\n", string, stackbuf);
else
- fprintf (stderr, "%s\n", errno_description);
+ fprintf (stderr, "%s\n", stackbuf);
}
diff --git a/modules/perror b/modules/perror
index 1ff9ec27e5..38e28ce633 100644
--- a/modules/perror
+++ b/modules/perror
@@ -3,7 +3,6 @@ perror() function: print a message describing error code.
Files:
lib/perror.c
-lib/strerror-impl.h
m4/perror.m4
Depends-on: