*/
#include "qemu/osdep.h"
-#include "qemu-common.h"
#include "qemu/uuid.h"
#include "qemu/bswap.h"
int qemu_uuid_is_null(const QemuUUID *uu)
{
- QemuUUID null_uuid = { 0 };
- return memcmp(uu, &null_uuid, sizeof(QemuUUID)) == 0;
+ static QemuUUID null_uuid;
+ return qemu_uuid_is_equal(uu, &null_uuid);
+}
+
+int qemu_uuid_is_equal(const QemuUUID *lhv, const QemuUUID *rhv)
+{
+ return memcmp(lhv, rhv, sizeof(QemuUUID)) == 0;
}
void qemu_uuid_unparse(const QemuUUID *uuid, char *out)
uu[13], uu[14], uu[15]);
}
-int qemu_uuid_parse(const char *str, uint8_t *uuid)
+static bool qemu_uuid_is_valid(const char *str)
+{
+ int i;
+
+ for (i = 0; i < strlen(str); i++) {
+ const char c = str[i];
+ if (i == 8 || i == 13 || i == 18 || i == 23) {
+ if (str[i] != '-') {
+ return false;
+ }
+ } else {
+ if ((c >= '0' && c <= '9') ||
+ (c >= 'A' && c <= 'F') ||
+ (c >= 'a' && c <= 'f')) {
+ continue;
+ }
+ return false;
+ }
+ }
+ return i == 36;
+}
+
+int qemu_uuid_parse(const char *str, QemuUUID *uuid)
{
+ unsigned char *uu = &uuid->data[0];
int ret;
- if (strlen(str) != 36) {
+ if (!qemu_uuid_is_valid(str)) {
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]);
+ ret = sscanf(str, 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]);
if (ret != 16) {
return -1;
/* Swap from UUID format endian (BE) to the opposite or vice versa.
*/
-void qemu_uuid_bswap(QemuUUID *uuid)
+QemuUUID qemu_uuid_bswap(QemuUUID uuid)
{
- assert(QEMU_PTR_IS_ALIGNED(uuid, sizeof(uint32_t)));
- bswap32s(&uuid->fields.time_low);
- bswap16s(&uuid->fields.time_mid);
- bswap16s(&uuid->fields.time_high_and_version);
+ bswap32s(&uuid.fields.time_low);
+ bswap16s(&uuid.fields.time_mid);
+ bswap16s(&uuid.fields.time_high_and_version);
+ return uuid;
}