From 43d33de948192c680cb4dccad6e88e568f9b1ea6 Mon Sep 17 00:00:00 2001
From: Maksim Yevmenkin <emax@FreeBSD.org>
Date: Fri, 27 May 2005 19:11:33 +0000
Subject: [PATCH] Do not tread 128-bit UUID as int128. Provide separate macros
 to get/put 128-bit UUID libsdp(3). Fix 128-bit UUID printing in
 sdpcontrol(8).

MFC after:	3 days
---
 lib/libsdp/sdp.3                       | 14 +++++-
 lib/libsdp/sdp.h                       | 55 +++++++++++++++++++++-
 lib/libsdp/util.c                      | 21 ++++++---
 usr.sbin/bluetooth/sdpcontrol/search.c | 63 +++++++++++++++-----------
 4 files changed, 117 insertions(+), 36 deletions(-)

diff --git a/lib/libsdp/sdp.3 b/lib/libsdp/sdp.3
index c48b595c403e..e80d0ac9ccba 100644
--- a/lib/libsdp/sdp.3
+++ b/lib/libsdp/sdp.3
@@ -34,11 +34,13 @@
 .Nm SDP_GET32 ,
 .Nm SDP_GET64 ,
 .Nm SDP_GET128 ,
+.Nm SDP_GET_UUID128 ,
 .Nm SDP_PUT8 ,
 .Nm SDP_PUT16 ,
 .Nm SDP_PUT32 ,
 .Nm SDP_PUT64 ,
 .Nm SDP_PUT128 ,
+.Nm SDP_PUT_UUID128 ,
 .Nm sdp_open ,
 .Nm sdp_open_local ,
 .Nm sdp_close ,
@@ -57,11 +59,13 @@
 .Fn SDP_GET32 "l" "cp"
 .Fn SDP_GET64 "l" "cp"
 .Fn SDP_GET128 "l" "cp"
+.Fn SDP_GET_UUID128 "l" "cp"
 .Fn SDP_PUT8 "b" "cp"
 .Fn SDP_PUT16 "s" "cp"
 .Fn SDP_PUT32 "l" "cp"
 .Fn SDP_PUT64 "l" "cp"
 .Fn SDP_PUT128 "l" "cp"
+.Fn SDP_PUT_UUID128 "l" "cp"
 .Ft "void *"
 .Fn sdp_open "bdaddr_t const *l" "bdaddr_t const *r"
 .Ft "void *"
@@ -117,6 +121,14 @@ into the buffer pointed by
 pointer.
 The pointer is automatically advanced.
 .Pp
+.Fn SDP_GET_UUID128
+and
+.Fn SDP_PUT_UUID128
+macros are used to get and put 128-bit UUID into the buffer pointed by
+.Fa cp
+pointer.
+The pointer is automatically advanced.
+.Pp
 The
 .Fn sdp_open
 and
@@ -359,7 +371,7 @@ sdp_attr_t     proto = { SDP_ATTR_INVALID,0,sizeof(buffer),buffer };
 if ((ss = sdp_open(NG_HCI_BDADDR_ANY, remote)) == NULL)
         /* exit ENOMEM */
 if (sdp_error(ss) != 0)
-        /* exit spd_error(ss) */
+        /* exit sdp_error(ss) */
 
 if (sdp_search(ss, 1, &serv, 1, &attr, 1, &proto) != 0)
         /* exit sdp_error(ss) */
diff --git a/lib/libsdp/sdp.h b/lib/libsdp/sdp.h
index 42743f988797..2b06b2c18e9c 100644
--- a/lib/libsdp/sdp.h
+++ b/lib/libsdp/sdp.h
@@ -360,9 +360,31 @@ typedef struct sdp_attr *	sdp_attr_p;
 	(l)->b[3]  = *t_cp++; \
 	(l)->b[2]  = *t_cp++; \
 	(l)->b[1]  = *t_cp++; \
+	(l)->b[0]  = *t_cp++; \
 	(cp) += 16; \
 }
-#else /* BYTE_ORDER != LITTLE_ENDIAN */
+
+#define SDP_GET_UUID128(l, cp) { \
+	register uint8_t *t_cp = (uint8_t *)(cp); \
+	(l)->b[0]  = *t_cp++; \
+	(l)->b[1]  = *t_cp++; \
+	(l)->b[2]  = *t_cp++; \
+	(l)->b[3]  = *t_cp++; \
+	(l)->b[4]  = *t_cp++; \
+	(l)->b[5]  = *t_cp++; \
+	(l)->b[6]  = *t_cp++; \
+	(l)->b[7]  = *t_cp++; \
+	(l)->b[8]  = *t_cp++; \
+	(l)->b[9]  = *t_cp++; \
+	(l)->b[10] = *t_cp++; \
+	(l)->b[11] = *t_cp++; \
+	(l)->b[12] = *t_cp++; \
+	(l)->b[13] = *t_cp++; \
+	(l)->b[14] = *t_cp++; \
+	(l)->b[15] = *t_cp++; \
+	(cp) += 16; \
+}
+#elif BYTE_ORDER == BIG_ENDIAN
 #define SDP_GET128(l, cp) { \
 	register uint8_t *t_cp = (uint8_t *)(cp); \
 	(l)->b[0]  = *t_cp++; \
