summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--mdadm.h26
-rw-r--r--util.c50
3 files changed, 45 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index 75e53bb..3ff36ce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@ Changes Prior to this release
information in superblocks.
- Don't claim newly added spares are InSync!! (don't know why that
code was ever in there)
+ - Work better when no 'ftw' is available, and check to see
+ if current uclibc provides ftw.
Changes Prior to 2.5.1 release
- Various fixes for gcc warnings
diff --git a/mdadm.h b/mdadm.h
index 9113560..6afdf86 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -343,16 +343,32 @@ extern struct supertype *guess_super(int fd);
struct stat64;
#endif
+#define HAVE_NFTW we assume
+#define HAVE_FTW
+
#ifdef UCLIBC
- struct FTW {};
+# include <features.h>
+# ifndef __UCLIBC_HAS_FTW__
+# undef HAVE_FTW
+# undef HAVE_NFTW
+# endif
+#endif
+
+#ifdef __dietlibc__
+# undef HAVE_NFTW
+#endif
+
+#ifndef HAVE_NFTW
# define FTW_PHYS 1
-#else
-# include <ftw.h>
-# ifdef __dietlibc__
-# define FTW_PHYS 1
+# ifndef HAVE_FTW
+ struct FTW {};
# endif
#endif
+#ifdef HAVE_FTW
+# include <ftw.h>
+#endif
+
extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
diff --git a/util.c b/util.c
index 2cb6dd3..08319cb 100644
--- a/util.c
+++ b/util.c
@@ -354,32 +354,6 @@ struct devmap {
} *devlist = NULL;
int devlist_ready = 0;
-#ifdef UCLIBC
-int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
-{
- return 0;
-}
-char *map_dev(int major, int minor, int create)
-{
-#if 0
- fprintf(stderr, "Warning - fail to map %d,%d to a device name\n",
- major, minor);
-#endif
- return NULL;
-}
-#else
-
-#ifdef __dietlibc__
-int add_dev_1(const char *name, const struct stat *stb, int flag)
-{
- return add_dev(name, stb, flag, NULL);
-}
-int nftw(const char *path, int (*han)(const char *name, const struct stat *stb, int flag, struct FTW *s), int nopenfd, int flags)
-{
- return ftw(path, add_dev_1, nopenfd);
-}
-#endif
-
int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
{
struct stat st;
@@ -404,6 +378,28 @@ int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
return 0;
}
+#ifndef HAVE_NFTW
+#ifdef HAVE_FTW
+int add_dev_1(const char *name, const struct stat *stb, int flag)
+{
+ return add_dev(name, stb, flag, NULL);
+}
+int nftw(const char *path, int (*han)(const char *name, const struct stat *stb, int flag, struct FTW *s), int nopenfd, int flags)
+{
+ return ftw(path, add_dev_1, nopenfd);
+}
+#else
+int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
+{
+ return 0;
+}
+int nftw(const char *path, int (*han)(const char *name, const struct stat *stb, int flag, struct FTW *s), int nopenfd, int flags)
+{
+ return 0;
+}
+#endif /* HAVE_FTW */
+#endif /* HAVE_NFTW */
+
/*
* Find a block device with the right major/minor number.
* If we find multiple names, choose the shortest.
@@ -464,8 +460,6 @@ char *map_dev(int major, int minor, int create)
return nonstd ? nonstd : std;
}
-#endif
-
unsigned long calc_csum(void *super, int bytes)
{
unsigned long long newcsum = 0;