[Libguestfs] [PATCH 1/1] libldm: Make libldm to parse and return volume GUID.

Mykola Ivanets stenavin at gmail.com
Thu May 10 05:25:37 UTC 2018


LDM volume GUID is a significant piece of information about LDM volume analogously to GPT disk/partition GUID. Windows use volume GUID to keep track of assigned drive letters, for example.

We extract volume GUID while parsing volume VBLK in _parse_vblk_vol function.  "show volume" ldmtool command returns extracted volume GUID alongside with other volume information.
---
 src/ldm.c     |  6 ++++--
 src/ldm.h     | 10 ++++++++++
 src/ldmtool.c |  3 +++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/ldm.c b/src/ldm.c
index 19a0663..fe5a19b 100644
--- a/src/ldm.c
+++ b/src/ldm.c
@@ -467,6 +467,7 @@ typedef enum {
 
 struct _LDMVolumePrivate
 {
+    uuid_t guid;
     guint32 id;
     gchar *name;
     gchar *dgname;
@@ -535,6 +536,7 @@ ldm_volume_get_property(GObject * const o, const guint property_id,
 }
 
 EXPORT_PROP_STRING(volume, LDMVolume, name)
+EXPORT_PROP_GUID(volume, LDMVolume)
 EXPORT_PROP_SCALAR(volume, LDMVolume, size, guint64)
 EXPORT_PROP_SCALAR(volume, LDMVolume, part_type, guint8)
 EXPORT_PROP_STRING(volume, LDMVolume, hint)
@@ -1514,8 +1516,8 @@ _parse_vblk_vol(const guint8 revision, const guint16 flags,
 
     vol->part_type = *((uint8_t *)vblk); vblk++;
 
-    /* Volume id */
-    vblk += 16;
+    /* Volume GUID */
+    memcpy(&vol->guid, vblk, 16); vblk += 16;
 
     if (flags & 0x08) vol->id1 = _parse_var_string(&vblk);
     if (flags & 0x20) vol->id2 = _parse_var_string(&vblk);
diff --git a/src/ldm.h b/src/ldm.h
index af0726e..280fbfb 100644
--- a/src/ldm.h
+++ b/src/ldm.h
@@ -369,6 +369,16 @@ GArray *ldm_volume_get_partitions(LDMVolume *o);
  */
 gchar *ldm_volume_get_name(const LDMVolume *o);
 
+/**
+ * ldm_volume_get_guid:
+ * @o: An #LDMVolume
+ *
+ * Get the Windows-assigned GUID of a volume.
+ *
+ * Returns: (transfer full): The string representation of the GUID
+ */
+gchar *ldm_volume_get_guid(const LDMVolume *o);
+
 /**
  * ldm_volume_get_voltype:
  * @o: An #LDMVolume
diff --git a/src/ldmtool.c b/src/ldmtool.c
index 4899539..4a76126 100644
--- a/src/ldmtool.c
+++ b/src/ldmtool.c
@@ -279,6 +279,7 @@ show_volume(LDM *const ldm, const gint argc, gchar ** const argv,
         LDMVolume * const vol = g_array_index(volumes, LDMVolume *, i);
 
         gchar *name = ldm_volume_get_name(vol);
+        gchar* guid = ldm_volume_get_guid(vol);
         LDMVolumeType type = ldm_volume_get_voltype(vol);
         guint64 size = ldm_volume_get_size(vol);
         guint64 chunk_size = ldm_volume_get_chunk_size(vol);
@@ -294,6 +295,8 @@ show_volume(LDM *const ldm, const gint argc, gchar ** const argv,
 
             json_builder_set_member_name(jb, "name");
             json_builder_add_string_value(jb, name);
+            json_builder_set_member_name(jb, "guid");
+            json_builder_add_string_value(jb, guid);
             json_builder_set_member_name(jb, "type");
             json_builder_add_string_value(jb, type_v->value_nick);
             json_builder_set_member_name(jb, "size");
-- 
2.17.0




More information about the Libguestfs mailing list