bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

fts: Add support for Android


From: Bruno Haible
Subject: fts: Add support for Android
Date: Sun, 27 Jan 2019 11:32:29 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-141-generic; KDE/5.18.0; x86_64; ; )

On Android 4.3 (on a Linux ext4 file system), I see the 'test-fts' test fail.
There are two problems:

  1) fts_open apparently fails with error EINVAL. This happens because the
     test program uses the 'fts_open' etc. symbols from libc instead of those
     from libgnu.a - but the flag definitions come from gnulib's fts_.h, not
     from the libc's <fts.h>.
     The cause is that the GCC wrapper program passes '-lc' before all other
     arguments. This may be seen as a bug in this GCC wrapper. But on the
     other hand, symbols from a gnulib module may end up in shared libraries,
     and when shared libraries are involved, it is more hairy to control the
     precedence of symbols. For this reason, gnulib generally just avoids
     defining symbols that exist in libc. Let me do the same thing here.

  2) The mkdir() call in the loop in test-fts.c fails with error EMLINK; the
     test thus produces the error message
       t-fts.tmp/d/64999: Too many links
     The fix is to treat EMLINK like EMFILE here. (I think EMLINK is a more
     sensible error number for this kind of failure, compared to EMFILE,
     anyway.)


2019-01-26  Bruno Haible  <address@hidden>

        fts: Add support for Android.
        * m4/fts.m4 (gl_FUNC_FTS_CORE): Avoid conflicts between the symbols
        defined by this module and the ones in libc.
        * tests/test-fts.c (main): Treat mkdir error EMLINK like EMFILE.

diff --git a/m4/fts.m4 b/m4/fts.m4
index a9bf6a6..fa51ab4 100644
--- a/m4/fts.m4
+++ b/m4/fts.m4
@@ -1,4 +1,4 @@
-#serial 21
+#serial 22
 dnl Copyright (C) 2005-2019 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -28,4 +28,22 @@ AC_DEFUN([gl_FUNC_FTS_CORE],
         ]])
     fi
   fi
+
+  AC_CHECK_FUNC([fts_open])
+  if test $ac_cv_func_fts_open = yes; then
+    dnl The system already has the symbols fts_open, etc.
+    dnl Avoid conflicts between these symbols and ours at the linker level.
+    AC_DEFINE([fts_open], [rpl_fts_open],
+      [Define to the overridden function name])
+    AC_DEFINE([fts_close], [rpl_fts_close],
+      [Define to the overridden function name])
+    AC_DEFINE([fts_read], [rpl_fts_read],
+      [Define to the overridden function name])
+    AC_DEFINE([fts_set], [rpl_fts_set],
+      [Define to the overridden function name])
+    AC_DEFINE([fts_children], [rpl_fts_children],
+      [Define to the overridden function name])
+    AC_DEFINE([fts_cross_check], [rpl_fts_cross_check],
+      [Define to the overridden function name])
+  fi
 ])
diff --git a/tests/test-fts.c b/tests/test-fts.c
index 14d3702..4c6bdb6 100644
--- a/tests/test-fts.c
+++ b/tests/test-fts.c
@@ -102,7 +102,7 @@ main (void)
 
   /* Create directories BASE, BASE/d, BASE/d/1, BASE/d/2, ..., BASE/d/65536,
      to stress-test fts.  Stop if directory creation fails due to
-     EMFILE problems, or if BASE/d's link count no longer matches the
+     EMFILE or EMLINK problems, or if BASE/d's link count no longer matches the
      Unix tradition.  See:
      https://bugzilla.kernel.org/show_bug.cgi?id=196405
      for more info.  */
@@ -115,7 +115,9 @@ main (void)
       sprintf (buf, "%s/d/%i", base, i);
       if (mkdir (buf, 0777) != 0)
         {
-          if (errno != EMFILE || i <= needles)
+          if (errno == EMFILE || errno == EMLINK)
+            break;
+          if (i <= needles)
             perror_exit (buf, 77);
           break;
         }




reply via email to

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