@@ -383,6 +405,10 @@ typedef struct sdp_attr *	sdp_attr_p;
 	(l)->b[15] = *t_cp++; \
 	(cp) += 16; \
 }
+
+#define	SDP_GET_UUID128(l, cp)	SDP_GET128(l, cp)
+#else
+#error	"Unsupported BYTE_ORDER"
 #endif /* BYTE_ORDER */
 
 #define SDP_PUT8(b, cp) { \
@@ -445,7 +471,28 @@ typedef struct sdp_attr *	sdp_attr_p;
 	*t_cp   = (l)->b[0];  \
 	(cp) += 16; \
 }
-#else /* BYTE_ORDER != LITTLE_ENDIAN */
+
+#define SDP_PUT_UUID128(l, cp) { \
+	register uint8_t *t_cp = (uint8_t *)(cp); \
+	*t_cp++ = (l)->b[0];  \
+	*t_cp++ = (l)->b[1];  \
+	*t_cp++ = (l)->b[2];  \
+	*t_cp++ = (l)->b[3];  \
+	*t_cp++ = (l)->b[4];  \
+	*t_cp++ = (l)->b[5];  \
+	*t_cp++ = (l)->b[6];  \
+	*t_cp++ = (l)->b[7];  \
+	*t_cp++ = (l)->b[8];  \
+	*t_cp++ = (l)->b[9];  \
+	*t_cp++ = (l)->b[10]; \
+	*t_cp++ = (l)->b[11]; \
+	*t_cp++ = (l)->b[12]; \
+	*t_cp++ = (l)->b[13]; \
+	*t_cp++ = (l)->b[14]; \
+	*t_cp   = (l)->b[15]; \
+	(cp) += 16; \
+}
+#elif BYTE_ORDER == BIG_ENDIAN
 #define SDP_PUT128(l, cp) { \
 	register uint8_t *t_cp = (uint8_t *)(cp); \
 	*t_cp++ = (l)->b[0];  \
@@ -466,6 +513,10 @@ typedef struct sdp_attr *	sdp_attr_p;
 	*t_cp   = (l)->b[15]; \
 	(cp) += 16; \
 }
+
+#define SDP_PUT_UUID128(l, cp)	SDP_PUT128(l, cp)
+#else
+#error	"Unsupported BYTE_ORDER"
 #endif /* BYTE_ORDER */
 
 void *             sdp_open       (bdaddr_t const *l, bdaddr_t const *r);
diff --git a/lib/libsdp/util.c b/lib/libsdp/util.c
index ae41fb24074d..7c7330db2860 100644
--- a/lib/libsdp/util.c
+++ b/lib/libsdp/util.c
@@ -29,6 +29,7 @@
  * $FreeBSD$
  */
 
+#include <netinet/in.h>
 #include <bluetooth.h>
 #include <stdio.h>
 #include <sdp.h>
@@ -317,17 +318,25 @@ sdp_print(uint32_t level, uint8_t const *start, uint8_t const *end)
 
 		case SDP_DATA_UINT128:
 		case SDP_DATA_INT128:
-		case SDP_DATA_UUID128:
 			SDP_GET128(&value.int128, start);
-			printf("int128/uuid128 %#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
+			printf("u/int128 %#8.8x%8.8x%8.8x%8.8x\n",
 				*(uint32_t *)&value.int128.b[0],
-				*(uint16_t *)&value.int128.b[4],
-				*(uint16_t *)&value.int128.b[6],
-				*(uint16_t *)&value.int128.b[8],
-				*(uint16_t *)&value.int128.b[10],
+				*(uint32_t *)&value.int128.b[4],
+				*(uint32_t *)&value.int128.b[8],
 				*(uint32_t *)&value.int128.b[12]);
 			break;
 
+		case SDP_DATA_UUID128:
+			SDP_GET_UUID128(&value.int128, start);
+			printf("uuid128 %#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
+				ntohl(*(uint32_t *)&value.int128.b[0]),
+				ntohs(*(uint16_t *)&value.int128.b[4]),
+				ntohs(*(uint16_t *)&value.int128.b[6]),
+				ntohs(*(uint16_t *)&value.int128.b[8]),
+				ntohs(*(uint16_t *)&value.int128.b[10]),
+				ntohl(*(uint32_t *)&value.int128.b[12]));
+			break;
+
 		case SDP_DATA_INT8:
 			SDP_GET8(value.int8, start);
 			printf("int8 %d\n", value.int8);
diff --git a/usr.sbin/bluetooth/sdpcontrol/search.c b/usr.sbin/bluetooth/sdpcontrol/search.c
index dad65635f3a7..5b197659e0ab 100644
--- a/usr.sbin/bluetooth/sdpcontrol/search.c
+++ b/usr.sbin/bluetooth/sdpcontrol/search.c
@@ -29,6 +29,7 @@
  * $FreeBSD$
  */
 
+#include <netinet/in.h>
 #include <bluetooth.h>
 #include <ctype.h>
 #include <sdp.h>
@@ -118,14 +119,14 @@ print_service_class_id_list(uint8_t const *start, uint8_t const *end)
 		case SDP_DATA_UUID128: {
 			int128_t	uuid;
 
-			SDP_GET128(&uuid, start);
+			SDP_GET_UUID128(&uuid, start);
 			fprintf(stdout, "\t%#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
-					*(uint32_t *)&uuid.b[0],
-					*(uint16_t *)&uuid.b[4],
-					*(uint16_t *)&uuid.b[6],
-					*(uint16_t *)&uuid.b[8],
-					*(uint16_t *)&uuid.b[10],
-					*(uint32_t *)&uuid.b[12]);
+					ntohl(*(uint32_t *)&uuid.b[0]),
+					ntohs(*(uint16_t *)&uuid.b[4]),
+					ntohs(*(uint16_t *)&uuid.b[6]),
+					ntohs(*(uint16_t *)&uuid.b[8]),
+					ntohs(*(uint16_t *)&uuid.b[10]),
+					ntohl(*(uint32_t *)&uuid.b[12]));
 			} break;
 
 		default:
