1# strerror.m4 serial 17
2dnl Copyright (C) 2002, 2007-2012 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  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
13  m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
14    AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
15  ])
16  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
17    AC_CACHE_CHECK([for working strerror function],
18     [gl_cv_func_working_strerror],
19     [AC_RUN_IFELSE(
20        [AC_LANG_PROGRAM(
21           [[#include <string.h>
22           ]],
23           [[if (!*strerror (-2)) return 1;]])],
24        [gl_cv_func_working_strerror=yes],
25        [gl_cv_func_working_strerror=no],
26        [case "$host_os" in
27                   # Guess yes on glibc systems.
28           *-gnu*) gl_cv_func_working_strerror="guessing yes" ;;
29                   # If we don't know, assume the worst.
30           *)      gl_cv_func_working_strerror="guessing no" ;;
31         esac
32        ])
33    ])
34    case "$gl_cv_func_working_strerror" in
35      *yes) ;;
36      *)
37        dnl The system's strerror() fails to return a string for out-of-range
38        dnl integers. Replace it.
39        REPLACE_STRERROR=1
40        ;;
41    esac
42    m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
43      dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's
44      dnl buffer, we must replace strerror.
45      case "$gl_cv_func_strerror_r_works" in
46        *no) REPLACE_STRERROR=1 ;;
47      esac
48    ])
49  else
50    dnl The system's strerror() cannot know about the new errno values we add
51    dnl to <errno.h>, or any fix for strerror(0). Replace it.
52    REPLACE_STRERROR=1
53  fi
54])
55
56dnl Detect if strerror(0) passes (that is, does not set errno, and does not
57dnl return a string that matches strerror(-1)).
58AC_DEFUN([gl_FUNC_STRERROR_0],
59[
60  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
61  REPLACE_STRERROR_0=0
62  AC_CACHE_CHECK([whether strerror(0) succeeds],
63   [gl_cv_func_strerror_0_works],
64   [AC_RUN_IFELSE(
65      [AC_LANG_PROGRAM(
66         [[#include <string.h>
67           #include <errno.h>
68         ]],
69         [[int result = 0;
70           char *str;
71           errno = 0;
72           str = strerror (0);
73           if (!*str) result |= 1;
74           if (errno) result |= 2;
75           if (strstr (str, "nknown") || strstr (str, "ndefined"))
76             result |= 4;
77           return result;]])],
78      [gl_cv_func_strerror_0_works=yes],
79      [gl_cv_func_strerror_0_works=no],
80      [case "$host_os" in
81                 # Guess yes on glibc systems.
82         *-gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
83                 # If we don't know, assume the worst.
84         *)      gl_cv_func_strerror_0_works="guessing no" ;;
85       esac
86      ])
87  ])
88  case "$gl_cv_func_strerror_0_works" in
89    *yes) ;;
90    *)
91      REPLACE_STRERROR_0=1
92      AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0)
93        does not return a message implying success.])
94      ;;
95  esac
96])
97