summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-03-27 06:54:31 +0000
committerNeil Brown <neilb@suse.de>2006-03-27 06:54:31 +0000
commit0a416ec30712b201fbbf300e032cfea02109cd23 (patch)
tree789e88ef97692bbdcf6e6792a7dbebd2edea7a43
parent06b0d786758c63004f69948895527ca63c371525 (diff)
downloadmdadm-0a416ec30712b201fbbf300e032cfea02109cd23.tar.gz
mdadm-0a416ec30712b201fbbf300e032cfea02109cd23.tar.xz
mdadm-0a416ec30712b201fbbf300e032cfea02109cd23.zip
Make scanning of /dev work even if it is a symlink
We generally don't want to follow symlinks in /dev, but if /dev itself is a symlink, we want to follow it. So nftw needs a bit of help. Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r--util.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/util.c b/util.c
index ff17500..ab606ab 100644
--- a/util.c
+++ b/util.c
@@ -384,6 +384,8 @@ int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
if ((stb->st_mode&S_IFMT)== S_IFBLK) {
char *n = strdup(name);
struct devmap *dm = malloc(sizeof(*dm));
+ if (strncmp(n, "/dev/.", 6)==0)
+ strcpy(n+4, name+6);
if (dm) {
dm->major = major(stb->st_rdev);
dm->minor = minor(stb->st_rdev);
@@ -407,7 +409,12 @@ char *map_dev(int major, int minor)
struct devmap *p;
char *std = NULL, *nonstd=NULL;
if (!devlist_ready) {
- nftw("/dev", add_dev, 10, FTW_PHYS);
+ char *dev = "/dev";
+ struct stat stb;
+ if (lstat(dev, &stb)==0 &&
+ S_ISLNK(stb.st_mode))
+ dev = "/dev/.";
+ nftw(dev, add_dev, 10, FTW_PHYS);
devlist_ready=1;
}