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

Reply via email to