From b90eddc3542d88ab8a2501a8c850c16f74130326 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 30 May 2006 19:14:05 +0000 Subject: [PATCH] Work around broken AIX 5.1 strndup function. --- lib/ChangeLog | 5 +++++ lib/strndup.c | 4 +++- m4/ChangeLog | 8 ++++++++ m4/strndup.m4 | 36 ++++++++++++++++++++++++++++++++---- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index 9e687aec6..453a08de5 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,8 @@ +2006-05-30 Ralf Wildenhues + Bruno Haible + + * strndup.c (strndup) [!_LIBC]: Don't undefine macro definition. + 2006-05-26 Martin Lambers * getpass.c: Updates the test for the native W32 API, and adds diff --git a/lib/strndup.c b/lib/strndup.c index 932a83e4c..2626373f2 100644 --- a/lib/strndup.c +++ b/lib/strndup.c @@ -36,7 +36,9 @@ #endif #undef __strndup -#undef strndup +#if _LIBC +# undef strndup +#endif #ifndef weak_alias # define __strndup strndup diff --git a/m4/ChangeLog b/m4/ChangeLog index 5695ebe40..e5484ba0c 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,11 @@ +2006-05-30 Ralf Wildenhues + Bruno Haible + + * strndup.m4 (gl_FUNC_STRNDUP): Replace the AC_REPLACE_FUNCS with a + check for the declaration of strnlen and a run test that exposes the + AIX 5.1 strnlen bug. In the failure case, #define strndup to + rpl_strndup. + 2006-05-28 Ralf Wildenhues * c-strtod.m4 (gl_C99_STRTOLD): Use a link test rather than a diff --git a/m4/strndup.m4 b/m4/strndup.m4 index 66cedb433..1d112ae5e 100644 --- a/m4/strndup.m4 +++ b/m4/strndup.m4 @@ -1,5 +1,5 @@ -# strndup.m4 serial 5 -dnl Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +# strndup.m4 serial 6 +dnl Copyright (C) 2002-2003, 2005-2006 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 with or without modifications, as long as this notice is preserved. @@ -11,8 +11,36 @@ AC_DEFUN([gl_FUNC_STRNDUP], dnl Persuade glibc to declare strndup(). AC_REQUIRE([AC_GNU_SOURCE]) - AC_REPLACE_FUNCS(strndup) - if test $ac_cv_func_strndup = no; then + AC_CHECK_DECLS_ONCE([strndup]) + + # AIX 5.1 fails to add the terminating '\0'. + AC_CACHE_CHECK([for working strndup], gl_cv_func_strndup, + [AC_RUN_IFELSE([ + AC_LANG_PROGRAM([#include ], [[ +#ifndef HAVE_DECL_STRNDUP + extern char *strndup (const char *, size_t); +#endif + char *s; + s = strndup ("some longer string", 15); + free (s); + s = strndup ("shorter string", 13); + return s[13] != '\0';]])], + [gl_cv_func_strndup=yes], + [gl_cv_func_strndup=no], + [AC_EGREP_CPP([too risky], [ +#ifdef _AIX + too risky +#endif + ], + [gl_cv_func_strndup=no], + [gl_cv_func_strndup=yes])])]) + if test $gl_cv_func_strndup = yes; then + AC_DEFINE([HAVE_STRNDUP], 1, + [Define if you have the strndup() function and it works.]) + else + AC_LIBOBJ([strndup]) + AC_DEFINE(strndup, rpl_strndup, + [Define to rpl_strndup if the replacement function should be used,]) gl_PREREQ_STRNDUP fi ]) -- 2.11.0