diff options
author | Neil Brown <neilb@suse.de> | 2006-03-27 06:54:31 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2006-03-27 06:54:31 +0000 |
commit | 0a416ec30712b201fbbf300e032cfea02109cd23 (patch) | |
tree | 789e88ef97692bbdcf6e6792a7dbebd2edea7a43 | |
parent | 06b0d786758c63004f69948895527ca63c371525 (diff) | |
download | mdadm-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.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -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; } |