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