strerror_r-posix: Respect rules for use of AC_LIBOBJ.
[pspp] / m4 / strerror_r.m4
index 2c7923616d8b28a9df7b4830acee68b4cdd0fe8c..1c0af3691dc0f7b01dffcc6020835d0e7d8f6847 100644 (file)
@@ -1,5 +1,5 @@
-# strerror_r.m4 serial 3
-dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc.
+# strerror_r.m4 serial 9
+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,
 dnl with or without modifications, as long as this notice is preserved.
@@ -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],
@@ -33,7 +33,7 @@ AC_DEFUN([gl_FUNC_STRERROR_R],
               [[#include <string.h>
                 int strerror_r (int, char *, size_t);
               ]],
-              [[return strerror (0);]])],
+              [])],
            [gl_cv_func_strerror_r_posix_signature=yes],
            [gl_cv_func_strerror_r_posix_signature=no])
         ])
@@ -41,20 +41,31 @@ AC_DEFUN([gl_FUNC_STRERROR_R],
         dnl AIX 6.1 strerror_r fails by returning -1, not an error number.
         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(
              [AC_LANG_PROGRAM(
                 [[#include <errno.h>
                   #include <string.h>
-                  int strerror_r (int, char *, size_t);
                 ]],
                 [[int result = 0;
                   char buf[79];
                   if (strerror_r (EACCES, buf, 0) < 0)
                     result |= 1;
-                  if (strerror_r (EACCES, buf, sizeof (buf)) != 0)
+                  errno = 0;
+                  if (strerror_r (EACCES, buf, sizeof buf) != 0)
                     result |= 2;
+                  if (strerror_r (0, buf, sizeof buf) != 0)
+                    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],
@@ -66,6 +77,8 @@ changequote(,)dnl
                 aix*)  gl_cv_func_strerror_r_works="guessing no";;
                        # Guess no on HP-UX.
                 hpux*) gl_cv_func_strerror_r_works="guessing no";;
+                       # Guess no on FreeBSD.
+                freebsd*)  gl_cv_func_strerror_r_works="guessing no";;
                        # Guess yes otherwise.
                 *)     gl_cv_func_strerror_r_works="guessing yes";;
               esac
@@ -78,25 +91,19 @@ changequote([,])dnl
       else
         dnl The system's strerror() has a wrong signature. Replace it.
         REPLACE_STRERROR_R=1
-        dnl glibc >= 2.3.4 has a function __xpg_strerror_r.
+        dnl glibc >= 2.3.4 and cygwin 1.7.9 have a function __xpg_strerror_r.
         AC_CHECK_FUNCS([__xpg_strerror_r])
       fi
     else
       dnl The system's strerror_r() cannot know about the new errno values we
       dnl add to <errno.h>. Replace it.
       REPLACE_STRERROR_R=1
-      AC_DEFINE([EXTEND_STRERROR_R], [1],
-        [Define to 1 if strerror_r needs to be extended so that it handles the
-         extra errno values.])
     fi
   fi
-  if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
-    AC_LIBOBJ([strerror_r])
-    gl_PREREQ_STRERROR_R
-  fi
 ])
 
 # Prerequisites of lib/strerror_r.c.
 AC_DEFUN([gl_PREREQ_STRERROR_R], [
+  AC_CHECK_FUNCS_ONCE([catgets])
   :
 ])