X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=block.c;h=2726b1ceb7fbddcc85df9cce256b96d08823a20c;hp=a44241dd9a753af78e2d6483557dd4f05936a450;hb=17fec3a09b65e09311042cff037bf97ce28ef693;hpb=c8b51499261146cae10270ca2dd7dcc637a2d509 diff --git a/block.c b/block.c index a44241d..2726b1c 100644 --- a/block.c +++ b/block.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -885,6 +886,35 @@ static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int plen) } #endif +static int find_root_dev(char *buf, int len) +{ + DIR *d; + dev_t root; + struct stat s; + struct dirent *e; + + if (stat("/", &s)) + return -1; + + if (!(d = opendir("/dev"))) + return -1; + + root = s.st_dev; + + while ((e = readdir(d)) != NULL) { + snprintf(buf, len, "/dev/%s", e->d_name); + + if (stat(buf, &s) || s.st_rdev != root) + continue; + + closedir(d); + return 0; + } + + closedir(d); + return -1; +} + static int check_extroot(char *path) { struct blkid_struct_probe *pr = NULL; @@ -902,8 +932,10 @@ static int check_extroot(char *path) return -1; } #else - if (find_block_mtd("rootfs", fs, sizeof(fs))) - return -1; + if (find_block_mtd("rootfs", fs, sizeof(fs))) { + if (find_root_dev(fs, sizeof(fs))) + return -1; + } #endif list_for_each_entry(pr, &devices, list) {