[Libguestfs] [common PATCH 2/2] options: allow a UUID as identifier for --key
Richard W.M. Jones
rjones at redhat.com
Fri Nov 29 11:43:54 UTC 2019
On Fri, Nov 29, 2019 at 12:20:04PM +0100, Pino Toscano wrote:
> This way it is possible to specify the UUID of the LUKS device instead
> of the libguestfs device name to decrypt a device during the inspection.
>
> Make the usage of the new luks_uuid API conditional, so other projects
> using the common submodule do not require a libguestfs version bump.
> ---
> options/decrypt.c | 8 +++++++-
> options/key-option.pod | 4 ++--
> options/keys.c | 4 ++--
> options/options.h | 6 +++---
> 4 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/options/decrypt.c b/options/decrypt.c
> index 3511d9f..683cf5e 100644
> --- a/options/decrypt.c
> +++ b/options/decrypt.c
> @@ -86,7 +86,13 @@ inspect_do_decrypt (guestfs_h *g, struct key_store *ks)
> char mapname[32];
> make_mapname (partitions[i], mapname, sizeof mapname);
>
> - CLEANUP_FREE_STRING_LIST char **keys = get_keys (ks, partitions[i]);
> +#ifdef GUESTFS_HAVE_LUKS_UUID
Interesting that this is needed. I suppose because virt-v2v can be
compiled with libguestfs back to 1.40, and it uses the common module
so it would fail to build without this new API being present. I
hadn't anticipated this.
> + CLEANUP_FREE char *uuid = guestfs_luks_uuid (g, partitions[i]);
> +#else
> + const char *uuid = NULL;
> +#endif
> +
> + CLEANUP_FREE_STRING_LIST char **keys = get_keys (ks, partitions[i], uuid);
> assert (guestfs_int_count_strings (keys) > 0);
>
> /* Try each key in turn. */
> diff --git a/options/key-option.pod b/options/key-option.pod
> index 02dcf18..90a3b15 100644
> --- a/options/key-option.pod
> +++ b/options/key-option.pod
> @@ -1,8 +1,8 @@
> =item B<--key> SELECTOR
>
> Specify a key for LUKS, to automatically open a LUKS device when using
> -the inspection. C<ID> must be the libguestfs device name of the LUKS
> -device.
> +the inspection. C<ID> can be either the libguestfs device name, or
> +the UUID of the LUKS device.
>
> =over 4
>
> diff --git a/options/keys.c b/options/keys.c
> index 7c391ac..798315c 100644
> --- a/options/keys.c
> +++ b/options/keys.c
> @@ -126,7 +126,7 @@ read_first_line_from_file (const char *filename)
> * keystore, ask the user.
> */
> char **
> -get_keys (struct key_store *ks, const char *device)
> +get_keys (struct key_store *ks, const char *device, const char *uuid)
> {
> size_t i, j, len;
> char **r;
> @@ -148,7 +148,7 @@ get_keys (struct key_store *ks, const char *device)
> for (i = 0; i < ks->nr_keys; ++i) {
> struct key_store_key *key = &ks->keys[i];
>
> - if (STRNEQ (key->id, device))
> + if (STRNEQ (key->id, device) && (uuid && STRNEQ (key->id, uuid)))
> continue;
>
> switch (key->type) {
> diff --git a/options/options.h b/options/options.h
> index b83a92b..9b78302 100644
> --- a/options/options.h
> +++ b/options/options.h
> @@ -104,8 +104,8 @@ struct mp {
>
> /* A key in the key store. */
> struct key_store_key {
> - /* An ID for the device this key refers to. It must be the libguestfs
> - * device name.
> + /* An ID for the device this key refers to. It can be either the libguestfs
> + * device name, or the UUID.
> *
> * There may be multiple matching devices in the list.
> */
> @@ -150,7 +150,7 @@ extern void print_inspect_prompt (void);
>
> /* in key.c */
> extern char *read_key (const char *param);
> -extern char **get_keys (struct key_store *ks, const char *device);
> +extern char **get_keys (struct key_store *ks, const char *device, const char *uuid);
> extern struct key_store *key_store_add_from_selector (struct key_store *ks, const char *selector);
> extern struct key_store *key_store_import_key (struct key_store *ks, const struct key_store_key *key);
> extern void free_key_store (struct key_store *ks);
Looks fine, ACK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW
More information about the Libguestfs
mailing list