block: also probe loop devices
[project/fstools.git] / block.c
diff --git a/block.c b/block.c
index 33264583c23b91ef32747c5e50c0c7b4fb624283..843d40292a016146292dd9ae27df80aead9f7e14 100644 (file)
--- 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)
 {
@@ -592,13 +574,13 @@ static char* find_mount_point(char *block)
        int len = strlen(block);
        char *point = NULL, *pos, *tmp, *cpoint, *devname;
        struct stat s;
+       int rstat;
        unsigned int minor, major;
 
        if (!fp)
                return NULL;
 
-       if (stat(block, &s))
-               return NULL;
+       rstat = stat(block, &s);
 
        while (fgets(line, sizeof(line), fp)) {
                pos = strchr(line, ' ');
@@ -658,6 +640,9 @@ static char* find_mount_point(char *block)
                        break;
                }
 
+               if (rstat)
+                       continue;
+
                if (!S_ISBLK(s.st_mode))
                        continue;
 
@@ -673,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, '/');
@@ -1105,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",