tag 552891 patch thanks Hi,
a problem with scandir and scandir64 types while compiling fakechroot seems to originate from recent libc prototype change of the functions. Current scandir and scandir64 functions take as last fourth parameter pointer to comparator function of const struct dirent/dirent64 ** instead of earlier void pointers. fakechroot already has a noble test for scandir parameters in its configure script, but the test in configure script did not support this specific types for comparator function. In the patch attached I've added support for these types so that compile time detection uses correct prototypes for the functions. I had to duplicate the test for scandir64 as it has had similar change in the type parameters. In addition to applying the patch attached, one MUST run autogen.sh from source root.
diff -ur -x Makefile.in -x Makefile.am -x config.sub -x config.guess -x config.h.in -x configure -x aclocal.m4 -x debian/ -x ltmain.sh -x fakechroot.1 -x changelog -x control -x rules fakechroot-2.9.orig2/configure.ac fakechroot-2.9/configure.ac --- fakechroot-2.9.orig2/configure.ac 2009-03-19 17:06:47.000000000 +0200 +++ fakechroot-2.9/configure.ac 2010-01-07 22:54:45.000000000 +0200 @@ -177,6 +177,7 @@ AC_FUNC_READLINK_ARGTYPES AC_FUNC_SCANDIR_ARGTYPES +AC_FUNC_SCANDIR64_ARGTYPES AC_CONFIG_FILES([ \ Makefile \ diff -ur -x Makefile.in -x Makefile.am -x config.sub -x config.guess -x config.h.in -x configure -x aclocal.m4 -x debian/ -x ltmain.sh -x fakechroot.1 -x changelog -x control -x rules fakechroot-2.9.orig2/m4/scandir_argtypes.m4 fakechroot-2.9/m4/scandir_argtypes.m4 --- fakechroot-2.9.orig2/m4/scandir_argtypes.m4 2009-03-19 16:43:19.000000000 +0200 +++ fakechroot-2.9/m4/scandir_argtypes.m4 2010-01-07 23:05:13.000000000 +0200 @@ -12,7 +12,7 @@ for ac_arg1 in 'const char *dir'; do for ac_arg2 in 'struct dirent ***namelist'; do for ac_arg3 in 'int(*filter)(const struct dirent *)' 'int(*filter)(struct dirent *)'; do - for ac_arg4 in 'int(*compar)(const void *,const void *)'; do + for ac_arg4 in 'int(*compar)(const void *,const void *)' 'int(*compar)(const struct dirent **,const struct dirent **)'; do AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT @@ -46,3 +46,51 @@ [Define to the type of arg 4 for `scandir'.]) rm -f conftest* ]) +dnl AC_FUNC_SCANDIR64_ARGTYPES +dnl ------------------------- +dnl Determine the correct type to be passed to each of the `scandir64' +dnl function's arguments, and define those types in `SCANDIR64_TYPE_ARG1', +dnl `SCANDIR64_TYPE_ARG2', `SCANDIR64_TYPE_ARG3' and `SCANDIR64_TYPE_ARG4'. +AN_FUNCTION([scandir64], [AC_FUNC_SCANDIR64_ARGTYPES]) +AC_DEFUN([AC_FUNC_SCANDIR64_ARGTYPES], +[AC_CHECK_HEADERS(dirent.h) +AC_CACHE_CHECK([types of arguments for scandir64], +[ac_cv_func_scandir64_args], +[for ac_return in 'int'; do + for ac_arg1 in 'const char *dir'; do + for ac_arg2 in 'struct dirent64 ***namelist'; do + for ac_arg3 in 'int(*filter)(const struct dirent64 *)'; do + for ac_arg4 in 'int(*compar)(const void *,const void *)' 'int(*compar)(const struct dirent64 **,const struct dirent64 **)'; do + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( +[AC_INCLUDES_DEFAULT +#ifdef HAVE_UNISTD_H +#include <dirent.h> +#endif +], + [extern $ac_return scandir64 ($ac_arg1, $ac_arg2, $ac_arg3, $ac_arg4);])], + [ac_cv_func_scandir64_args="$ac_return;$ac_arg1;$ac_arg2;$ac_arg3;$ac_arg4"; break 5]) + done + done + done + done +done +# Provide a safe default value. +: ${ac_cv_func_scandir64_args='(default) int;const char *dir;struct dirent64 ***namelist;int(*filter)(const struct dirent64 *);int(*compar)(const void *,const void *)'} +]) +ac_save_IFS=$IFS; IFS=';' +set dummy `echo "$ac_cv_func_scandir64_args" | sed 's/^(default) //' | sed 's/\*/\*/g'` +IFS=$ac_save_IFS +shift +AC_DEFINE_UNQUOTED(SCANDIR64_TYPE_RETURN, $[1], + [Define to the type of return value for `scandir64'.]) +AC_DEFINE_UNQUOTED(SCANDIR64_TYPE_ARG1, $[2], + [Define to the type of arg 1 for `scandir64'.]) +AC_DEFINE_UNQUOTED(SCANDIR64_TYPE_ARG2, $[3], + [Define to the type of arg 2 for `scandir64'.]) +AC_DEFINE_UNQUOTED(SCANDIR64_TYPE_ARG3, $[4], + [Define to the type of arg 3 for `scandir64'.]) +AC_DEFINE_UNQUOTED(SCANDIR64_TYPE_ARG4, $[5], + [Define to the type of arg 4 for `scandir64'.]) +rm -f conftest* +]) diff -ur -x Makefile.in -x Makefile.am -x config.sub -x config.guess -x config.h.in -x configure -x aclocal.m4 -x debian/ -x ltmain.sh -x fakechroot.1 -x changelog -x control -x rules fakechroot-2.9.orig2/src/libfakechroot.c fakechroot-2.9/src/libfakechroot.c --- fakechroot-2.9.orig2/src/libfakechroot.c 2009-03-31 13:20:41.000000000 +0300 +++ fakechroot-2.9/src/libfakechroot.c 2010-01-07 22:55:37.000000000 +0200 @@ -2619,7 +2619,7 @@ #ifdef HAVE_SCANDIR /* #include <dirent.h> */ -int scandir (const char *dir, struct dirent ***namelist, SCANDIR_TYPE_ARG3, int(*compar)(const void *, const void *)) +int scandir (const char *dir, struct dirent ***namelist, SCANDIR_TYPE_ARG3, SCANDIR_TYPE_ARG4) { char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; expand_chroot_path(dir, fakechroot_path, fakechroot_ptr, fakechroot_buf); @@ -2631,7 +2631,7 @@ #ifdef HAVE_SCANDIR64 /* #include <dirent.h> */ -int scandir64 (const char *dir, struct dirent64 ***namelist, int(*filter)(const struct dirent64 *), int(*compar)(const void *, const void *)) +int scandir64 (const char *dir, struct dirent64 ***namelist, int(*filter)(const struct dirent64 *), SCANDIR64_TYPE_ARG4) { char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH]; expand_chroot_path(dir, fakechroot_path, fakechroot_ptr, fakechroot_buf);
-- Tommi Vainikainen