1# strerror.m4 serial 16
2dnl Copyright (C) 2002, 2007-2011 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7AC_DEFUN([gl_FUNC_STRERROR],
8[
9  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
10  AC_REQUIRE([gl_HEADER_ERRNO_H])
11  AC_REQUIRE([gl_FUNC_STRERROR_0])
12  m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
13    AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
14  ])
15  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
16    AC_CACHE_CHECK([for working strerror function],
17     [gl_cv_func_working_strerror],
18     [AC_RUN_IFELSE(
19        [AC_LANG_PROGRAM(
20           [[#include <string.h>
21           ]],
22           [[if (!*strerror (-2)) return 1;]])],
23        [gl_cv_func_working_strerror=yes],
24        [gl_cv_func_working_strerror=no],
25        [dnl Be pessimistic on cross-compiles for now.
26         gl_cv_func_working_strerror="guessing no"])
27    ])
28    if test "$gl_cv_func_working_strerror" != yes; then
29      dnl The system's strerror() fails to return a string for out-of-range
30      dnl integers. Replace it.
31      REPLACE_STRERROR=1
32    fi
33    m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
34      dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's
35      dnl buffer, we must replace strerror.
36      case "$gl_cv_func_strerror_r_works" in
37        *no) REPLACE_STRERROR=1 ;;
38      esac
39    ])
40  else
41    dnl The system's strerror() cannot know about the new errno values we add
42    dnl to <errno.h>, or any fix for strerror(0). Replace it.
43    REPLACE_STRERROR=1
44  fi
45])
46
47dnl Detect if strerror(0) passes (that is, does not set errno, and does not
48dnl return a string that matches strerror(-1)).
49AC_DEFUN([gl_FUNC_STRERROR_0],
50[
51  REPLACE_STRERROR_0=0
52  AC_CACHE_CHECK([whether strerror(0) succeeds],
53   [gl_cv_func_strerror_0_works],
54   [AC_RUN_IFELSE(
55      [AC_LANG_PROGRAM(
56         [[#include <string.h>
57           #include <errno.h>
58         ]],
59         [[int result = 0;
60           char *str;
61           errno = 0;
62           str = strerror (0);
63           if (!*str) result |= 1;
64           if (errno) result |= 2;
65           if (strstr (str, "nknown") || strstr (str, "ndefined"))
66             result |= 4;
67           return result;]])],
68      [gl_cv_func_strerror_0_works=yes],
69      [gl_cv_func_strerror_0_works=no],
70      [dnl Be pessimistic on cross-compiles for now.
71       gl_cv_func_strerror_0_works="guessing no"])
72  ])
73  if test "$gl_cv_func_strerror_0_works" != yes; then
74    REPLACE_STRERROR_0=1
75    AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0)
76      does not return a message implying success.])
77  fi
78])
79