@@ -179,14 +180,14 @@ print_protocol_descriptor(uint8_t const *start, uint8_t const *end)
 		break;
 
 	case SDP_DATA_UUID128:
-		SDP_GET128(&value.int128, start);
+		SDP_GET_UUID128(&value.int128, start);
 		fprintf(stdout, "\t%#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
-				*(uint32_t *)&value.int128.b[0],
-				*(uint16_t *)&value.int128.b[4],
-				*(uint16_t *)&value.int128.b[6],
-				*(uint16_t *)&value.int128.b[8],
-				*(uint16_t *)&value.int128.b[10],
-				*(uint32_t *)&value.int128.b[12]);
+				ntohl(*(uint32_t *)&value.int128.b[0]),
+				ntohs(*(uint16_t *)&value.int128.b[4]),
+				ntohs(*(uint16_t *)&value.int128.b[6]),
+				ntohs(*(uint16_t *)&value.int128.b[8]),
+				ntohs(*(uint16_t *)&value.int128.b[10]),
+				ntohl(*(uint32_t *)&value.int128.b[12]));
 		break;
 
 	default:
@@ -235,17 +236,25 @@ print_protocol_descriptor(uint8_t const *start, uint8_t const *end)
 
 		case SDP_DATA_UINT128:
 		case SDP_DATA_INT128:
-		case SDP_DATA_UUID128:
 			SDP_GET128(&value.int128, start);
-			fprintf(stdout, "u/int/uuid128 %#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
+			fprintf(stdout, "u/int128 %#8.8x%8.8x%8.8x%8.8x\n",
 				*(uint32_t *)&value.int128.b[0],
-				*(uint16_t *)&value.int128.b[4],
-				*(uint16_t *)&value.int128.b[6],
-				*(uint16_t *)&value.int128.b[8],
-				*(uint16_t *)&value.int128.b[10],
+				*(uint32_t *)&value.int128.b[4],
+				*(uint32_t *)&value.int128.b[8],
 				*(uint32_t *)&value.int128.b[12]);
 			break;
 
+		case SDP_DATA_UUID128:
+			SDP_GET_UUID128(&value.int128, start);
+			fprintf(stdout, "uuid128 %#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
+				ntohl(*(uint32_t *)&value.int128.b[0]),
+				ntohs(*(uint16_t *)&value.int128.b[4]),
+				ntohs(*(uint16_t *)&value.int128.b[6]),
+				ntohs(*(uint16_t *)&value.int128.b[8]),
+				ntohs(*(uint16_t *)&value.int128.b[10]),
+				ntohl(*(uint32_t *)&value.int128.b[12]));
+			break;
+
 		case SDP_DATA_STR8:
 		case SDP_DATA_URL8:
 			SDP_GET8(len, start);
@@ -446,14 +455,14 @@ print_bluetooth_profile_descriptor_list(uint8_t const *start, uint8_t const *end
 		case SDP_DATA_UUID128: {
 			int128_t	uuid;
 
-			SDP_GET128(&uuid, start);
+			SDP_GET_UUID128(&uuid, start);
 			fprintf(stdout, "\t%#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x ",
-					*(uint32_t *)&uuid.b[0],
-					*(uint16_t *)&uuid.b[4],
-					*(uint16_t *)&uuid.b[6],
-					*(uint16_t *)&uuid.b[8],
-					*(uint16_t *)&uuid.b[10],
-					*(uint32_t *)&uuid.b[12]);
+					ntohl(*(uint32_t *)&uuid.b[0]),
+					ntohs(*(uint16_t *)&uuid.b[4]),
+					ntohs(*(uint16_t *)&uuid.b[6]),
+					ntohs(*(uint16_t *)&uuid.b[8]),
+					ntohs(*(uint16_t *)&uuid.b[10]),
+					ntohl(*(uint32_t *)&uuid.b[12]));
 			} break;
 
 		default: