diff options
| -rw-r--r-- | hcid/dbus-common.c | 46 | ||||
| -rw-r--r-- | hcid/dbus-rfcomm.c | 41 | ||||
| -rw-r--r-- | hcid/dbus-sdp.c | 25 | ||||
| -rw-r--r-- | hcid/dbus.h | 1 | 
4 files changed, 63 insertions, 50 deletions
| diff --git a/hcid/dbus-common.c b/hcid/dbus-common.c index e4278330..1687f7e1 100644 --- a/hcid/dbus-common.c +++ b/hcid/dbus-common.c @@ -31,6 +31,9 @@  #include <stdlib.h>  #include <string.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h> +  #include <dbus/dbus.h>  #include "hcid.h" @@ -327,3 +330,46 @@ service_handler_func_t find_service_handler(struct service_data *handlers, DBusM  	return NULL;  } + +int str2uuid(uuid_t *uuid, const char *string) +{ +	uint16_t svclass, data1, data2, data3, data5; +	uint32_t data0, data4; + +	svclass = sdp_str2svclass(string); +	if (svclass) { +		sdp_uuid16_create(uuid, sdp_str2svclass(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); +		return 0; +	} + +	return -1; +} + + diff --git a/hcid/dbus-rfcomm.c b/hcid/dbus-rfcomm.c index 225175f0..e413851c 100644 --- a/hcid/dbus-rfcomm.c +++ b/hcid/dbus-rfcomm.c @@ -650,47 +650,6 @@ failed:  	rfcomm_continue_data_free(cdata);  } -static int str2uuid(uuid_t *uuid, const char *string) -{ -	uint16_t svclass, data1, data2, data3, data5; -	uint32_t data0, data4; - -	svclass = sdp_str2svclass(string); -	if (svclass) { -		sdp_uuid16_create(uuid, sdp_str2svclass(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); -		return 0; -	} - -	return -1; -} -  static DBusHandlerResult rfcomm_connect_req(DBusConnection *conn,  						DBusMessage *msg, void *data)  { diff --git a/hcid/dbus-sdp.c b/hcid/dbus-sdp.c index 6a101bd7..f17c8c31 100644 --- a/hcid/dbus-sdp.c +++ b/hcid/dbus-sdp.c @@ -934,7 +934,6 @@ static int remote_svc_handles_conn_cb(struct transaction_context *ctxt)  	const char *dst, *svc;  	uuid_t uuid;  	int err = 0; -	uint32_t class;  	if (sdp_set_notify(ctxt->session, remote_svc_handles_completed_cb, ctxt) < 0) {  		err = -EINVAL; @@ -946,9 +945,13 @@ static int remote_svc_handles_conn_cb(struct transaction_context *ctxt)  			DBUS_TYPE_STRING, &svc,  			DBUS_TYPE_INVALID); -	if (strlen(svc) > 0 ){ -		class = sdp_str2svclass(svc); -		sdp_uuid16_create(&uuid, class); +	if (strlen(svc) > 0) { +		/* Check if it is a service name string */ +		if (str2uuid(&uuid, svc) < 0) { +			/* check if the service string is a hex */ +			uint32_t uuid_hex = strtol(svc, NULL, 16); +			sdp_uuid16_create(&uuid, uuid_hex); +		}  	} else  		sdp_uuid16_create(&uuid, PUBLIC_BROWSE_GROUP); @@ -973,7 +976,7 @@ DBusHandlerResult get_remote_svc_handles(DBusConnection *conn, DBusMessage *msg,  	struct hci_dbus_data *dbus_data = data;  	const char *dst, *svc;  	int err = 0; -	uint32_t class; +	uuid_t uuid;  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &dst, @@ -982,10 +985,14 @@ DBusHandlerResult get_remote_svc_handles(DBusConnection *conn, DBusMessage *msg,  		return error_invalid_arguments(conn, msg);  	if (strlen(svc) > 0) { -		class = sdp_str2svclass(svc); -		if (!class) { -			error("Invalid service class name"); -			return error_invalid_arguments(conn, msg); +		/* Check if it is a service name string */ +		if (str2uuid(&uuid, svc) < 0) { +			/* check if the service string is a hex */ +			uint32_t uuid_hex = strtol(svc, NULL, 16); +			if (!uuid_hex) { +				error("Invalid service class name"); +				return error_invalid_arguments(conn, msg); +			}  		}  	} diff --git a/hcid/dbus.h b/hcid/dbus.h index 660a0b56..b32fec9f 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -215,6 +215,7 @@ DBusHandlerResult get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg, voi  DBusHandlerResult simple_introspect(DBusConnection *conn, DBusMessage *msg, void *data);  service_handler_func_t find_service_handler(struct service_data *services, DBusMessage *msg); +int str2uuid(uuid_t *uuid, const char *string);  void create_bond_req_exit(const char *name, struct hci_dbus_data *pdata);  void discover_devices_req_exit(const char *name, struct hci_dbus_data *pdata); | 
