105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# strerror_r.m4 serial 15
205436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl Copyright (C) 2002, 2007-2012 Free Software Foundation, Inc.
305436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl This file is free software; the Free Software Foundation
405436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl gives unlimited permission to copy and/or distribute it,
505436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl with or without modifications, as long as this notice is preserved.
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
705436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_FUNC_STRERROR_R],
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  dnl Persuade Solaris <string.h> to declare strerror_r().
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  dnl Some systems don't declare strerror_r() if _THREAD_SAFE and _REENTRANT
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  dnl are not defined.
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_DECLS_ONCE([strerror_r])
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_have_decl_strerror_r = no; then
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    HAVE_DECL_STRERROR_R=0
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_func_strerror_r = yes; then
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if test $gl_cv_func_strerror_r_posix_signature = yes; then
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case "$gl_cv_func_strerror_r_works" in
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          dnl The system's strerror_r has bugs.  Replace it.
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          *no) REPLACE_STRERROR_R=1 ;;
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        esac
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      else
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl The system's strerror_r() has a wrong signature. Replace it.
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        REPLACE_STRERROR_R=1
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fi
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    else
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dnl The system's strerror_r() cannot know about the new errno values we
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dnl add to <errno.h>, or any fix for strerror(0). Replace it.
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      REPLACE_STRERROR_R=1
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Prerequisites of lib/strerror_r.c.
4205436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_PREREQ_STRERROR_R], [
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  dnl glibc >= 2.3.4 and cygwin 1.7.9 have a function __xpg_strerror_r.
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS_ONCE([__xpg_strerror_r])
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS_ONCE([catgets])
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS_ONCE([snprintf])
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Detect if strerror_r works, but without affecting whether a replacement
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# strerror_r will be used.
5105436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_FUNC_STRERROR_R_WORKS],
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_HEADER_ERRNO_H])
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_FUNC_STRERROR_0])
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS_ONCE([strerror_r])
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_func_strerror_r = yes; then
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dnl The POSIX prototype is:  int strerror_r (int, char *, size_t);
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dnl glibc, Cygwin:           char *strerror_r (int, char *, size_t);
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      dnl AIX 5.1, OSF/1 5.1:      int strerror_r (int, char *, int);
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      AC_CACHE_CHECK([for strerror_r with POSIX signature],
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        [gl_cv_func_strerror_r_posix_signature],
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        [AC_COMPILE_IFELSE(
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           [AC_LANG_PROGRAM(
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              [[#include <string.h>
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                int strerror_r (int, char *, size_t);
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              ]],
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              [])],
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang           [gl_cv_func_strerror_r_posix_signature=yes],
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang           [gl_cv_func_strerror_r_posix_signature=no])
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        ])
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if test $gl_cv_func_strerror_r_posix_signature = yes; then
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl AIX 6.1 strerror_r fails by returning -1, not an error number.
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl HP-UX 11.31 strerror_r always fails when the buffer length argument
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl is less than 80.
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl FreeBSD 8.s strerror_r claims failure on 0
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl Mac OS X 10.5 strerror_r treats 0 like -1
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl Solaris 10 strerror_r corrupts errno on failure
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        AC_CACHE_CHECK([whether strerror_r works],
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          [gl_cv_func_strerror_r_works],
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          [AC_RUN_IFELSE(
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang             [AC_LANG_PROGRAM(
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                [[#include <errno.h>
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  #include <string.h>
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                ]],
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                [[int result = 0;
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  char buf[79];
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (strerror_r (EACCES, buf, 0) < 0)
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 1;
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  errno = 0;
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (strerror_r (EACCES, buf, sizeof buf) != 0)
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 2;
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  strcpy (buf, "Unknown");
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (strerror_r (0, buf, sizeof buf) != 0)
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 4;
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (errno)
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 8;
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (strstr (buf, "nknown") || strstr (buf, "ndefined"))
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 0x10;
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  errno = 0;
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  *buf = 0;
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (strerror_r (-3, buf, sizeof buf) < 0)
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 0x20;
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (errno)
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 0x40;
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  if (!*buf)
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    result |= 0x80;
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  return result;
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                ]])],
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang             [gl_cv_func_strerror_r_works=yes],
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang             [gl_cv_func_strerror_r_works=no],
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang             [
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wangchangequote(,)dnl
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              case "$host_os" in
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       # Guess no on AIX.
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                aix*)  gl_cv_func_strerror_r_works="guessing no";;
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       # Guess no on HP-UX.
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                hpux*) gl_cv_func_strerror_r_works="guessing no";;
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       # Guess no on BSD variants.
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                *bsd*)  gl_cv_func_strerror_r_works="guessing no";;
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       # Guess yes otherwise.
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                *)     gl_cv_func_strerror_r_works="guessing yes";;
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              esac
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wangchangequote([,])dnl
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang             ])
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          ])
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      else
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl The system's strerror() has a wrong signature.
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl glibc >= 2.3.4 and cygwin 1.7.9 have a function __xpg_strerror_r.
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        AC_CHECK_FUNCS_ONCE([__xpg_strerror_r])
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl In glibc < 2.14, __xpg_strerror_r does not populate buf on failure.
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        dnl In cygwin < 1.7.10, __xpg_strerror_r clobbers strerror's buffer.
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if test $ac_cv_func___xpg_strerror_r = yes; then
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          AC_CACHE_CHECK([whether __xpg_strerror_r works],
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang            [gl_cv_func_strerror_r_works],
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            [AC_RUN_IFELSE(
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang               [AC_LANG_PROGRAM(
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  [[#include <errno.h>
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    #include <string.h>
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    extern
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    #ifdef __cplusplus
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    "C"
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    #endif
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    int __xpg_strerror_r(int, char *, size_t);
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  ]],
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  [[int result = 0;
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    char buf[256] = "^";
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    char copy[256];
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    char *str = strerror (-1);
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    strcpy (copy, str);
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    if (__xpg_strerror_r (-2, buf, 1) == 0)
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      result |= 1;
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    if (*buf)
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      result |= 2;
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    __xpg_strerror_r (-2, buf, 256);
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    if (strcmp (str, copy))
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      result |= 4;
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    return result;
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  ]])],
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang               [gl_cv_func_strerror_r_works=yes],
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang               [gl_cv_func_strerror_r_works=no],
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang               [dnl Guess no on all platforms that have __xpg_strerror_r,
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                dnl at least until fixed glibc and cygwin are more common.
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                gl_cv_func_strerror_r_works="guessing no"
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang               ])
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang            ])
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        fi
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fi
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
174