[Libvir] PATCH: UUID code cleanup

Daniel P. Berrange berrange at redhat.com
Wed Aug 8 21:03:53 UTC 2007


Browsing the source I noticed we have many differents constants for UUID
length, many ways of turning a UUID into a string, 2 ways of turning a
string into a UUID (one with some scary signed <-> unsigned casting).
This is just a result of the way the code evolved & I figured it could do
with cleaning up a little.

So I added a virUUIDFormat(const unsigned char uuid, char *uuidstr) method
to the uuid.c, removed all the other equivalent code throughout and kiled
all the duplicate constants. So now everything UUID related is in the one
place uuid.c, while the constants are in libvirt/libvirt.h

Its a surprisingly big patch, but it should not have any functional change
with one exception. The XenD driver used to generate XML <uuid>...</uuid>
tags without any '-' embedded in them. All other places use the '-' and
technically the RFC requires them. Our parser is flexible enough to cope
with, or without '-'.

 diffstat  ~/libvirt-uuid-cleanup.patch
 proxy/Makefile.am   |    2 -
 qemud/internal.h    |    2 -
 src/libvirt.c       |   34 +++-------------------------
 src/openvz_conf.c   |   14 +++++------
 src/openvz_conf.h   |    3 --
 src/qemu_conf.c     |   20 ++++++----------
 src/qemu_conf.h     |    5 +---
 src/test.c          |   18 +++++----------
 src/uuid.c          |   57 +++++++++++++++++++++++++++++++++--------------
 src/uuid.h          |   13 ++++------
 src/xend_internal.c |   62 +++++++++++++++++++---------------------------------
 src/xm_internal.c   |   31 +++++---------------------
 src/xml.c           |   61 ---------------------------------------------------
 src/xml.h           |    1 
 14 files changed, 104 insertions(+), 219 deletions(-)


Regards,
Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
Index: proxy/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/proxy/Makefile.am,v
retrieving revision 1.11
diff -u -p -r1.11 Makefile.am
--- proxy/Makefile.am	26 Jun 2007 22:33:22 -0000	1.11
+++ proxy/Makefile.am	8 Aug 2007 20:57:04 -0000
@@ -10,7 +10,7 @@ libexec_PROGRAMS = libvirt_proxy
 libvirt_proxy_SOURCES = libvirt_proxy.c @top_srcdir@/src/xend_internal.c \
 	    @top_srcdir@/src/xen_internal.c @top_srcdir@/src/virterror.c \
 	    @top_srcdir@/src/sexpr.c @top_srcdir@/src/xml.c \
-            @top_srcdir@/src/xs_internal.c @top_srcdir@/src/buf.c
+            @top_srcdir@/src/xs_internal.c @top_srcdir@/src/buf.c @top_srcdir@/src/uuid.c
 libvirt_proxy_LDFLAGS = $(WARN_CFLAGS)
 libvirt_proxy_DEPENDENCIES =
 libvirt_proxy_LDADD =
Index: qemud/internal.h
===================================================================
RCS file: /data/cvs/libvirt/qemud/internal.h,v
retrieving revision 1.33
diff -u -p -r1.33 internal.h
--- qemud/internal.h	7 Aug 2007 13:02:35 -0000	1.33
+++ qemud/internal.h	8 Aug 2007 20:57:04 -0000
@@ -48,8 +48,6 @@
 #define ATTRIBUTE_FORMAT(...)
 #endif
 
