[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH v3 1/9] util: Add UUID API
From: |
Jeff Cody |
Subject: |
Re: [Qemu-block] [PATCH v3 1/9] util: Add UUID API |
Date: |
Tue, 9 Aug 2016 17:45:37 -0400 |
User-agent: |
Mutt/1.5.24 (2015-08-30) |
On Tue, Aug 09, 2016 at 02:49:59PM +0800, Fam Zheng wrote:
> A number of different places across the code base use CONFIG_UUID. Some
> of them are soft dependency, some are not built if libuuid is not
> available, some come with dummy fallback, some throws runtime error.
>
> It is hard to maintain, and hard to reason for users.
>
> Since UUID is a simple standard with only a small number of operations,
> it is cleaner to have a central support in libqemuutil. This patch adds
> qemu_uuid_* the functions so that all uuid users in the code base can
> rely on. Except for qemu_uuid_generate which is new code, all other
> functions are just copy from existing fallbacks from other files.
>
> Note that qemu_uuid_parse is moved without updating the function
> signature to use QemuUUID, to keep this patch simple.
>
> Signed-off-by: Fam Zheng <address@hidden>
> ---
> arch_init.c | 19 -----------
> block/iscsi.c | 2 +-
> hw/smbios/smbios.c | 1 +
> include/qemu/uuid.h | 48 ++++++++++++++++++++++++++
> include/sysemu/sysemu.h | 4 ---
> qmp.c | 1 +
> stubs/uuid.c | 2 +-
> util/Makefile.objs | 1 +
> util/uuid.c | 91
> +++++++++++++++++++++++++++++++++++++++++++++++++
> vl.c | 1 +
> 10 files changed, 145 insertions(+), 25 deletions(-)
> create mode 100644 include/qemu/uuid.h
> create mode 100644 util/uuid.c
>
> diff --git a/arch_init.c b/arch_init.c
> index fa05973..5cc58b2 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -235,25 +235,6 @@ void audio_init(void)
> }
> }
>
> -int qemu_uuid_parse(const char *str, uint8_t *uuid)
> -{
> - int ret;
> -
> - if (strlen(str) != 36) {
> - return -1;
> - }
> -
> - ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
> - &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
> - &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14],
> - &uuid[15]);
> -
> - if (ret != 16) {
> - return -1;
> - }
> - return 0;
> -}
> -
> void do_acpitable_option(const QemuOpts *opts)
> {
> #ifdef TARGET_I386
> diff --git a/block/iscsi.c b/block/iscsi.c
> index 95ce9e1..961ac76 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -36,7 +36,7 @@
> #include "block/block_int.h"
> #include "block/scsi.h"
> #include "qemu/iov.h"
> -#include "sysemu/sysemu.h"
> +#include "qemu/uuid.h"
> #include "qmp-commands.h"
> #include "qapi/qmp/qstring.h"
> #include "crypto/secret.h"
> diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
> index 74c7102..0705eb1 100644
> --- a/hw/smbios/smbios.c
> +++ b/hw/smbios/smbios.c
> @@ -20,6 +20,7 @@
> #include "qemu/config-file.h"
> #include "qemu/error-report.h"
> #include "sysemu/sysemu.h"
> +#include "qemu/uuid.h"
> #include "sysemu/cpus.h"
> #include "hw/smbios/smbios.h"
> #include "hw/loader.h"
> diff --git a/include/qemu/uuid.h b/include/qemu/uuid.h
> new file mode 100644
> index 0000000..80a75c2
> --- /dev/null
> +++ b/include/qemu/uuid.h
> @@ -0,0 +1,48 @@
> +/*
> + * QEMU UUID functions
> + *
> + * Copyright 2016 Red Hat, Inc.,
> + *
> + * Authors:
> + * Fam Zheng <address@hidden>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the Free
> + * Software Foundation; either version 2 of the License, or (at your option)
> + * any later version.
> + *
> + */
> +
> +#ifndef QEMU_UUID_H
> +#define QEMU_UUID_H
> +
> +#include "qemu-common.h"
> +
> +/* Version 4 UUID (pseudo random numbers), RFC4122 4.4. */
> +
> +typedef struct {
> + unsigned char data[16];
> +} QemuUUID;
> +
> +#define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-" \
> + "%02hhx%02hhx-%02hhx%02hhx-" \
> + "%02hhx%02hhx-" \
> + "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
> +
> +#define UUID_FMT_LEN 36
> +
> +#define UUID_NONE "00000000-0000-0000-0000-000000000000"
> +
> +void qemu_uuid_generate(QemuUUID *out);
> +
> +int qemu_uuid_is_null(const QemuUUID *uu);
> +
> +void qemu_uuid_unparse(char *out, const QemuUUID *uuid);
The libuuid version of this function has the prototype
uuid_unparse(uuid_t, char *). Could we keep the argument order the same as
libuuid, to avoid confusion?
> +
> +char *qemu_uuid_unparse_strdup(const QemuUUID *uuid);
> +
> +int qemu_uuid_parse(const char *str, uint8_t *uuid);
> +
> +void qemu_uuid_convert(QemuUUID *uuid);
> +
> +#endif
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index ee7c760..6111950 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -18,10 +18,6 @@ extern const char *bios_name;
> extern const char *qemu_name;
> extern uint8_t qemu_uuid[];
> extern bool qemu_uuid_set;
> -int qemu_uuid_parse(const char *str, uint8_t *uuid);
> -
> -#define UUID_FMT
> "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
> -#define UUID_NONE "00000000-0000-0000-0000-000000000000"
>
> bool runstate_check(RunState state);
> void runstate_set(RunState new_state);
> diff --git a/qmp.c b/qmp.c
> index b6d531e..0b65ba3 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -18,6 +18,7 @@
> #include "qemu/cutils.h"
> #include "monitor/monitor.h"
> #include "sysemu/sysemu.h"
> +#include "qemu/uuid.h"
> #include "qmp-commands.h"
> #include "sysemu/char.h"
> #include "ui/qemu-spice.h"
> diff --git a/stubs/uuid.c b/stubs/uuid.c
> index 92ad717..a880de8 100644
> --- a/stubs/uuid.c
> +++ b/stubs/uuid.c
> @@ -1,6 +1,6 @@
> #include "qemu/osdep.h"
> #include "qemu-common.h"
> -#include "sysemu/sysemu.h"
> +#include "qemu/uuid.h"
> #include "qmp-commands.h"
>
> UuidInfo *qmp_query_uuid(Error **errp)
> diff --git a/util/Makefile.objs b/util/Makefile.objs
> index 96cb1e0..31bba15 100644
> --- a/util/Makefile.objs
> +++ b/util/Makefile.objs
> @@ -20,6 +20,7 @@ util-obj-y += iov.o qemu-config.o qemu-sockets.o uri.o
> notify.o
> util-obj-y += qemu-option.o qemu-progress.o
> util-obj-y += hexdump.o
> util-obj-y += crc32c.o
> +util-obj-y += uuid.o
> util-obj-y += throttle.o
> util-obj-y += getauxval.o
> util-obj-y += readline.o
> diff --git a/util/uuid.c b/util/uuid.c
> new file mode 100644
> index 0000000..80c89f0
> --- /dev/null
> +++ b/util/uuid.c
> @@ -0,0 +1,91 @@
> +/*
> + * QEMU UUID functions
> + *
> + * Copyright 2016 Red Hat, Inc.,
> + *
> + * Authors:
> + * Fam Zheng <address@hidden>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the Free
> + * Software Foundation; either version 2 of the License, or (at your option)
> + * any later version.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu-common.h"
> +#include "qemu/uuid.h"
> +#include "qemu/bswap.h"
> +#include <glib.h>
> +
> +void qemu_uuid_generate(QemuUUID *uuid)
> +{
> + int i;
> + uint32_t *out = (uint32_t *)&uuid->data[0];
> +
> + QEMU_BUILD_BUG_ON(sizeof(QemuUUID) != 16);
> +
> + for (i = 0; i < 4; ++i) {
> + out[i] = g_random_int();
> + }
> + /* Set the two most significant bits (bits 6 and 7) of the
> + clock_seq_hi_and_reserved to zero and one, respectively. */
> + uuid->data[8] = (uuid->data[8] & 0x3f) | 0x80;
> + /* Set the four most significant bits (bits 12 through 15) of the
> + time_hi_and_version field to the 4-bit version number.
> + */
> + uuid->data[6] = (uuid->data[6] & 0xf) | 0x40;
> +}
> +
> +int qemu_uuid_is_null(const QemuUUID *uu)
> +{
> + QemuUUID null_uuid = { 0 };
> + return memcmp(uu, &null_uuid, sizeof(QemuUUID)) == 0;
> +}
> +
> +void qemu_uuid_unparse(char *out, const QemuUUID *uuid)
> +{
> + const unsigned char *uu = &uuid->data[0];
> + snprintf(out, UUID_FMT_LEN + 1, UUID_FMT,
> + uu[0], uu[1], uu[2], uu[3], uu[4], uu[5], uu[6], uu[7],
> + uu[8], uu[9], uu[10], uu[11], uu[12], uu[13], uu[14], uu[15]);
> +}
> +
> +char *qemu_uuid_unparse_strdup(const QemuUUID *uuid)
> +{
> + const unsigned char *uu = &uuid->data[0];
> + return g_strdup_printf(UUID_FMT,
> + uu[0], uu[1], uu[2], uu[3], uu[4], uu[5], uu[6],
> + uu[7], uu[8], uu[9], uu[10], uu[11], uu[12],
> + uu[13], uu[14], uu[15]);
> +}
> +
> +int qemu_uuid_parse(const char *str, uint8_t *uuid)
> +{
> + int ret;
> +
> + if (strlen(str) != 36) {
> + return -1;
> + }
> +
> + ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
> + &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
> + &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14],
> + &uuid[15]);
> +
> + if (ret != 16) {
> + return -1;
> + }
> + return 0;
> +}
> +
> +/* Change UUID from CPU endian to big endian format (network byte order,
> + * standard, see RFC 4122) and vice versa.
> + */
> +void qemu_uuid_convert(QemuUUID *uuid)
> +{
> + be32_to_cpus((uint32_t *)&uuid->data[0]);
> + be16_to_cpus((uint16_t *)&uuid->data[4]);
> + be16_to_cpus((uint16_t *)&uuid->data[6]);
> +}
> diff --git a/vl.c b/vl.c
> index c4eeaff..3d96684 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -25,6 +25,7 @@
> #include "qemu-version.h"
> #include "qemu/cutils.h"
> #include "qemu/help_option.h"
> +#include "qemu/uuid.h"
>
> #ifdef CONFIG_SECCOMP
> #include "sysemu/seccomp.h"
> --
> 2.7.4
>
- [Qemu-block] [PATCH v3 0/9] UUID clean ups for 2.8, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 1/9] util: Add UUID API, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 2/9] vhdx: Use QEMU UUID API, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 3/9] vdi: Use QEMU UUID API, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 4/9] vpc: Use QEMU UUID API, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 5/9] crypto: Switch to QEMU UUID API, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 6/9] tests: No longer dependent on CONFIG_UUID, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 7/9] configure: Remove detection code for UUID, Fam Zheng, 2016/08/09
- [Qemu-block] [PATCH v3 8/9] vl: Switch qemu_uuid to QemuUUID, Fam Zheng, 2016/08/09