diff options
author | Eric Blake <eblake@redhat.com> | 2011-06-07 20:49:04 -0600 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2011-06-08 06:50:35 -0600 |
commit | 79d4e75d8e14dee5d91f58413942fe875857d4f5 (patch) | |
tree | 8e57ed509fe06235828e08e4f49f871fdc43cd8e /lib/strerror_r.c | |
parent | 284602e2840830b0e25ec9069840f061f563cc23 (diff) | |
download | gnulib-79d4e75d8e14dee5d91f58413942fe875857d4f5.tar.gz |
strerror_r-posix: fix on MacOS
MacOS X 10.5 strerror(0) is "Unknown error: 0", which is not distinguished
from "Unknown error: -1" for out-of-range. Worse, strerror_r(0,,)
is "Undefined error: 0", although strerror_r for all other out-of-range
values matches strerror.
* m4/strerror.m4 (gl_FUNC_STRERROR): Flush out MacOS bug.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R_WORKS): Likewise, and fix
logic bug.
* lib/strerror_r.c (strerror_r): Fix the bug.
* lib/strerror.c (strerror): Likewise.
* doc/posix-functions/strerror_r.texi (strerror_r): Document the
problem.
* doc/posix-functions/strerror.texi (strerror): Likewise.
* doc/posix-functions/perror.texi (perror): Likewise.
* tests/test-strerror.c (main): Enhance test.
* tests/test-strerror_r.c (main): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'lib/strerror_r.c')
-rw-r--r-- | lib/strerror_r.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/strerror_r.c b/lib/strerror_r.c index d0c7be953e..46b47ed8c1 100644 --- a/lib/strerror_r.c +++ b/lib/strerror_r.c @@ -209,9 +209,16 @@ strerror_r (int errnum, char *buf, size_t buflen) if (ret < 0) ret = errno; - /* FreeBSD rejects 0; see http://austingroupbugs.net/view.php?id=382. */ - if (errnum == 0 && ret == EINVAL) - ret = safe_copy (buf, buflen, "Success"); + /* FreeBSD rejects 0; see http://austingroupbugs.net/view.php?id=382. + MacOS X 10.5 strerror_r differs from the strerror string for 0. */ + if (errnum == 0) + { +# if defined __APPLE__ && defined __MACH__ + ret = EINVAL; +# endif + if (ret == EINVAL) + ret = safe_copy (buf, buflen, "Success"); + } #else /* USE_SYSTEM_STRERROR */ |