]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: allow to convert /dev/loopN to backing filename
authorKarel Zak <kzak@redhat.com>
Thu, 23 Jun 2011 14:06:27 +0000 (16:06 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 23 Jun 2011 14:06:27 +0000 (16:06 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/samples/mount.c
libmount/src/cache.c
libmount/src/libmount.h.in
libmount/src/libmount.sym

index 76956d5ab24821388b1c26c7691465d9247df7cc..e01612144609e7954e608064f1ad81fd0e70709d 100644 (file)
@@ -118,13 +118,13 @@ static void print_all(struct libmnt_context *cxt, char *pattern, int show_label)
                const char *type = mnt_fs_get_fstype(fs);
                const char *src = mnt_fs_get_source(fs);
                const char *optstr = mnt_fs_get_options(fs);
+               char *xsrc;
 
                if (type && pattern && !mnt_match_fstype(type, pattern))
                        continue;
 
-               /* TODO: print loop backing file instead of device name */
-
-               printf ("%s on %s", src ? : "none", mnt_fs_get_target(fs));
+               xsrc = mnt_pretty_path(src, cache);
+               printf ("%s on %s", xsrc, mnt_fs_get_target(fs));
                if (type)
                        printf (" type %s", type);
                if (optstr)
@@ -135,6 +135,7 @@ static void print_all(struct libmnt_context *cxt, char *pattern, int show_label)
                                printf (" [%s]", lb);
                }
                fputc('\n', stdout);
+               free(xsrc);
        }
 
        mnt_free_cache(cache);
index 2738eee80cd72b0a1dca22ca12309a2ad5d9297c..e3bdcd089e16e96b602f04364320ddc702acc309 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "canonicalize.h"
 #include "mountP.h"
+#include "loopdev.h"
 
 /*
  * Canonicalized (resolved) paths & tags cache
@@ -447,6 +448,10 @@ char *mnt_get_fstype(const char *devname, int *ambi, struct libmnt_cache *cache)
  * @path: "native" path
  * @cache: cache for results or NULL
  *
+ * Converts path:
+ *     - to the absolute path
+ *     - /dev/dm-N to /dev/mapper/<name>
+ *
  * Returns: absolute path or NULL in case of error. The result has to be
  * deallocated by free() if @cache is NULL.
  */
@@ -489,6 +494,52 @@ error:
        return NULL;
 }
 
+/**
+ * mnt_pretty_path:
+ * @path: any path
+ * @cache: NULL or pointer to the cache
+ *
+ * Converts path:
+ *     - to the absolute path
+ *     - /dev/dm-N to /dev/mapper/<name>
+ *     - /dev/loopN to the loop backing filename
+ *     - empty path (NULL) to 'none'
+ *
+ * Returns: new allocated string with path, result has to be always deallocated
+ *          by free().
+ */
+char *mnt_pretty_path(const char *path, struct libmnt_cache *cache)
+{
+       char *pretty = mnt_resolve_path(path, cache);
+
+       if (!pretty)
+               return strdup("none");
+
+       /* users assume backing file name rather than /dev/loopN in
+        * output if the device has been initialized by mount(8).
+        */
+       if (strncmp(pretty, "/dev/loop", 9) == 0) {
+               struct loopdev_cxt lc;
+
+               loopcxt_init(&lc, 0);
+               loopcxt_set_device(&lc, pretty);
+
+               if (loopcxt_is_autoclear(&lc)) {
+                       char *tmp = loopcxt_get_backing_file(&lc);
+                       if (tmp) {
+                               if (!cache)
+                                       free(pretty);   /* not cached, deallocate */
+                               return tmp;             /* return backing file */
+                       }
+               }
+               loopcxt_deinit(&lc);
+
+       }
+
+       /* don't return pointer to the cache, allocate a new string */
+       return cache ? strdup(pretty) : pretty;
+}
+
 /**
  * mnt_resolve_tag:
  * @token: tag name
index 111b3a6838d0ef14db60ebc5e982a0c415cb9a80..160c7049d8a418dfdf1f72b97fdb4b213e183a38 100644 (file)
@@ -148,6 +148,8 @@ extern char *mnt_resolve_tag(const char *token, const char *value,
                             struct libmnt_cache *cache);
 extern char *mnt_resolve_spec(const char *spec, struct libmnt_cache *cache);
 
+extern char *mnt_pretty_path(const char *path, struct libmnt_cache *cache);
+
 /* optstr.c */
 extern int mnt_optstr_next_option(char **optstr, char **name, size_t *namesz,
                                char **value, size_t *valuesz);
index 34727a6685df75b963d13567b8acb09583873923..8b5cb61dd46e7a6834c8e725ed4d88c327e77d7d 100644 (file)
@@ -157,6 +157,7 @@ global:
        mnt_optstr_remove_option;
        mnt_optstr_set_option;
        mnt_parse_version_string;
+       mnt_pretty_path;
        mnt_reset_context;
        mnt_reset_fs;
        mnt_reset_iter;