X-Git-Url: http://git.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=block.c;h=843d40292a016146292dd9ae27df80aead9f7e14;hp=6c025fdce4963eb6169a37517637d9ee6873dde4;hb=bb2239de848e7289856068ba0952bb4492c395d8;hpb=b98642a50b0cd11696eaad151638f8cf9d153c40 diff --git a/block.c b/block.c index 6c025fd..843d402 100644 --- a/block.c +++ b/block.c @@ -518,6 +518,7 @@ static void cache_load(int mtd) _cache_load("/dev/ubiblock*"); _cache_load("/dev/ubi[0-9]*"); } + _cache_load("/dev/loop*"); _cache_load("/dev/mmcblk*"); _cache_load("/dev/sd*"); _cache_load("/dev/hd*"); @@ -526,25 +527,6 @@ static void cache_load(int mtd) _cache_load("/dev/mapper/*"); } -static int print_block_info(struct blkid_struct_probe *pr) -{ - printf("%s:", pr->dev); - if (pr->uuid[0]) - printf(" UUID=\"%s\"", pr->uuid); - - if (pr->label[0]) - printf(" LABEL=\"%s\"", pr->label); - - if (pr->name[0]) - printf(" NAME=\"%s\"", pr->name); - - if (pr->version[0]) - printf(" VERSION=\"%s\"", pr->version); - - printf(" TYPE=\"%s\"\n", pr->id->name); - - return 0; -} static int print_block_uci(struct blkid_struct_probe *pr) { @@ -587,25 +569,86 @@ static struct blkid_struct_probe* find_block_info(char *uuid, char *label, char static char* find_mount_point(char *block) { - FILE *fp = fopen("/proc/mounts", "r"); + FILE *fp = fopen("/proc/self/mountinfo", "r"); static char line[256]; int len = strlen(block); - char *point = NULL; + char *point = NULL, *pos, *tmp, *cpoint, *devname; + struct stat s; + int rstat; + unsigned int minor, major; - if(!fp) + if (!fp) return NULL; + rstat = stat(block, &s); + while (fgets(line, sizeof(line), fp)) { - if (!strncmp(line, block, len)) { - char *p = &line[len + 1]; - char *t = strstr(p, " "); + pos = strchr(line, ' '); + if (!pos) + continue; - if (!t) { - fclose(fp); - return NULL; - } - *t = '\0'; - point = p; + pos = strchr(pos + 1, ' '); + if (!pos) + continue; + + tmp = ++pos; + pos = strchr(pos, ':'); + if (!pos) + continue; + + *pos = '\0'; + major = atoi(tmp); + tmp = ++pos; + pos = strchr(pos, ' '); + if (!pos) + continue; + + *pos = '\0'; + minor = atoi(tmp); + pos = strchr(pos + 1, ' '); + if (!pos) + continue; + tmp = ++pos; + + pos = strchr(pos, ' '); + if (!pos) + continue; + *pos = '\0'; + cpoint = tmp; + + pos = strchr(pos + 1, ' '); + if (!pos) + continue; + + pos = strchr(pos + 1, ' '); + if (!pos) + continue; + + pos = strchr(pos + 1, ' '); + if (!pos) + continue; + + tmp = ++pos; + pos = strchr(pos, ' '); + if (!pos) + continue; + + *pos = '\0'; + devname = tmp; + if (!strncmp(block, devname, len)) { + point = strdup(cpoint); + break; + } + + if (rstat) + continue; + + if (!S_ISBLK(s.st_mode)) + continue; + + if (major == major(s.st_rdev) && + minor == minor(s.st_rdev)) { + point = strdup(cpoint); break; } } @@ -615,6 +658,34 @@ static char* find_mount_point(char *block) return point; } +static int print_block_info(struct blkid_struct_probe *pr) +{ + static char *mp; + + mp = find_mount_point(pr->dev); + printf("%s:", pr->dev); + if (pr->uuid[0]) + printf(" UUID=\"%s\"", pr->uuid); + + if (pr->label[0]) + printf(" LABEL=\"%s\"", pr->label); + + if (pr->name[0]) + printf(" NAME=\"%s\"", pr->name); + + if (pr->version[0]) + printf(" VERSION=\"%s\"", pr->version); + + if (mp) { + printf(" MOUNT=\"%s\"", mp); + free(mp); + } + + printf(" TYPE=\"%s\"\n", pr->id->name); + + return 0; +} + static void mkdir_p(char *dir) { char *l = strrchr(dir, '/'); @@ -700,6 +771,7 @@ static int mount_device(struct blkid_struct_probe *pr, int hotplug) { struct mount *m; char *device; + char *mp; if (!pr) return -1; @@ -719,8 +791,10 @@ static int mount_device(struct blkid_struct_probe *pr, int hotplug) if (hotplug && !auto_mount) return -1; - if (find_mount_point(pr->dev)) { - ULOG_ERR("%s is already mounted\n", pr->dev); + mp = find_mount_point(pr->dev); + if (mp) { + ULOG_ERR("%s is already mounted on %s\n", pr->dev, mp); + free(mp); return -1; } @@ -753,7 +827,7 @@ static int mount_device(struct blkid_struct_probe *pr, int hotplug) } if (anon_mount) { - char target[] = "/mnt/mmcblk123"; + char target[32]; int err = 0; snprintf(target, sizeof(target), "/mnt/%s", device); @@ -803,6 +877,7 @@ static int umount_device(struct blkid_struct_probe *pr) ULOG_INFO("unmounted %s (%s)\n", pr->dev, mp); + free(mp); return err; } @@ -828,6 +903,7 @@ static int main_hotplug(int argc, char **argv) ULOG_ERR("umount of %s failed (%d) - %s\n", mount_point, err, strerror(err)); + free(mount_point); return 0; } else if (strcmp(action, "add")) { ULOG_ERR("Unkown action %s\n", action); @@ -1042,7 +1118,7 @@ static int check_extroot(char *path) tag, errno, strerror(errno)); fclose(fp); - if (*uuid || !strcasecmp(uuid, pr->uuid)) + if (*uuid && !strcasecmp(uuid, pr->uuid)) return 0; ULOG_ERR("extroot: UUID mismatch (root: %s, %s: %s)\n", @@ -1277,7 +1353,7 @@ static int main_info(int argc, char **argv) ULOG_ERR("failed to stat %s\n", argv[i]); continue; } - if (!S_ISBLK(s.st_mode)) { + if (!S_ISBLK(s.st_mode) && !(S_ISCHR(s.st_mode) && major(s.st_rdev) == 250)) { ULOG_ERR("%s is not a block device\n", argv[i]); continue; }