+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>.
#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
# 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.
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])
])
-# 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,
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_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_DEFUN([gl_PREREQ_STRSIGNAL], [
+ AC_REQUIRE([AC_DECL_SYS_SIGLIST])
+ :
+])
-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
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;
}