Mykola Ivanets
2018-May-10 05:25 UTC
[Libguestfs] [PATCH 0/1] libldm: Make libldm to parse and return volume GUID.
The result of this patch will be used by libguestfs to return drive mappings for LDM volumes. Note, that "show volume" ldmtool command already returns hint which is a drive letter assigned by Windows to corresponding volume. But it is not reliable source of information. More over, in multiboot environment it is unclear which drive letter belongs to which operating system. Volume GUID allows to overcome this shortcomming. Mykola Ivanets (1): libldm: Make libldm to parse and return volume GUID. src/ldm.c | 6 ++++-- src/ldm.h | 10 ++++++++++ src/ldmtool.c | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) -- 2.17.0
Mykola Ivanets
2018-May-10 05:25 UTC
[Libguestfs] [PATCH 1/1] libldm: Make libldm to parse and return volume GUID.
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
Possibly Parallel Threads
- [PATCH libldm v2 0/1] Make libldm to parse and return volume GUID.
- [PATCH libldm v3 0/2] Make libldm to parse and return volume GUID.
- [PATCH libldm v4 0/3] Make libldm to parse and return volume GUID.
- [PATCH libldm 00/12] New API: an ability to retrieve created device-mapper devices back after they have been created.
- [PATCH libldm v2 0/1] Fix crash while creating mapper for a volume which lacks of partitions.