strerror_r-posix: port to cygwin
authorEric Blake <eblake@redhat.com>
Sat, 5 Feb 2011 19:15:59 +0000 (12:15 -0700)
committerEric Blake <eblake@redhat.com>
Sat, 5 Feb 2011 19:28:29 +0000 (12:28 -0700)
* lib/strerror_r.c (strerror_r) [__CYGWIN__]: Add cygwin
implementation.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Adjust comment.
* tests/test-strerror_r.c (main): Fix test.
* doc/posix-functions/strerror_r.texi (strerror_r): Document the
issue.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
doc/posix-functions/strerror_r.texi
lib/strerror_r.c
m4/strerror_r.m4
tests/test-strerror_r.c

index 41497ea22738b4224d4684ee60eb2770a9a17470..b6c7b0072bb8424bb419938b6e5bdd3f7fc58cbb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2011-02-05  Eric Blake  <eblake@redhat.com>
+
+       strerror_r-posix: port to cygwin
+       * lib/strerror_r.c (strerror_r) [__CYGWIN__]: Add cygwin
+       implementation.
+       * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Adjust comment.
+       * tests/test-strerror_r.c (main): Fix test.
+       * doc/posix-functions/strerror_r.texi (strerror_r): Document the
+       issue.
+
 2011-02-05  Bruno Haible  <bruno@clisp.org>
 
        New module 'wmemchr'.
index 383b6cb0aa2b91bdd07ff0cc455d7adef3337447..bf431645d3a006b6ea5b428ed291350dd8492402 100644 (file)
@@ -12,7 +12,8 @@ Portability problems fixed by Gnulib:
 This function is missing on some platforms:
 NetBSD 3.0, HP-UX 11.23, IRIX 6.5, Solaris 9, mingw.
 @item
-glibc has an incompatible version of this function.  The POSIX compliant code
+glibc and Cygwin have an incompatible version of this function.  The
+POSIX compliant code
 @smallexample
 char *s = (strerror_r (err, buf, buflen) == 0 ? buf : NULL);
 @end smallexample
index 57a7e8f722acbb44bcd54afdcb4adf79b7261f0b..1fa52d99da600dbf43e19cd46c23f9230296ef4f 100644 (file)
@@ -27,7 +27,7 @@
 #if HAVE_DECL_STRERROR_R && !(__GLIBC__ >= 2 || defined __UCLIBC__) && !EXTEND_STRERROR_R
 
 /* The system's strerror_r function is OK, except that its third argument
-   is 'int', not 'size_t'.  */
+   is 'int', not 'size_t', or its return type is wrong.  */
 
 # include <limits.h>
 
@@ -61,6 +61,11 @@ strerror_r (int errnum, char *buf, size_t buflen)
     else
       ret = strerror_r (errnum, buf, buflen);
   }
+# elif defined __CYGWIN__
+  /* Cygwin only provides the glibc interface, is thread-safe, and
+     always succeeds (although it may truncate). */
+  strerror_r (errnum, buf, buflen);
+  ret = 0;
 # else
   ret = strerror_r (errnum, buf, buflen);
 # endif
index 3897da69fe3f32fa39b330301b5e2f6111543182..1883458c03a4ec64cd56e60eec4036b0e3a4acde 100644 (file)
@@ -24,7 +24,7 @@ AC_DEFUN([gl_FUNC_STRERROR_R],
   if test $ac_cv_func_strerror_r = yes; then
     if test -z "$ERRNO_H"; then
       dnl The POSIX prototype is:  int strerror_r (int, char *, size_t);
-      dnl glibc's prototype:       char *strerror_r (int, char *, size_t);
+      dnl glibc, Cygwin:           char *strerror_r (int, char *, size_t);
       dnl AIX 5.1, OSF/1 5.1:      int strerror_r (int, char *, int);
       AC_CACHE_CHECK([for strerror_r with POSIX signature],
         [gl_cv_func_strerror_r_posix_signature],
index 2e25d8e60a3c330893679f9750a058e6b64a7bd5..b2fdaf92688d6621207dc3620936c4db4415ed74 100644 (file)
@@ -74,8 +74,8 @@ main (void)
         if (ret == 0)
           {
             /* Truncated result.  POSIX allows this, and it actually
-               happens on AIX 6.1.  */
-            ASSERT (strcmp (buf, "BADFACE") != 0);
+               happens on AIX 6.1 and Cygwin.  */
+            ASSERT ((strcmp (buf, "BADFACE") == 0) == (i == 0));
           }
         else
           {