diff options
| -rw-r--r-- | hcid/dbus-adapter.c | 47 | ||||
| -rw-r--r-- | hcid/dbus.c | 18 | ||||
| -rw-r--r-- | hcid/dbus.h | 2 | 
3 files changed, 23 insertions, 44 deletions
| diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index 106c6152..3de4b9b1 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -1153,14 +1153,18 @@ static DBusHandlerResult handle_dev_get_remote_minor_class_req(DBusConnection *c  	return send_reply_and_unref(conn, reply);  } +static void append_class_string(const char *class, DBusMessageIter *iter) +{ +	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &class); +} +  static DBusHandlerResult handle_dev_get_remote_service_cls_req(DBusConnection *conn,  								DBusMessage *msg,  								void *data)  {  	DBusMessage *reply;  	DBusMessageIter iter, array_iter; -	const char **service_classes; -	int i; +	struct slist *service_classes;  	uint32_t class;  	if (get_remote_class(conn, msg, data, &class) < 0) @@ -1171,21 +1175,16 @@ static DBusHandlerResult handle_dev_get_remote_service_cls_req(DBusConnection *c  		return DBUS_HANDLER_RESULT_NEED_MEMORY;  	service_classes = service_classes_str(class); -	if (!service_classes) { -		error("Unable to create service classes list"); -		return error_failed(conn,msg, ENOMEM); -	}  	dbus_message_iter_init_append(reply, &iter);  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,  	 					DBUS_TYPE_STRING_AS_STRING, &array_iter); -	for (i = 0; service_classes[i] != NULL; i++) -		dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &service_classes[i]); +	slist_foreach(service_classes, (slist_func_t)append_class_string, &array_iter);  	dbus_message_iter_close_container(&iter, &array_iter); -	free(service_classes); +	slist_free(service_classes);  	return send_reply_and_unref(conn, reply);  } @@ -2194,40 +2193,20 @@ const char *minor_class_str(uint32_t class)  	return "";  } -/* Return NULL terminated array of strings */ -const char **service_classes_str(uint32_t class) +struct slist *service_classes_str(uint32_t class)  {  	uint8_t services = class >> 16; -	const char **classes; -	int i, class_count = 0; - -	classes = malloc(sizeof(const char *)); -	if (!classes) -		return NULL; - -	classes[0] = NULL; +	struct slist *l = NULL; +	int i;  	for (i = 0; i < (sizeof(service_cls) / sizeof(*service_cls)); i++) { -		const char **tmp; -  		if (!(services & (1 << i)))  			continue; -		class_count++; - -		tmp = realloc(classes, sizeof(const char *) * (class_count + 1)); -		if (!tmp) { -			free(classes); -			return NULL; -		} - -		classes = tmp; - -		classes[class_count - 1] = service_cls[i]; -		classes[class_count] = NULL; +		l = slist_append(l, (void *)service_cls[i]);  	} -	return classes; +	return l;  } diff --git a/hcid/dbus.c b/hcid/dbus.c index a74b0309..3fed5397 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -902,6 +902,11 @@ failed:  	bt_free(local_addr);  } +static void append_class_string(const char *class, DBusMessageIter *iter) +{ +	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &class); +} +  void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi)  {  	char filename[PATH_MAX + 1]; @@ -915,10 +920,10 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i  	struct discovered_dev_info *dev;  	char *local_addr, *peer_addr, *name = NULL;  	const char *major_ptr, *minor_ptr; -	const char **service_classes; +	struct slist *service_classes;  	const dbus_int16_t tmp_rssi = rssi;  	bdaddr_t tmp; -	int id, i; +	int id;  	name_status_t name_status = NAME_PENDING;  	baswap(&tmp, local); local_addr = batostr(&tmp); @@ -957,21 +962,16 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i  	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor_ptr);  	service_classes = service_classes_str(class); -	if (!service_classes) { -		error("Unable to create service class strings"); -		goto failed; -	}  	/* add the service classes */  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,  	 					DBUS_TYPE_STRING_AS_STRING, &array_iter); -	for (i = 0; service_classes[i] != NULL; i++) -		dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &service_classes[i]); +	slist_foreach(l, (slist_func_t)append_class_string, &array_iter);  	dbus_message_iter_close_container(&iter, &array_iter); -	free(service_classes); +	slist_free(service_classes);  	if (dbus_connection_send(connection, signal_device, NULL) == FALSE) {  		error("Can't send D-Bus remote device found signal"); diff --git a/hcid/dbus.h b/hcid/dbus.h index 663394b6..5ae2b7b8 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -131,7 +131,7 @@ DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void  const char *major_class_str(uint32_t class);  const char *minor_class_str(uint32_t class); -const char **service_classes_str(uint32_t class); +struct slist *service_classes_str(uint32_t class);  DBusHandlerResult bluez_new_failure_msg(DBusConnection *conn, DBusMessage *msg, const uint32_t ecode); | 
