From f94627382dd83f0b4a5572a08257976e21d2f8d0 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 15 Jan 2008 02:25:14 +0100 Subject: [PATCH] Replace strsignal if it does not work fine. --- ChangeLog | 12 ++++++++++++ lib/string.in.h | 5 ++++- m4/string_h.m4 | 3 ++- m4/strsignal.m4 | 41 ++++++++++++++++++++++++++++++++++++----- modules/string | 1 + tests/test-strsignal.c | 12 ++++++++++++ 6 files changed, 67 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7baf920a9..0e594bd6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-01-14 Colin Watson + Bruno Haible + + * 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. + 2008-01-14 Bruno Haible * modules/strsignal (Include): Change to . diff --git a/lib/string.in.h b/lib/string.in.h index 3354d2092..7e6bd088e 100644 --- a/lib/string.in.h +++ b/lib/string.in.h @@ -542,7 +542,10 @@ extern char *strerror (int); #endif #if @GNULIB_STRSIGNAL@ -# if ! @HAVE_DECL_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 diff --git a/m4/string_h.m4 b/m4/string_h.m4 index 69761d720..02202b695 100644 --- a/m4/string_h.m4 +++ b/m4/string_h.m4 @@ -5,7 +5,7 @@ # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # Written by Paul Eggert. @@ -80,6 +80,7 @@ AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS], 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]) ]) diff --git a/m4/strsignal.m4 b/m4/strsignal.m4 index 9bcd374ac..5244dcb6c 100644 --- a/m4/strsignal.m4 +++ b/m4/strsignal.m4 @@ -1,4 +1,4 @@ -# strsignal.m4 serial 1 +# 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,16 +9,47 @@ AC_DEFUN([gl_FUNC_STRSIGNAL], dnl Persuade glibc 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_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 + ]], + [[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_DEFUN([gl_PREREQ_STRSIGNAL], [ + AC_REQUIRE([AC_DECL_SYS_SIGLIST]) + : +]) diff --git a/modules/string b/modules/string index 0a2fd71ce..f59a11e35 100644 --- a/modules/string +++ b/modules/string @@ -72,6 +72,7 @@ string.h: string.in.h -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; \ } > $@-t diff --git a/tests/test-strsignal.c b/tests/test-strsignal.c index 16544f209..9bd8133e7 100644 --- a/tests/test-strsignal.c +++ b/tests/test-strsignal.c @@ -65,5 +65,17 @@ main (int argc, char **argv) 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; } -- 2.11.0