Colin Watson wrote: > I think the attached patch is right (I tested it with LIBS=-lstrsignal > after installing a bogus /usr/lib/libstrsignal.a with a strsignal > function that always returns NULL), but would appreciate review from > those more fluent in Autoconf than I am.
Thanks for the fast work. I'm applying it, with minor modifications: - Recognize the bad cases also when cross-compiling. - No need to set REPLACE_STRSIGNAL if the function does not exist. - Move the AC_DECL_SYS_SIGLIST to the gl_PREREQ_STRSIGNAL macro, since it's used to compile the replacement, not to decide whether we need the replacement. > Is it sufficient to test a single value? It's been some time since I had > convenient access to either Solaris or AIX systems. Yes. In the tests I made, negative and positive out-of-range values didn't make a difference. 2008-01-14 Colin Watson <[EMAIL PROTECTED]> Bruno Haible <[EMAIL PROTECTED]> * m4/strsignal.m4 (gl_FUNC_STRSIGNAL): Also check whether strsignal works fine; if not, set REPLACE_STRSIGNAL. (gl_PREREQ_STRSIGNAL): Require AC_DECL_SYS_SIGLIST. * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize REPLACE_STRSIGNAL. * lib/string.in.h (strsignal): Consider REPLACE_STRSIGNAL. * modules/string (Makefile.am): Substitute REPLACE_STRSIGNAL. * tests/test-strsignal.c (main): Check out-of-range signal numbers. *** lib/string.in.h.orig 2008-01-15 02:22:23.000000000 +0100 --- lib/string.in.h 2008-01-15 02:09:44.000000000 +0100 *************** *** 542,548 **** #endif #if @GNULIB_STRSIGNAL@ ! # if ! @HAVE_DECL_STRSIGNAL@ extern char *strsignal (int __sig); # endif #elif defined GNULIB_POSIXCHECK --- 542,551 ---- #endif #if @GNULIB_STRSIGNAL@ ! # if @REPLACE_STRSIGNAL@ ! # define strsignal rpl_strsignal ! # endif ! # if ! @HAVE_DECL_STRSIGNAL@ || @REPLACE_STRSIGNAL@ extern char *strsignal (int __sig); # endif #elif defined GNULIB_POSIXCHECK *** m4/string_h.m4.orig 2008-01-15 02:22:23.000000000 +0100 --- m4/string_h.m4 2008-01-15 02:12:15.000000000 +0100 *************** *** 5,11 **** # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. ! # serial 3 # Written by Paul Eggert. --- 5,11 ---- # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. ! # serial 4 # Written by Paul Eggert. *************** *** 80,85 **** --- 80,86 ---- HAVE_DECL_STRERROR=1; AC_SUBST([HAVE_DECL_STRERROR]) HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) + REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) ]) *** m4/strsignal.m4.orig 2008-01-15 02:22:23.000000000 +0100 --- m4/strsignal.m4 2008-01-15 02:22:21.000000000 +0100 *************** *** 1,4 **** ! # strsignal.m4 serial 1 dnl Copyright (C) 2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, --- 1,4 ---- ! # strsignal.m4 serial 2 dnl Copyright (C) 2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, *************** *** 9,24 **** dnl Persuade glibc <string.h> to declare strsignal(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) - AC_REQUIRE([AC_DECL_SYS_SIGLIST]) - AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) ! AC_REPLACE_FUNCS([strsignal]) AC_CHECK_DECLS_ONCE([strsignal]) if test $ac_cv_have_decl_strsignal = no; then HAVE_DECL_STRSIGNAL=0 gl_PREREQ_STRSIGNAL fi ]) # Prerequisites of lib/strsignal.c. ! AC_DEFUN([gl_PREREQ_STRSIGNAL], [:]) --- 9,55 ---- dnl Persuade glibc <string.h> to declare strsignal(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) ! AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles ! AC_CHECK_DECLS_ONCE([strsignal]) if test $ac_cv_have_decl_strsignal = no; then HAVE_DECL_STRSIGNAL=0 + fi + + AC_CHECK_FUNCS([strsignal]) + if test $ac_cv_func_strsignal = yes; then + dnl Check if strsignal behaves reasonably for out-of-range signal numbers. + dnl On Solaris it returns NULL; on AIX 5.1 it returns (char *) -1. + AC_CACHE_CHECK([whether strsignal always returns a string], + [gl_cv_func_working_strsignal], + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include <string.h> + ]], + [[char *s = strsignal (-1); + return !(s != (char *) 0 && s != (char *) -1);]])], + [gl_cv_func_working_strsignal=yes], + [gl_cv_func_working_strsignal=no], + [case "$host_os" in + solaris* | aix*) gl_cv_func_working_strsignal=no;; + *) gl_cv_func_working_strsignal="guessing yes";; + esac])]) + else + gl_cv_func_working_strsignal=no + fi + + if test "$gl_cv_func_working_strsignal" = no; then + if test $ac_cv_func_strsignal = yes; then + REPLACE_STRSIGNAL=1 + fi + AC_LIBOBJ([strsignal]) gl_PREREQ_STRSIGNAL fi ]) # Prerequisites of lib/strsignal.c. ! AC_DEFUN([gl_PREREQ_STRSIGNAL], [ ! AC_REQUIRE([AC_DECL_SYS_SIGLIST]) ! : ! ]) *** modules/string.orig 2008-01-15 02:22:23.000000000 +0100 --- modules/string 2008-01-15 02:09:44.000000000 +0100 *************** *** 72,77 **** --- 72,78 ---- -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ + -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ < $(srcdir)/string.in.h; \ } > [EMAIL PROTECTED] *** tests/test-strsignal.c.orig 2008-01-15 02:22:23.000000000 +0100 --- tests/test-strsignal.c 2008-01-15 02:12:01.000000000 +0100 *************** *** 65,69 **** --- 65,81 ---- ASSERT_DESCRIPTION (str, "Interrupt"); #endif + /* Test that for out-of-range signal numbers the result is usable. */ + + str = strsignal (-1); + ASSERT (str); + ASSERT (str != (char *) -1); + ASSERT (strlen (str)); + + str = strsignal (9249234); + ASSERT (str); + ASSERT (str != (char *) -1); + ASSERT (strlen (str)); + return 0; }