diff options
author | Eric Blake <eblake@redhat.com> | 2011-05-24 14:27:04 -0600 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2011-06-01 08:19:59 -0600 |
commit | 6b66ce308dae8448f02da645a9fd8fb992349f06 (patch) | |
tree | d5ff88e4b838f9b8d336a9dcf1c74a7beab0cc20 | |
parent | 90a65c17c1754d1890af4f00374d7af435d8cc7e (diff) | |
download | gnulib-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-- | ChangeLog | 7 | ||||
-rw-r--r-- | doc/posix-functions/perror.texi | 4 | ||||
-rw-r--r-- | lib/perror.c | 14 | ||||
-rw-r--r-- | modules/perror | 1 |
4 files changed, 22 insertions, 4 deletions
@@ -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: |