qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 3 of 3] Add -uuid command line flag


From: Ryan Harper
Subject: [Qemu-devel] [PATCH 3 of 3] Add -uuid command line flag
Date: Tue, 11 Dec 2007 14:08:53 -0600

3 files changed, 61 insertions(+), 6 deletions(-)
smbios.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
sysemu.h |    1 +
vl.c     |    8 ++++++++


# HG changeset patch
# User Ryan Harper <address@hidden>
# Date 1197402122 21600
# Node ID f1372e77455459b3e21ae908bb56cd43356159fd
# Parent  115f40a4994be1d5b44ef193b3ccbe8e26410eef
Add -uuid command line flag

This patch allows users to specify a uuid.  If no uuid is specified, then one is
generated.

Now supports -uuid both with and without libuuid
Moved some includes into hw/hw.h and sysemh.h
Reduced the number of CONFIG_UUID defines

Signed-off-by: Ryan Harper <address@hidden>

diff -r 115f40a4994b -r f1372e774554 smbios.c
--- a/smbios.c  Tue Dec 11 13:42:02 2007 -0600
+++ b/smbios.c  Tue Dec 11 13:42:02 2007 -0600
@@ -32,11 +32,47 @@
 
 #ifdef CONFIG_UUID
 #include <uuid/uuid.h>
-#endif
+
+static int qemu_uuid_parse(const char *in, uint8_t *uu)
+{
+    if (uuid_parse(in, *((uuid_t *)uu)) < 0)
+        return -1;
+
+    return 0;
+}
+
+#define qemu_uuid_generate(x) (uuid_generate(*((uuid_t *)x)))
+
+#else
+#define UUID2 "%02x%02x"
+#define UUID4 "%02x%02x%02x%02x"
+#define UUID6 "%02x%02x%02x%02x%02x%02x"
+#define UUID_FMT UUID4"-"UUID2"-"UUID2"-"UUID2"-"UUID6
+
+static int qemu_uuid_parse(const char *in, uint8_t *uu)
+{
+    unsigned int u[16];
+    int rv, i;
+
+    /* NB: sscanf requires %x format to store values in unsigned int */
+    rv = sscanf(in, UUID_FMT, u, u+1, u+2, u+3, u+4, u+5, u+6, u+7, u+8,
+                u+9, u+10, u+11, u+12, u+13, u+14, u+15);
+
+    if (rv != 16)
+        return -1;
+
+    for (i=0; i<16; i++)
+        uu[i] = (uint8_t)u[i];
+
+    return 0;
+}
+#define qemu_uuid_generate(x) (memcpy(x, "QEMUQEMUQEMUQEMU", 16))
+
+#endif /* CONFIG_UUID */
 
 /* Write a two-character hex representation of 'byte' to digits[].
    Pre-condition: sizeof(digits) >= 2 */
-void
+static void
 byte_to_hex(char *digits, uint8_t byte)
 {
     uint8_t nybbel = byte >> 4;
@@ -493,12 +529,22 @@ load_smbios_tables(uint8_t *entry, uint8
     uint32_t major_version = 0;
     uint32_t minor_version = 9;
 #ifdef CONFIG_UUID
-    uuid_t uuid;
-
-    uuid_generate(uuid);
+    uuid_t u;
+    uint8_t *uuid = (char *)&u;
 #else
-    uint8_t uuid[16] = "QEMUQEMUQEMUQEMU";
+    uint8_t uuid[16];
 #endif
+
+    /* parse user-specified uuid if present */
+    if (qemu_uuid != NULL) {
+        if (qemu_uuid_parse(qemu_uuid, uuid) < 0) {
+            fprintf(stderr, "SMBIOS: Could not parse user UUID"
+                            " string, check format.\n");
+            return -1;
+        }
+    } else {
+        qemu_uuid_generate(uuid);
+    }
 
     len = write_smbios_tables(entry, table, phys_table_start,
                               smp_cpus, (ram_size >> 20),
diff -r 115f40a4994b -r f1372e774554 sysemu.h
--- a/sysemu.h  Tue Dec 11 13:42:02 2007 -0600
+++ b/sysemu.h  Tue Dec 11 13:42:02 2007 -0600
@@ -90,6 +90,7 @@ extern int autostart;
 extern int autostart;
 extern int old_param;
 extern const char *bootp_filename;
+extern const char *qemu_uuid;
 
 
 #ifdef USE_KQEMU
diff -r 115f40a4994b -r f1372e774554 vl.c
--- a/vl.c      Tue Dec 11 13:42:02 2007 -0600
+++ b/vl.c      Tue Dec 11 13:42:02 2007 -0600
@@ -138,6 +138,7 @@ int inet_aton(const char *cp, struct in_
 #else
 #define SMBD_COMMAND "/usr/sbin/smbd"
 #endif
+const char *qemu_uuid;
 
 //#define DEBUG_UNUSED_IOPORT
 //#define DEBUG_IOPORT
@@ -7545,6 +7546,8 @@ static void help(int exitcode)
            "-no-reboot      exit instead of rebooting\n"
            "-loadvm file    start right away with a saved state (loadvm in 
monitor)\n"
           "-vnc display    start a VNC server on display\n"
+           "-uuid %%08x-%%04x-%%04x-%%04x-%%012x\n"
+           "                specify machine UUID\n"
 #ifndef _WIN32
           "-daemonize      daemonize QEMU after initializing\n"
 #endif
@@ -7647,6 +7650,7 @@ enum {
     QEMU_OPTION_vnc,
     QEMU_OPTION_no_acpi,
     QEMU_OPTION_no_reboot,
+    QEMU_OPTION_uuid,
     QEMU_OPTION_show_cursor,
     QEMU_OPTION_daemonize,
     QEMU_OPTION_option_rom,
@@ -7742,6 +7746,7 @@ const QEMUOption qemu_options[] = {
     { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
     { "smp", HAS_ARG, QEMU_OPTION_smp },
     { "vnc", HAS_ARG, QEMU_OPTION_vnc },
+    { "uuid", HAS_ARG, QEMU_OPTION_uuid },
 
     /* temporary options */
     { "usb", 0, QEMU_OPTION_usb },
@@ -8527,6 +8532,9 @@ int main(int argc, char **argv)
            case QEMU_OPTION_daemonize:
                daemonize = 1;
                break;
+            case QEMU_OPTION_uuid:
+                qemu_uuid = optarg;
+                break;
            case QEMU_OPTION_option_rom:
                if (nb_option_roms >= MAX_OPTION_ROMS) {
                    fprintf(stderr, "Too many option ROMs\n");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]