X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fstrerror_r.m4;h=1883458c03a4ec64cd56e60eec4036b0e3a4acde;hb=ccd7ccb010c3a2a509ac39236a4411581368148c;hp=bd28635281b71548fed738e6de7dcc05fb8c8099;hpb=2513f0b79718ee229684a5a003506aed0f4aeeda;p=gnulib.git diff --git a/m4/strerror_r.m4 b/m4/strerror_r.m4 index bd2863528..1883458c0 100644 --- a/m4/strerror_r.m4 +++ b/m4/strerror_r.m4 @@ -1,59 +1,102 @@ -#serial 1003 -# Experimental replacement for the function in the latest CVS autoconf. -# Use with the error.c file in ../lib. +# strerror_r.m4 serial 3 +dnl Copyright (C) 2002, 2007-2011 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. -# Copyright 2001 Free Software Foundation, Inc. +AC_DEFUN([gl_FUNC_STRERROR_R], +[ + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) + AC_REQUIRE([gl_HEADER_ERRNO_H]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. + dnl Persuade Solaris to declare strerror_r(). + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. + dnl Some systems don't declare strerror_r() if _THREAD_SAFE and _REENTRANT + dnl are not defined. + AC_CHECK_DECLS_ONCE([strerror_r]) + if test $ac_cv_have_decl_strerror_r = no; then + HAVE_DECL_STRERROR_R=0 + fi -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -undefine([AC_FUNC_STRERROR_R]) - -# AC_FUNC_STRERROR_R -# ------------------ -AC_DEFUN([AC_FUNC_STRERROR_R], -[AC_CHECK_DECLS([strerror_r]) -AC_CHECK_FUNCS([strerror_r]) -AC_CACHE_CHECK([whether strerror_r returns char *], - ac_cv_func_strerror_r_char_p, - [ - ac_cv_func_strerror_r_char_p=no - if test $ac_cv_have_decl_strerror_r = yes; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], - [[ - char buf[100]; - char x = *strerror_r (0, buf, sizeof buf); - char *p = strerror_r (0, buf, sizeof buf); - ]])], - ac_cv_func_strerror_r_char_p=yes) + AC_CHECK_FUNCS([strerror_r]) + if test $ac_cv_func_strerror_r = yes; then + if test -z "$ERRNO_H"; then + dnl The POSIX prototype is: int strerror_r (int, char *, size_t); + dnl glibc, Cygwin: char *strerror_r (int, char *, size_t); + dnl AIX 5.1, OSF/1 5.1: int strerror_r (int, char *, int); + AC_CACHE_CHECK([for strerror_r with POSIX signature], + [gl_cv_func_strerror_r_posix_signature], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + int strerror_r (int, char *, size_t); + ]], + [[return strerror (0);]])], + [gl_cv_func_strerror_r_posix_signature=yes], + [gl_cv_func_strerror_r_posix_signature=no]) + ]) + if test $gl_cv_func_strerror_r_posix_signature = yes; then + dnl AIX 6.1 strerror_r fails by returning -1, not an error number. + dnl HP-UX 11.31 strerror_r always fails when the buffer length argument + dnl is less than 80. + AC_CACHE_CHECK([whether strerror_r works], + [gl_cv_func_strerror_r_works], + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #include + int strerror_r (int, char *, size_t); + ]], + [[int result = 0; + char buf[79]; + if (strerror_r (EACCES, buf, 0) < 0) + result |= 1; + if (strerror_r (EACCES, buf, sizeof (buf)) != 0) + result |= 2; + return result; + ]])], + [gl_cv_func_strerror_r_works=yes], + [gl_cv_func_strerror_r_works=no], + [ +changequote(,)dnl + case "$host_os" in + # Guess no on AIX. + aix*) gl_cv_func_strerror_r_works="guessing no";; + # Guess no on HP-UX. + hpux*) gl_cv_func_strerror_r_works="guessing no";; + # Guess yes otherwise. + *) gl_cv_func_strerror_r_works="guessing yes";; + esac +changequote([,])dnl + ]) + ]) + case "$gl_cv_func_strerror_r_works" in + *no) REPLACE_STRERROR_R=1 ;; + esac + else + dnl The system's strerror() has a wrong signature. Replace it. + REPLACE_STRERROR_R=1 + dnl glibc >= 2.3.4 has a function __xpg_strerror_r. + AC_CHECK_FUNCS([__xpg_strerror_r]) + fi else - # strerror_r is not declared. Choose between - # systems that have relatively inaccessible declarations for the - # function. BeOS and DEC UNIX 4.0 fall in this category, but the - # former has a strerror_r that returns char*, while the latter - # has a strerror_r that returns `int'. - # This test should segfault on the DEC system. - AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT - extern char *strerror_r ();], - [[char buf[100]; - char x = *strerror_r (0, buf, sizeof buf); - exit (!isalpha (x));]])], - ac_cv_func_strerror_r_char_p=yes, , :) + dnl The system's strerror_r() cannot know about the new errno values we + dnl add to . Replace it. + REPLACE_STRERROR_R=1 + AC_DEFINE([EXTEND_STRERROR_R], [1], + [Define to 1 if strerror_r needs to be extended so that it handles the + extra errno values.]) fi - ]) -if test $ac_cv_func_strerror_r_char_p = yes; then - AC_DEFINE([STRERROR_R_CHAR_P], 1, - [Define to 1 if strerror_r returns char *.]) -fi -])# AC_FUNC_STRERROR_R + fi + if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then + AC_LIBOBJ([strerror_r]) + gl_PREREQ_STRERROR_R + fi +]) + +# Prerequisites of lib/strerror_r.c. +AC_DEFUN([gl_PREREQ_STRERROR_R], [ + : +])