-#define UUID_LEN 16
-
 typedef enum {
     QEMUD_ERR,
     QEMUD_WARN,
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.92
diff -u -p -r1.92 libvirt.c
--- src/libvirt.c	27 Jul 2007 23:23:00 -0000	1.92
+++ src/libvirt.c	8 Aug 2007 20:57:05 -0000
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "driver.h"
 
-#include "xml.h"
+#include "uuid.h"
 #include "test.h"
 #include "xen_unified.h"
 #include "remote_internal.h"
@@ -1384,22 +1384,6 @@ virDomainGetUUID(virDomainPtr domain, un
     if (domain->id == 0) {
         memset(uuid, 0, VIR_UUID_BUFLEN);
     } else {
-#if 0
-        /* Probably legacy code: It appears that we always fill in
-         * the UUID when creating the virDomain structure, so this
-         * shouldn't be necessary.
-         */
-        if ((domain->uuid[0] == 0) && (domain->uuid[1] == 0) &&
-            (domain->uuid[2] == 0) && (domain->uuid[3] == 0) &&
-            (domain->uuid[4] == 0) && (domain->uuid[5] == 0) &&
-            (domain->uuid[6] == 0) && (domain->uuid[7] == 0) &&
-            (domain->uuid[8] == 0) && (domain->uuid[9] == 0) &&
-            (domain->uuid[10] == 0) && (domain->uuid[11] == 0) &&
-            (domain->uuid[12] == 0) && (domain->uuid[13] == 0) &&
-            (domain->uuid[14] == 0) && (domain->uuid[15] == 0))
-            xenDaemonDomainLookupByName_ids(domain->conn, domain->name,
-                                &domain->uuid[0]);
-#endif
         memcpy(uuid, &domain->uuid[0], VIR_UUID_BUFLEN);
     }
     return (0);
@@ -1433,12 +1417,7 @@ virDomainGetUUIDString(virDomainPtr doma
     if (virDomainGetUUID(domain, &uuid[0]))
         return (-1);
 
-    snprintf(buf, VIR_UUID_STRING_BUFLEN,
-	"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                      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]);
+    virUUIDFormat(uuid, buf);
     return (0);
 }
 
@@ -2853,14 +2832,9 @@ virNetworkGetUUIDString(virNetworkPtr ne
     }
 
     if (virNetworkGetUUID(network, &uuid[0]))
-	return (-1);
+        return (-1);
 
-    snprintf(buf, VIR_UUID_STRING_BUFLEN,
-	"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                      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]);
+    virUUIDFormat(uuid, buf);
     return (0);
 }
 
Index: src/openvz_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/openvz_conf.c,v
retrieving revision 1.3
diff -u -p -r1.3 openvz_conf.c
--- src/openvz_conf.c	19 Jul 2007 16:22:40 -0000	1.3
+++ src/openvz_conf.c	8 Aug 2007 20:57:05 -0000
@@ -76,7 +76,7 @@ struct openvz_vm 
     struct openvz_vm *vm = driver->vms;
 
     while (vm) {
-        if (!memcmp(vm->vmdef->uuid, uuid, OPENVZ_UUID_MAX))
+        if (!memcmp(vm->vmdef->uuid, uuid, VIR_UUID_BUFLEN))
             return vm;
         vm = vm->next;
     }
@@ -400,8 +400,8 @@ static int 
 openvzSetUUID(int vpsid)
 {
     char conf_file[PATH_MAX];
-    char uuid[VIR_UUID_STRING_BUFLEN];
-    unsigned char new_uuid[VIR_UUID_BUFLEN];
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
+    unsigned char uuid[VIR_UUID_BUFLEN];
     char *conf_dir;
     int fd, ret, i;
 
@@ -418,11 +418,9 @@ openvzSetUUID(int vpsid)
         return -1;
 
     if(uuid[0] == (int)NULL) {
-        virUUIDGenerate(new_uuid);
-        bzero(uuid, VIR_UUID_STRING_BUFLEN);
-        for(i = 0; i < VIR_UUID_BUFLEN; i ++)
-            sprintf(uuid + (i * 2), "%02x", (unsigned char)new_uuid[i]);
-    
+        virUUIDGenerate(uuid);
+        virUUIDFormat(uuid, uuidstr);
+
         lseek(fd, 0, SEEK_END);
         write(fd, "\n#UUID: ", 8);
         write(fd, uuid, strlen(uuid));
Index: src/openvz_conf.h
===================================================================
RCS file: /data/cvs/libvirt/src/openvz_conf.h,v
retrieving revision 1.2
diff -u -p -r1.2 openvz_conf.h
--- src/openvz_conf.h	19 Jul 2007 16:22:40 -0000	1.2
+++ src/openvz_conf.h	8 Aug 2007 20:57:05 -0000
@@ -27,7 +27,6 @@
 #include "openvz_driver.h"
 
 #define OPENVZ_NAME_MAX 8
-#define OPENVZ_UUID_MAX 16
 #define OPENVZ_TMPL_MAX 256
 #define OPENVZ_UNAME_MAX    32
 #define OPENVZ_IP_MAX   16
@@ -74,7 +73,7 @@ struct openvz_net_def {
 
 struct openvz_vm_def {
     char name[OPENVZ_NAME_MAX];
-    unsigned char uuid[OPENVZ_UUID_MAX];
+    unsigned char uuid[VIR_UUID_BUFLEN];
     char profile[OPENVZ_PROFILE_MAX];
     struct openvz_fs_def fs;
     struct openvz_net_def net;
Index: src/qemu_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.c,v
retrieving revision 1.10
diff -u -p -r1.10 qemu_conf.c
--- src/qemu_conf.c	7 Aug 2007 13:02:35 -0000	1.10
+++ src/qemu_conf.c	8 Aug 2007 20:57:05 -0000
@@ -83,7 +83,7 @@ struct qemud_vm *qemudFindVMByUUID(const
     struct qemud_vm *vm = driver->vms;
 
     while (vm) {
-        if (!memcmp(vm->def->uuid, uuid, QEMUD_UUID_RAW_LEN))
+        if (!memcmp(vm->def->uuid, uuid, VIR_UUID_BUFLEN))
             return vm;
         vm = vm->next;
     }
@@ -109,7 +109,7 @@ struct qemud_network *qemudFindNetworkBy
     struct qemud_network *network = driver->networks;
 
     while (network) {
-        if (!memcmp(network->def->uuid, uuid, QEMUD_UUID_RAW_LEN))
+        if (!memcmp(network->def->uuid, uuid, VIR_UUID_BUFLEN))
             return network;
         network = network->next;
     }
@@ -2724,6 +2724,7 @@ char *qemudGenerateXML(virConnectPtr con
                        int live) {
     virBufferPtr buf = 0;
     unsigned char *uuid;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     struct qemud_vm_disk_def *disk;
     struct qemud_vm_net_def *net;
     struct qemud_vm_input_def *input;
@@ -2762,11 +2763,8 @@ char *qemudGenerateXML(virConnectPtr con
         goto no_memory;
 
     uuid = def->uuid;
-    if (virBufferVSprintf(buf, "  <uuid>%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x</uuid>\n",
-                          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]) < 0)
+    virUUIDFormat(uuid, uuidstr);
+    if (virBufferVSprintf(buf, "  <uuid>%s</uuid>\n", uuidstr) < 0)
         goto no_memory;
     if (virBufferVSprintf(buf, "  <memory>%d</memory>\n", def->maxmem) < 0)
         goto no_memory;
@@ -3023,6 +3021,7 @@ char *qemudGenerateNetworkXML(virConnect
                               struct qemud_network_def *def) {
     virBufferPtr buf = 0;
     unsigned char *uuid;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     buf = virBufferNew (QEMUD_MAX_XML_LEN);
     if (!buf)
@@ -3035,11 +3034,8 @@ char *qemudGenerateNetworkXML(virConnect
         goto no_memory;
 
     uuid = def->uuid;
-    if (virBufferVSprintf(buf, "  <uuid>%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x</uuid>\n",
-                          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]) < 0)
+    virUUIDFormat(uuid, uuidstr);
+    if (virBufferVSprintf(buf, "  <uuid>%s</uuid>\n", uuidstr) < 0)
         goto no_memory;
 
     if (def->forward) {
Index: src/qemu_conf.h
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.h,v
retrieving revision 1.6
diff -u -p -r1.6 qemu_conf.h
--- src/qemu_conf.h	30 Jul 2007 09:59:06 -0000	1.6
+++ src/qemu_conf.h	8 Aug 2007 20:57:05 -0000
@@ -78,7 +78,6 @@ enum qemud_vm_net_type {
     QEMUD_NET_BRIDGE,
 };
 
-#define QEMUD_UUID_RAW_LEN 16
 #define QEMUD_MAX_NAME_LEN 50
 #define QEMUD_MAX_XML_LEN 4096
 #define QEMUD_MAX_ERROR_LEN 1024
@@ -170,7 +169,7 @@ struct qemud_vm_os_def {
 /* Guest VM main configuration */
 struct qemud_vm_def {
     int virtType;
-    unsigned char uuid[QEMUD_UUID_RAW_LEN];
+    unsigned char uuid[VIR_UUID_BUFLEN];
     char name[QEMUD_MAX_NAME_LEN];
 
     int memory;
@@ -232,7 +231,7 @@ struct qemud_dhcp_range_def {
 
 /* Virtual Network main configuration */
 struct qemud_network_def {
-    unsigned char uuid[QEMUD_UUID_RAW_LEN];
+    unsigned char uuid[VIR_UUID_BUFLEN];
     char name[QEMUD_MAX_NAME_LEN];
 
     char bridge[BR_IFNAME_MAXLEN];
Index: src/test.c
===================================================================
RCS file: /data/cvs/libvirt/src/test.c,v
retrieving revision 1.43
diff -u -p -r1.43 test.c
--- src/test.c	27 Jul 2007 23:23:00 -0000	1.43
+++ src/test.c	8 Aug 2007 20:57:05 -0000
@@ -42,7 +42,7 @@
 #include "test.h"
 #include "xml.h"
 #include "buf.h"
-
+#include "uuid.h"
 
 struct _testDev {
     char name[20];
@@ -206,8 +206,7 @@ static int testLoadDomain(virConnectPtr 
     xmlNodePtr root = NULL;
     xmlXPathContextPtr ctxt = NULL;
     char *name = NULL;
-    unsigned char rawuuid[VIR_UUID_BUFLEN];
-    char *dst_uuid;
+    unsigned char uuid[VIR_UUID_BUFLEN];
     struct timeval tv;
     unsigned long memory = 0;
     unsigned long maxMem = 0;
@@ -248,8 +247,7 @@ static int testLoadDomain(virConnectPtr 
         testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain uuid"));
         goto error;
     }
-    dst_uuid = (char *) &rawuuid[0];
-    if (!(virParseUUID((char **)&dst_uuid, str))) {
+    if (!(virUUIDParse(str, uuid))) {
         testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain uuid"));
         goto error;
     }
@@ -332,7 +330,7 @@ static int testLoadDomain(virConnectPtr 
     if (memory > maxMem)
         memory = maxMem;
 
-    memmove(privconn->domains[handle].uuid, rawuuid, VIR_UUID_BUFLEN);
+    memmove(privconn->domains[handle].uuid, uuid, VIR_UUID_BUFLEN);
     privconn->domains[handle].info.maxMem = maxMem;
     privconn->domains[handle].info.memory = memory;
     privconn->domains[handle].info.state = domid < 0 ? VIR_DOMAIN_SHUTOFF : VIR_DOMAIN_RUNNING;
@@ -404,8 +402,7 @@ static int testLoadNetwork(virConnectPtr
     xmlNodePtr root = NULL;
     xmlXPathContextPtr ctxt = NULL;
     char *name = NULL, *bridge = NULL;
-    unsigned char rawuuid[VIR_UUID_BUFLEN];
-    char *dst_uuid;
+    unsigned char uuid[VIR_UUID_BUFLEN];
     char *str;
     char *ipaddress = NULL, *ipnetmask = NULL, *dhcpstart = NULL, *dhcpend = NULL;
     int forward;
@@ -438,8 +435,7 @@ static int testLoadNetwork(virConnectPtr
         testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("network uuid"));
         goto error;
     }
-    dst_uuid = (char *) &rawuuid[0];
-    if (!(virParseUUID((char **)&dst_uuid, str))) {
+    if (!(virUUIDParse(str, uuid))) {
         testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("network uuid"));
         goto error;
     }
@@ -498,7 +494,7 @@ static int testLoadNetwork(virConnectPtr
         bridge = NULL;
     }
 
-    memmove(privconn->networks[handle].uuid, rawuuid, VIR_UUID_BUFLEN);
+    memmove(privconn->networks[handle].uuid, uuid, VIR_UUID_BUFLEN);
     privconn->networks[handle].forward = forward;
     if (forwardDev) {
         strncpy(privconn->networks[handle].forwardDev, forwardDev, sizeof(privconn->networks[handle].forwardDev)-1);
Index: src/uuid.c
===================================================================
RCS file: /data/cvs/libvirt/src/uuid.c,v
retrieving revision 1.2
diff -u -p -r1.2 uuid.c
--- src/uuid.c	29 Jun 2007 13:23:13 -0000	1.2
+++ src/uuid.c	8 Aug 2007 20:57:05 -0000
@@ -79,7 +79,7 @@ virUUIDGeneratePseudoRandomBytes(unsigne
 
 /**
  * virUUIDGenerate:
- * @uuid: array of VIR_UUID_RAW_LEN bytes to store the new UUID
+ * @uuid: array of VIR_UUID_BUFLEN bytes to store the new UUID
  *
  * Generates a randomized unique identifier.
  *
@@ -93,18 +93,18 @@ virUUIDGenerate(unsigned char *uuid)
     if (uuid == NULL)
         return(-1);
 
-    if ((err = virUUIDGenerateRandomBytes(uuid, VIR_UUID_RAW_LEN)))
+    if ((err = virUUIDGenerateRandomBytes(uuid, VIR_UUID_BUFLEN)))
         qemudLog(QEMUD_WARN,
                  "Falling back to pseudorandom UUID, "
                  "failed to generate random bytes: %s", strerror(err));
 
-    return virUUIDGeneratePseudoRandomBytes(uuid, VIR_UUID_RAW_LEN);
+    return virUUIDGeneratePseudoRandomBytes(uuid, VIR_UUID_BUFLEN);
 }
 
 /**
  * virUUIDParse:
- * @uuid: zero terminated string representation of the UUID
- * @rawuuid: array of VIR_UUID_RAW_LEN bytes to store the raw UUID
+ * @uuidstr: zero terminated string representation of the UUID
+ * @uuid: array of VIR_UUID_BUFLEN bytes to store the raw UUID
  *
  * Parses the external string representation, allowing spaces and '-'
  * character in the sequence, and storing the result as a raw UUID
@@ -112,20 +112,20 @@ virUUIDGenerate(unsigned char *uuid)
  * Returns 0 in case of success and -1 in case of error.
  */
 int
-virUUIDParse(const char *uuid, unsigned char *rawuuid) {
+virUUIDParse(const char *uuidstr, unsigned char *uuid) {
     const char *cur;
     int i;
 
-    if ((uuid == NULL) || (rawuuid == NULL))
+    if ((uuidstr == NULL) || (uuid == NULL))
         return(-1);
 
     /*
      * do a liberal scan allowing '-' and ' ' anywhere between character
      * pairs as long as there is 32 of them in the end.
      */
-    cur = uuid;
-    for (i = 0;i < 16;) {
-        rawuuid[i] = 0;
+    cur = uuidstr;
+    for (i = 0;i < VIR_UUID_BUFLEN;) {
+        uuid[i] = 0;
         if (*cur == 0)
             goto error;
         if ((*cur == '-') || (*cur == ' ')) {
@@ -133,23 +133,23 @@ virUUIDParse(const char *uuid, unsigned 
             continue;
         }
         if ((*cur >= '0') && (*cur <= '9'))
-            rawuuid[i] = *cur - '0';
+            uuid[i] = *cur - '0';
         else if ((*cur >= 'a') && (*cur <= 'f'))
-            rawuuid[i] = *cur - 'a' + 10;
+            uuid[i] = *cur - 'a' + 10;
         else if ((*cur >= 'A') && (*cur <= 'F'))
-            rawuuid[i] = *cur - 'A' + 10;
+            uuid[i] = *cur - 'A' + 10;
         else
             goto error;
-        rawuuid[i] *= 16;
+        uuid[i] *= 16;
         cur++;
         if (*cur == 0)
             goto error;
         if ((*cur >= '0') && (*cur <= '9'))
-            rawuuid[i] += *cur - '0';
+            uuid[i] += *cur - '0';
         else if ((*cur >= 'a') && (*cur <= 'f'))
-            rawuuid[i] += *cur - 'a' + 10;
+            uuid[i] += *cur - 'a' + 10;
         else if ((*cur >= 'A') && (*cur <= 'F'))
-            rawuuid[i] += *cur - 'A' + 10;
+            uuid[i] += *cur - 'A' + 10;
         else
             goto error;
         i++;
@@ -162,6 +162,29 @@ virUUIDParse(const char *uuid, unsigned 
     return -1;
 }
 
+/**
+ * virUUIDFormat:
+ * @uuid: array of VIR_UUID_RAW_LEN bytes to store the raw UUID
+ * @uuidstr: array of VIR_UUID_STRING_BUFLEN bytes to store the
+ * string representation of the UUID in. The resulting string
+ * will be NULL terminated.
+ *
+ * Converts the raw UUID into printable format, with embedded '-'
+ *
+ * Returns 0 in case of success and -1 in case of error.
+ */
+void virUUIDFormat(const unsigned char *uuid, char *uuidstr)
+{
+    snprintf(uuidstr, VIR_UUID_STRING_BUFLEN,
+             "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+             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]);
+    uuidstr[VIR_UUID_STRING_BUFLEN-1] = '\0';
+}
+
+
 /*
  * Local variables:
  *  indent-tabs-mode: nil
Index: src/uuid.h
===================================================================
RCS file: /data/cvs/libvirt/src/uuid.h,v
retrieving revision 1.2
diff -u -p -r1.2 uuid.h
--- src/uuid.h	29 Jun 2007 13:23:13 -0000	1.2
+++ src/uuid.h	8 Aug 2007 20:57:05 -0000
@@ -22,15 +22,12 @@
 #ifndef __VIR_UUID_H__
 #define __VIR_UUID_H__
 
-/**
- * VIR_UUID_RAW_LEN:
- * number of bytes used by an UUID in raw form
- */
-#define VIR_UUID_RAW_LEN 16
-
 int virUUIDGenerate(unsigned char *uuid);
 
-int virUUIDParse(const char *uuid,
-		 unsigned char *rawuuid);
+int virUUIDParse(const char *uuidstr,
+		 unsigned char *uuid);
+
+void virUUIDFormat(const unsigned char *uuid,
+		   char *uuidstr);
 
 #endif /* __VIR_UUID_H__ */
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.131
diff -u -p -r1.131 xend_internal.c
--- src/xend_internal.c	18 Jul 2007 21:08:22 -0000	1.131
+++ src/xend_internal.c	8 Aug 2007 20:57:05 -0000
@@ -36,6 +36,7 @@
 #include "sexpr.h"
 #include "xml.h"
 #include "buf.h"
+#include "uuid.h"
 #include "xen_unified.h"
 #include "xend_internal.h"
 #include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */
@@ -776,13 +777,15 @@ sexpr_u64(struct sexpr *sexpr, const cha
  *
  * convenience function to lookup an UUID value from the S-Expression
  *
- * Returns a pointer to the stored UUID or NULL in case of error.
+ * Returns a -1 on error, 0 on success
  */
-static unsigned char *
-sexpr_uuid(char **ptr, struct sexpr *node, const char *path)
+static int
+sexpr_uuid(unsigned char *ptr, struct sexpr *node, const char *path)
 {
     const char *r = sexpr_node(node, path);
-    return virParseUUID(ptr, r);
+    if (!r)
+        return -1;
+    return virUUIDParse(r, ptr);
 }
 
 
@@ -1061,10 +1064,7 @@ xenDaemonDomainLookupByName_ids(virConne
                      _("domain information incorrect domid not numeric"));
         ret = -1;
     } else if (uuid != NULL) {
-        char *uuid_c = (char *) uuid;
-        char **ptr = &uuid_c;
-
-        if (sexpr_uuid(ptr, root, "domain/uuid") == NULL) {
+        if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
             virXendError(xend, VIR_ERR_INTERNAL_ERROR,
                          _("domain information incomplete, missing uuid"));
         }
@@ -1094,7 +1094,6 @@ xenDaemonDomainLookupByID(virConnectPtr 
 			  unsigned char *uuid)
 {
     const char *name = NULL;
-    char *dst_uuid;
     struct sexpr *root;
 
     memset(uuid, 0, VIR_UUID_BUFLEN);
@@ -1112,8 +1111,7 @@ xenDaemonDomainLookupByID(virConnectPtr 
     if (domname)
       *domname = strdup(name);
 
-    dst_uuid = (char *)&uuid[0];
-    if (sexpr_uuid(&dst_uuid, root, "domain/uuid") == NULL) {
+    if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
       virXendError(xend, VIR_ERR_INTERNAL_ERROR,
                    _("domain information incomplete, missing uuid"));
       goto error;
@@ -1354,6 +1352,8 @@ xend_parse_sexp_desc(virConnectPtr conn,
     int hvm = 0, bootloader = 0;
     int domid = -1;
     int max_mem, cur_mem;
+    unsigned char uuid[VIR_UUID_BUFLEN];
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (root == NULL) {
         /* ERROR */
@@ -1386,21 +1386,15 @@ xend_parse_sexp_desc(virConnectPtr conn,
     }
     virBufferVSprintf(&buf, "  <name>%s</name>\n", tmp);
     tmp = sexpr_node(root, "domain/uuid");
-    if (tmp != NULL) {
-        char compact[33];
-	int i, j;
-	for (i = 0, j = 0;(i < 32) && (tmp[j] != 0);j++) {
-	    if (((tmp[j] >= '0') && (tmp[j] <= '9')) ||
-	        ((tmp[j] >= 'a') && (tmp[j] <= 'f'))) {
-            compact[i++] = tmp[j];
-        } else if ((tmp[j] >= 'A') && (tmp[j] <= 'F')) {
-	        compact[i++] = tmp[j] + 'a' - 'A';
-        }
-	}
-	compact[i] = 0;
-	if (i > 0)
-	    virBufferVSprintf(&buf, "  <uuid>%s</uuid>\n", compact);
+    if (tmp == NULL) {
+        virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+                     _("domain information incomplete, missing name"));
+        goto error;
     }
+    virUUIDParse(tmp, uuid);
+    virUUIDFormat(uuid, uuidstr);
+    virBufferVSprintf(&buf, "  <uuid>%s</uuid>\n", uuidstr);
+
     tmp = sexpr_node(root, "domain/bootloader");
     if (tmp != NULL) {
         bootloader = 1;
@@ -1884,8 +1878,7 @@ static virDomainPtr
 sexpr_to_domain(virConnectPtr conn, struct sexpr *root)
 {
     virDomainPtr ret = NULL;
-    char *dst_uuid = NULL;
-    char uuid[VIR_UUID_BUFLEN];
+    unsigned char uuid[VIR_UUID_BUFLEN];
     const char *name;
     const char *tmp;
     xenUnifiedPrivatePtr priv;
@@ -1895,14 +1888,13 @@ sexpr_to_domain(virConnectPtr conn, stru
 
     priv = (xenUnifiedPrivatePtr) conn->privateData;
 
-    dst_uuid = (char *) &uuid[0];
-    if (sexpr_uuid(&dst_uuid, root, "domain/uuid") == NULL)
+    if (sexpr_uuid(uuid, root, "domain/uuid") < 0)
         goto error;
     name = sexpr_node(root, "domain/name");
     if (name == NULL)
         goto error;
 
-    ret = virGetDomain(conn, name, (const unsigned char *) &uuid[0]);
+    ret = virGetDomain(conn, name, uuid);
     if (ret == NULL) return NULL;
 
     tmp = sexpr_node(root, "domain/domid");
@@ -2974,15 +2966,7 @@ xenDaemonLookupByUUID(virConnectPtr conn
         char uuidstr[VIR_UUID_STRING_BUFLEN];
         struct sexpr *root = NULL;
 
-        memset(uuidstr, '\0', VIR_UUID_STRING_BUFLEN);
-
-        snprintf(uuidstr, VIR_UUID_STRING_BUFLEN,
-                 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                 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]);
-
+        virUUIDFormat(uuid, uuidstr);
         root = sexpr_get(conn, "/xend/domain/%s?detail=1", uuidstr);
         if (root == NULL)
             return (NULL);
Index: src/xm_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xm_internal.c,v
retrieving revision 1.38
diff -u -p -r1.38 xm_internal.c
--- src/xm_internal.c	18 Jul 2007 21:08:22 -0000	1.38
+++ src/xm_internal.c	8 Aug 2007 20:57:05 -0000
@@ -50,6 +50,7 @@
 #include "internal.h"
 #include "xml.h"
 #include "buf.h"
+#include "uuid.h"
 
 typedef struct xenXMConfCache *xenXMConfCachePtr;
 typedef struct xenXMConfCache {
@@ -200,7 +201,6 @@ static int xenXMConfigGetString(virConfP
 /* Convenience method to grab a string UUID from the config file object */
 static int xenXMConfigGetUUID(virConfPtr conf, const char *name, unsigned char *uuid) {
     virConfValuePtr val;
-    char *rawuuid = (char *)uuid;
     if (!uuid || !name || !conf)
         return (-1);
     if (!(val = virConfGetValue(conf, name))) {
@@ -212,20 +212,12 @@ static int xenXMConfigGetUUID(virConfPtr
     if (!val->str)
         return (-1);
 
-    if (!virParseUUID(&rawuuid, val->str))
+    if (!virUUIDParse(val->str, uuid))
         return (-1);
 
     return (0);
 }
 
-/* Generate a rnadom UUID - used if domain doesn't already
-   have one in its config */
-static void xenXMConfigGenerateUUID(unsigned char *uuid) {
-    int i;
-    for (i = 0 ; i < VIR_UUID_BUFLEN ; i++) {
-        uuid[i] = (unsigned char)(1 + (int) (256.0 * (rand() / (RAND_MAX + 1.0))));
-    }
-}
 
 /* Ensure that a config object has a valid UUID in it,
    if it doesn't then (re-)generate one */
@@ -263,14 +255,8 @@ static int xenXMConfigEnsureIdentity(vir
         }
 
         /* ... then generate one */
-        xenXMConfigGenerateUUID(uuid);
-        snprintf(uuidstr, VIR_UUID_STRING_BUFLEN,
-                 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x</uuid>\n",
-                 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]);
-        uuidstr[VIR_UUID_STRING_BUFLEN-1] = '\0';
+        virUUIDGenerate(uuid);
+        virUUIDFormat(uuid, uuidstr);
 
         value->type = VIR_CONF_STRING;
         value->str = strdup(uuidstr);
@@ -587,6 +573,7 @@ char *xenXMDomainFormatXML(virConnectPtr
     char *xml;
     const char *name;
     unsigned char uuid[VIR_UUID_BUFLEN];
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
     const char *str;
     int hvm = 0;
     long val;
@@ -609,12 +596,8 @@ char *xenXMDomainFormatXML(virConnectPtr
 
     virBufferAdd(buf, "<domain type='xen'>\n", -1);
     virBufferVSprintf(buf, "  <name>%s</name>\n", name);
-    virBufferVSprintf(buf,
-                      "  <uuid>%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x</uuid>\n",
-                      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]);
+    virUUIDFormat(uuid, uuidstr);
+    virBufferVSprintf(buf, "  <uuid>%s</uuid>\n", uuidstr);
 
     if ((xenXMConfigGetString(conf, "builder", &str) == 0) &&
         !strcmp(str, "hvm"))
Index: src/xml.c
===================================================================
RCS file: /data/cvs/libvirt/src/xml.c,v
retrieving revision 1.87
diff -u -p -r1.87 xml.c
--- src/xml.c	2 Aug 2007 10:47:38 -0000	1.87
+++ src/xml.c	8 Aug 2007 20:57:05 -0000
@@ -1308,67 +1308,6 @@ virDomainParseXMLDesc(virConnectPtr conn
     return (NULL);
 }
 
-#endif /* !PROXY */
-
-
-
-unsigned char *virParseUUID(char **ptr, const char *uuid) {
-    int rawuuid[VIR_UUID_BUFLEN];
-    const char *cur;
-    unsigned char *dst_uuid = NULL;
-    int i;
-
-    if (uuid == NULL)
-        goto error;
-
-    /*
-     * do a liberal scan allowing '-' and ' ' anywhere between character
-     * pairs as long as there is 32 of them in the end.
-     */
-    cur = uuid;
-    for (i = 0;i < VIR_UUID_BUFLEN;) {
-        rawuuid[i] = 0;
-        if (*cur == 0)
-            goto error;
-        if ((*cur == '-') || (*cur == ' ')) {
-            cur++;
-            continue;
-        }
-        if ((*cur >= '0') && (*cur <= '9'))
-            rawuuid[i] = *cur - '0';
-        else if ((*cur >= 'a') && (*cur <= 'f'))
-            rawuuid[i] = *cur - 'a' + 10;
-        else if ((*cur >= 'A') && (*cur <= 'F'))
-            rawuuid[i] = *cur - 'A' + 10;
-        else
-            goto error;
-        rawuuid[i] *= 16;
-        cur++;
-        if (*cur == 0)
-            goto error;
-        if ((*cur >= '0') && (*cur <= '9'))
-            rawuuid[i] += *cur - '0';
-        else if ((*cur >= 'a') && (*cur <= 'f'))
-            rawuuid[i] += *cur - 'a' + 10;
-        else if ((*cur >= 'A') && (*cur <= 'F'))
-            rawuuid[i] += *cur - 'A' + 10;
-        else
-            goto error;
-        i++;
-        cur++;
-    }
-
-    dst_uuid = (unsigned char *) *ptr;
-    *ptr += 16;
-
-    for (i = 0; i < VIR_UUID_BUFLEN; i++)
-        dst_uuid[i] = rawuuid[i] & 0xFF;
-
- error:
-    return(dst_uuid);
-}
-
-#ifndef PROXY
 /**
  * virParseXMLDevice:
  * @conn: pointer to the hypervisor connection
Index: src/xml.h
===================================================================
RCS file: /data/cvs/libvirt/src/xml.h,v
retrieving revision 1.15
diff -u -p -r1.15 xml.h
--- src/xml.h	26 Jun 2007 22:33:22 -0000	1.15
+++ src/xml.h	8 Aug 2007 20:57:06 -0000
@@ -32,7 +32,6 @@ int		virXPathNodeSet	(const char *xpath,
 				 xmlNodePtr **list);
 
 char *virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int xendConfigVersion);
-unsigned char *virParseUUID(char **ptr, const char *uuid);
 char *virParseXMLDevice(virConnectPtr conn, char *xmldesc, int hvm, int xendConfigVersion);
 int virDomainXMLDevID(virDomainPtr domain, char *xmldesc, char *class, char *ref);
 


More information about the libvir-list mailing list