[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: strsignal module
From: |
Bruno Haible |
Subject: |
Re: strsignal module |
Date: |
Tue, 15 Jan 2008 02:30:20 +0100 |
User-agent: |
KMail/1.5.4 |
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 <address@hidden>
Bruno Haible <address@hidden>
* 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; \
} > address@hidden
*** 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;
}
- Re: strsignal module, (continued)
- Re: strsignal module, Bruno Haible, 2008/01/07
- Re: strsignal module, Colin Watson, 2008/01/08
- Re: strsignal module, Bruno Haible, 2008/01/09
- Re: strsignal module, Colin Watson, 2008/01/13
- Re: strsignal module, Bruno Haible, 2008/01/13
- Re: strsignal module, Bruno Haible, 2008/01/14
- Re: strsignal module, Colin Watson, 2008/01/14
Re: strsignal module, Bruno Haible, 2008/01/14