changeset 9622:7b32838d1079

Replace strsignal if it does not work fine.
author Bruno Haible <bruno@clisp.org>
date Tue, 15 Jan 2008 02:25:14 +0100
parents d4bef14f119a
children 69d9307c0aa0
files ChangeLog lib/string.in.h m4/string_h.m4 m4/strsignal.m4 modules/string tests/test-strsignal.c
diffstat 6 files changed, 67 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-01-14  Colin Watson  <cjwatson@debian.org>
+            Bruno Haible  <bruno@clisp.org>
+
+	* 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  <bruno@clisp.org>
 
 	* modules/strsignal (Include): Change to <string.h>.
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -542,7 +542,10 @@
 #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
--- 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 @@
   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])
 ])
--- 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 @@
   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_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
 
-  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
+  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_DEFUN([gl_PREREQ_STRSIGNAL], [
+  AC_REQUIRE([AC_DECL_SYS_SIGLIST])
+  :
+])
--- a/modules/string
+++ b/modules/string
@@ -72,6 +72,7 @@
 	      -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
--- a/tests/test-strsignal.c
+++ b/tests/test-strsignal.c
@@ -65,5 +65,17 @@
   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;
 }