[Libvir] Re-factor sexpr_uuid method
Daniel P. Berrange
berrange at redhat.com
Wed Aug 16 14:32:38 UTC 2006
The sexpr_uuid method is used to convert from the printable representation
of a UUID into the binary format (unsigned char[16]). This patch refactors
the main body of the method so that it is usable by other non-XenD driver
backends for parsing UUIDs. This new re-factored method will be used by a
patch I'll shortly submit for the test driver backend.
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: src/xml.c
===================================================================
RCS file: /data/cvs/libvirt/src/xml.c,v
retrieving revision 1.33
diff -c -r1.33 xml.c
*** src/xml.c 15 Aug 2006 17:01:42 -0000 1.33
--- src/xml.c 16 Aug 2006 15:19:00 -0000
***************
*** 1249,1251 ****
--- 1249,1312 ----
}
#endif /* !PROXY */
+
+
+
+ unsigned char *virParseUUID(char **ptr, const char *uuid) {
+ int rawuuid[16];
+ unsigned char *dst_uuid = NULL;
+ int ret;
+ int i;
+
+ memset(rawuuid, 0xFF, sizeof(rawuuid));
+
+ if (uuid == NULL)
+ goto error;
+
+ ret = sscanf(uuid,
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x",
+ rawuuid + 0, rawuuid + 1, rawuuid + 2, rawuuid + 3,
+ rawuuid + 4, rawuuid + 5, rawuuid + 6, rawuuid + 7,
+ rawuuid + 8, rawuuid + 9, rawuuid + 10, rawuuid + 11,
+ rawuuid + 12, rawuuid + 13, rawuuid + 14, rawuuid + 15);
+ if (ret == 16)
+ goto done;
+
+ ret = sscanf(uuid,
+ "%02x%02x%02x%02x-"
+ "%02x%02x-"
+ "%02x%02x-"
+ "%02x%02x-"
+ "%02x%02x%02x%02x%02x%02x",
+ rawuuid + 0, rawuuid + 1, rawuuid + 2, rawuuid + 3,
+ rawuuid + 4, rawuuid + 5, rawuuid + 6, rawuuid + 7,
+ rawuuid + 8, rawuuid + 9, rawuuid + 10, rawuuid + 11,
+ rawuuid + 12, rawuuid + 13, rawuuid + 14, rawuuid + 15);
+ if (ret == 16)
+ goto done;
+
+ ret = sscanf(uuid,
+ "%02x%02x%02x%02x-"
+ "%02x%02x%02x%02x-"
+ "%02x%02x%02x%02x-"
+ "%02x%02x%02x%02x",
+ rawuuid + 0, rawuuid + 1, rawuuid + 2, rawuuid + 3,
+ rawuuid + 4, rawuuid + 5, rawuuid + 6, rawuuid + 7,
+ rawuuid + 8, rawuuid + 9, rawuuid + 10, rawuuid + 11,
+ rawuuid + 12, rawuuid + 13, rawuuid + 14, rawuuid + 15);
+ if (ret != 16)
+ goto error;
+
+ done:
+ dst_uuid = (unsigned char *) *ptr;
+ *ptr += 16;
+
+ for (i = 0; i < 16; i++)
+ dst_uuid[i] = rawuuid[i] & 0xFF;
+
+ error:
+ return dst_uuid;
+ }
Index: src/xml.h
===================================================================
RCS file: /data/cvs/libvirt/src/xml.h,v
retrieving revision 1.7
diff -c -r1.7 xml.h
*** src/xml.h 26 Jun 2006 15:02:19 -0000 1.7
--- src/xml.h 16 Aug 2006 15:19:00 -0000
***************
*** 30,35 ****
--- 30,36 ----
int virBufferVSprintf(virBufferPtr buf, const char *format, ...);
int virBufferStrcat(virBufferPtr buf, ...);
char *virDomainParseXMLDesc(const char *xmldesc, char **name);
+ unsigned char *virParseUUID(char **ptr, const char *uuid);
#ifdef __cplusplus
}
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.54
diff -c -r1.54 xend_internal.c
*** src/xend_internal.c 15 Aug 2006 17:01:42 -0000 1.54
--- src/xend_internal.c 16 Aug 2006 15:19:01 -0000
***************
*** 780,841 ****
sexpr_uuid(char **ptr, struct sexpr *node, const char *path)
{
const char *r = sexpr_node(node, path);
! int uuid[16];
! unsigned char *dst_uuid = NULL;
! int ret;
! int i;
!
! memset(uuid, 0xFF, sizeof(uuid));
!
! if (r == NULL)
! goto error;
!
! ret = sscanf(r,
! "%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);
! if (ret == 16)
! goto done;
!
! ret = sscanf(r,
! "%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);
! if (ret == 16)
! goto done;
!
! ret = sscanf(r,
! "%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);
! if (ret != 16)
! goto error;
!
! done:
! dst_uuid = (unsigned char *) *ptr;
! *ptr += 16;
!
! for (i = 0; i < 16; i++)
! dst_uuid[i] = uuid[i] & 0xFF;
!
! error:
! return dst_uuid;
}
--- 780,786 ----
sexpr_uuid(char **ptr, struct sexpr *node, const char *path)
{
const char *r = sexpr_node(node, path);
! return virParseUUID(ptr, r);
}
Index: src/internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/internal.h,v
retrieving revision 1.23
diff -c -r1.23 internal.h
*** src/internal.h 28 Jun 2006 18:19:13 -0000 1.23
--- src/internal.h 16 Aug 2006 15:19:01 -0000
***************
*** 189,194 ****
--- 189,195 ----
virDomainPtr virGetDomainByID(virConnectPtr conn,
int id);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
More information about the libvir-list
mailing list