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, " %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\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, " %s\n", uuidstr) < 0) goto no_memory; if (virBufferVSprintf(buf, " %d\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, " %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\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, " %s\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, " %s\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, " %s\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, " %s\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\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, "\n", -1); virBufferVSprintf(buf, " %s\n", name); - virBufferVSprintf(buf, - " %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\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, " %s\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);