From a621795a3c011d3e3cf9031f09f2bdfa05d4dc8c Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Wed, 10 Oct 2012 17:00:41 +0200 Subject: [PATCH] libdm: add mangling support for dm_task_set_uuid Also, add a new field to struct dm_task called "mangled_uuid" that will store mangled form of uuid if it differs from original uuid. --- libdm/ioctl/libdm-iface.c | 5 +++++ libdm/ioctl/libdm-targets.h | 1 + libdm/libdm-common.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index 3166c06f4..0dd25ef34 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -455,6 +455,7 @@ void dm_task_destroy(struct dm_task *dmt) dm_free(dmt->message); dm_free(dmt->geometry); dm_free(dmt->uuid); + dm_free(dmt->mangled_uuid); dm_free(dmt); } @@ -1317,6 +1318,8 @@ static int _create_and_load_v4(struct dm_task *dmt) dmt->type = DM_DEVICE_RESUME; dm_free(dmt->uuid); dmt->uuid = NULL; + dm_free(dmt->mangled_uuid); + dmt->mangled_uuid = NULL; if (dm_task_run(dmt)) return 1; @@ -1325,6 +1328,8 @@ static int _create_and_load_v4(struct dm_task *dmt) dmt->type = DM_DEVICE_REMOVE; dm_free(dmt->uuid); dmt->uuid = NULL; + dm_free(dmt->mangled_uuid); + dmt->mangled_uuid = NULL; /* * Also udev-synchronize "remove" dm task that is a part of this revert! diff --git a/libdm/ioctl/libdm-targets.h b/libdm/ioctl/libdm-targets.h index c004d3e8f..8fc873897 100644 --- a/libdm/ioctl/libdm-targets.h +++ b/libdm/ioctl/libdm-targets.h @@ -69,6 +69,7 @@ struct dm_task { int expected_errno; char *uuid; + char *mangled_uuid; }; struct cmd_data { diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c index b990ded3c..b8533ed6d 100644 --- a/libdm/libdm-common.c +++ b/libdm/libdm-common.c @@ -717,7 +717,35 @@ int dm_task_set_newname(struct dm_task *dmt, const char *newname) int dm_task_set_uuid(struct dm_task *dmt, const char *uuid) { + char mangled_uuid[DM_UUID_LEN]; + dm_string_mangling_t mangling_mode = dm_get_name_mangling_mode(); + int r = 0; + dm_free(dmt->uuid); + dmt->uuid = NULL; + dm_free(dmt->mangled_uuid); + dmt->mangled_uuid = NULL; + + if (!check_multiple_mangled_string_allowed(uuid, "UUID", mangling_mode)) + return_0; + + if (mangling_mode != DM_STRING_MANGLING_NONE && + (r = mangle_string(uuid, "UUID", strlen(uuid), mangled_uuid, + sizeof(mangled_uuid), mangling_mode)) < 0) { + log_error("Failed to mangle device uuid \"%s\".", uuid); + return 0; + } + + if (r) { + log_debug("Device uuid mangled [%s]: %s --> %s", + mangling_mode == DM_STRING_MANGLING_AUTO ? "auto" : "hex", + uuid, mangled_uuid); + + if (!(dmt->mangled_uuid = dm_strdup(mangled_uuid))) { + log_error("dm_task_set_uuid: dm_strdup(%s) failed", mangled_uuid); + return 0; + } + } if (!(dmt->uuid = dm_strdup(uuid))) { log_error("dm_task_set_uuid: strdup(%s) failed", uuid); -- 2.43.5