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