summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2007-08-27 13:16:54 +0000
committerMarcel Holtmann <marcel@holtmann.org>2007-08-27 13:16:54 +0000
commit463995dde9f8a56e46ad3ae85f81962997b11ff3 (patch)
tree5f8a275b90c09a7e7f1cbca95191e1308bbf1229
parent296dcf42cf8a4f4d6f0192cac58a28887be38552 (diff)
Convert UUID-128 strings into UUID-16 values if possible
-rw-r--r--hcid/dbus-common.c60
1 files changed, 35 insertions, 25 deletions
diff --git a/hcid/dbus-common.c b/hcid/dbus-common.c
index 4cbc42aa..812cdc98 100644
--- a/hcid/dbus-common.c
+++ b/hcid/dbus-common.c
@@ -91,6 +91,7 @@ int str2uuid(uuid_t *uuid, const char *string)
{
uint16_t svclass, data1, data2, data3, data5;
uint32_t data0, data4;
+ uint8_t val[16];
svclass = sdp_str2svclass(string);
if (svclass) {
@@ -98,34 +99,43 @@ int str2uuid(uuid_t *uuid, const char *string)
return 0;
}
- if (strlen(string) == 36 &&
- string[8] == '-' &&
- string[13] == '-' &&
- string[18] == '-' &&
- string[23] == '-' &&
- sscanf(string, "%08x-%04hx-%04hx-%04hx-%08x%04hx",
- &data0, &data1, &data2, &data3, &data4, &data5) == 6) {
- uint8_t val[16];
-
- data0 = htonl(data0);
- data1 = htons(data1);
- data2 = htons(data2);
- data3 = htons(data3);
- data4 = htonl(data4);
- data5 = htons(data5);
-
- memcpy(&val[0], &data0, 4);
- memcpy(&val[4], &data1, 2);
- memcpy(&val[6], &data2, 2);
- memcpy(&val[8], &data3, 2);
- memcpy(&val[10], &data4, 4);
- memcpy(&val[14], &data5, 2);
-
- sdp_uuid128_create(uuid, val);
+ if (strlen(string) != 36)
+ return -1;
+
+ if (string[8] != '-' || string[13] != '-' ||
+ string[18] != '-' || string[23] != '-')
+ return -1;
+
+ if (sscanf(string, "%08x-%04hx-%04hx-%04hx-%08x%04hx",
+ &data0, &data1, &data2, &data3, &data4, &data5) != 6)
+ return -1;
+
+ /* Base UUID is 00001203-0000-1000-8000-00805F9B34FB */
+ if (data1 == 0x0000 && data2 == 0x1000 && data3 == 0x8000 &&
+ data4 == 0x00805F9B && data5 == 0x34FB) {
+ if ((data0 & 0xffff0000) > 0)
+ sdp_uuid32_create(uuid, data0);
+ else
+ sdp_uuid16_create(uuid, data0);
return 0;
}
- return -1;
+ data0 = htonl(data0);
+ data1 = htons(data1);
+ data2 = htons(data2);
+ data3 = htons(data3);
+ data4 = htonl(data4);
+ data5 = htons(data5);
+
+ memcpy(&val[0], &data0, 4);
+ memcpy(&val[4], &data1, 2);
+ memcpy(&val[6], &data2, 2);
+ memcpy(&val[8], &data3, 2);
+ memcpy(&val[10], &data4, 4);
+ memcpy(&val[14], &data5, 2);
+
+ sdp_uuid128_create(uuid, val);
+ return 0;
}
int l2raw_connect(const char *local, const bdaddr_t *remote)