# HG changeset patch # User Eric Blake # Date 1305935113 21600 # Node ID 65af1104f800137dcba6e9278a26d1060d6b8e12 # Parent daa3d25b053228bf2c78335bf3ef7d3127a98f28 strerror_r: avoid corrupting errno on Solaris On Solaris, a non-zero return was also reflected into errno. Leaving errno unchanged is a useful feature worth guaranteeing. * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Check for Solaris behavior. * doc/posix-functions/strerror_r.texi (strerror_r): Document it. Signed-off-by: Eric Blake diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-05-20 Eric Blake + strerror_r: avoid corrupting errno on Solaris + * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Check for Solaris behavior. + * doc/posix-functions/strerror_r.texi (strerror_r): Document it. + strerror_r: avoid compiler warning * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Don't return a char*. diff --git a/doc/posix-functions/strerror_r.texi b/doc/posix-functions/strerror_r.texi --- a/doc/posix-functions/strerror_r.texi +++ b/doc/posix-functions/strerror_r.texi @@ -33,6 +33,9 @@ returning the error number, on some platforms: glibc 2.12 with @code{-D_POSIX_C_SOURCE=200112L}, AIX 6.1, OSF/1 5.1. @item +When this function fails, it corrupts @code{errno}, on some platforms: +Solaris 10. +@item This function does not support the error values that are specified by POSIX but not defined by the system, on some platforms: OpenBSD 4.0, OSF/1 5.1, NonStop Kernel, Cygwin 1.5.x. diff --git a/m4/strerror_r.m4 b/m4/strerror_r.m4 --- a/m4/strerror_r.m4 +++ b/m4/strerror_r.m4 @@ -1,4 +1,4 @@ -# strerror_r.m4 serial 7 +# strerror_r.m4 serial 8 dnl Copyright (C) 2002, 2007-2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -42,6 +42,7 @@ dnl HP-UX 11.31 strerror_r always fails when the buffer length argument dnl is less than 80. dnl FreeBSD 8.s strerror_r claims failure on 0 + dnl Solaris 10 strerror_r corrupts errno on failure AC_CACHE_CHECK([whether strerror_r works], [gl_cv_func_strerror_r_works], [AC_RUN_IFELSE( @@ -60,6 +61,11 @@ result |= 4; if (errno) result |= 8; + errno = 0; + if (strerror_r (-3, buf, sizeof buf) != 0) + result |= 0x10; + if (errno) + result |= 0x20; return result; ]])], [gl_cv_func_strerror_r_works=yes],