NEWS.stable: log cherry-pick [d21602d]->[aa4ddc3] pthread: Determine $(LIB_PTHREAD...
[gnulib.git] / m4 / strerror.m4
1 # strerror.m4 serial 16
2 dnl Copyright (C) 2002, 2007-2011 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_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
47 dnl Detect if strerror(0) passes (that is, does not set errno, and does not
48 dnl return a string that matches strerror(-1)).
49 AC_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 ])