[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;
}
- fts: Add support for Android,
Bruno Haible <=