Ralf Wildenhues wrote: > Not sure if I have much motivation for fighting this into glibc, but > here you go. I'm unsure if conditionalizing away the #undef __strndup > is wrong for some system. > > Tested on AIX 4.3.3, 5.1, 5.2 (first has strnlen and strndup broken, > second has strnlen fixed, last has both fixed)
gnulib does not support SunOS 4 and AIX 3, but AIX 5.1 is quite recent and IMO worth supporting. I added your patch to gnulib, with 4 modifications: - In strdup.c, #undef __strndup can stay unconditional. - In strndup.m4, I think you dropped the code that cares about defining HAVE_STRNDUP (used by strndup.h). - In strndup.m4, why use AC_INCLUDES_DEFAULT when later on, strndup.h includes only <string.h>? - In strndup.m4, when cross-compiling, don't penalize glibc systems. Assume the function needs a replacement only on AIX. > + test $gl_cv_func_strndup = no && > + if test $gl_cv_func_strndup = no; then Was this intended redundancy or a typo? Bruno 2006-05-30 Ralf Wildenhues <[EMAIL PROTECTED]> Bruno Haible <[EMAIL PROTECTED]> * 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-30 Ralf Wildenhues <[EMAIL PROTECTED]> Bruno Haible <[EMAIL PROTECTED]> * strndup.c (strndup) [!_LIBC]: Don't undefine macro definition. diff -c -3 -r1.5 strndup.m4 *** m4/strndup.m4 11 Aug 2005 09:56:12 -0000 1.5 --- m4/strndup.m4 30 May 2006 19:12:29 -0000 *************** *** 1,5 **** ! # strndup.m4 serial 5 ! dnl Copyright (C) 2002, 2003, 2005 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. --- 1,5 ---- ! # 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,18 **** dnl Persuade glibc <string.h> to declare strndup(). AC_REQUIRE([AC_GNU_SOURCE]) ! AC_REPLACE_FUNCS(strndup) ! if test $ac_cv_func_strndup = no; then gl_PREREQ_STRNDUP fi ]) --- 11,46 ---- dnl Persuade glibc <string.h> to declare strndup(). AC_REQUIRE([AC_GNU_SOURCE]) ! 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 <string.h>], [[ ! #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 ]) diff -c -3 -r1.14 strndup.c *** lib/strndup.c 24 Jan 2006 07:40:58 -0000 1.14 --- lib/strndup.c 30 May 2006 19:12:29 -0000 *************** *** 36,42 **** #endif #undef __strndup ! #undef strndup #ifndef weak_alias # define __strndup strndup --- 36,44 ---- #endif #undef __strndup ! #if _LIBC ! # undef strndup ! #endif #ifndef weak_alias # define __strndup strndup