bug-gnulib
[Top][All Lists]
Advanced

[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;
  }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]