diff options
Diffstat (limited to 'hcid/dbus-hci.c')
| -rw-r--r-- | hcid/dbus-hci.c | 482 | 
1 files changed, 160 insertions, 322 deletions
| diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c index 50e6b37d..b28b5c7d 100644 --- a/hcid/dbus-hci.c +++ b/hcid/dbus-hci.c @@ -62,7 +62,7 @@  static DBusConnection *connection = NULL;  static GSList *adapters = NULL; -gint find_adapter(gconstpointer a, gconstpointer b) +static gint adapter_path_cmp(gconstpointer a, gconstpointer b)  {  	const struct adapter *adapter = a;  	const char *path = b; @@ -70,6 +70,28 @@ gint find_adapter(gconstpointer a, gconstpointer b)  	return strcmp(adapter->path, path);  } +static gint adapter_address_cmp(gconstpointer a, gconstpointer b) +{ +	const struct adapter *adapter = a; +	const char *address = b; + +	return strcmp(adapter->address, address); +} + +static struct adapter *find_adapter(bdaddr_t *sba) +{ +	GSList *match; +	char address[18]; + +	ba2str(sba, address); + +	match = g_slist_find_custom(adapters, address, adapter_address_cmp); +	if (!match) +		return NULL; + +	return match->data; +} +  void bonding_request_free(struct bonding_request_info *bonding)  {  	struct device *device; @@ -286,8 +308,7 @@ static dbus_bool_t send_adapter_signal(DBusConnection *conn, int devid,  	return ret;  } -static void adapter_mode_changed(struct adapter *adapter, -			const char *path, uint8_t scan_enable) +static void adapter_mode_changed(struct adapter *adapter, uint8_t scan_enable)  {  	const char *mode; @@ -326,13 +347,13 @@ static void adapter_mode_changed(struct adapter *adapter,  		return;  	} -	dbus_connection_emit_signal(connection, path, ADAPTER_INTERFACE, +	dbus_connection_emit_signal(connection, adapter->path, ADAPTER_INTERFACE,  					"ModeChanged",  					DBUS_TYPE_STRING, &mode,  					DBUS_TYPE_INVALID);  	if (hcid_dbus_use_experimental()) { -		const char *ptr = path + ADAPTER_PATH_INDEX; +		const char *ptr = adapter->path + ADAPTER_PATH_INDEX;  		dbus_connection_emit_property_changed(connection, ptr,  						ADAPTER_INTERFACE, "Mode",  						DBUS_TYPE_STRING, &mode); @@ -418,7 +439,7 @@ int unregister_adapter_path(const char *path)  	__remove_servers(path); -	l = g_slist_find_custom(adapters, path, find_adapter); +	l = g_slist_find_custom(adapters, path, adapter_path_cmp);  	if (!l)  		goto unreg; @@ -701,7 +722,7 @@ int hcid_dbus_start_device(uint16_t id)  	if (hci_test_bit(HCI_RAW, &di.flags))  		return -1; -	l = g_slist_find_custom(adapters, path, find_adapter); +	l = g_slist_find_custom(adapters, path, adapter_path_cmp);  	if (!l) {  		error("Getting %s path data failed!", path);  		return -1; @@ -823,7 +844,7 @@ int hcid_dbus_stop_device(uint16_t id)  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); +	l = g_slist_find_custom(adapters, path, adapter_path_cmp);  	if (!l) {  		error("Getting %s path data failed!", path);  		return -1; @@ -915,30 +936,15 @@ int pin_req_cmp(const void *p1, const void *p2)  void hcid_dbus_pending_pin_req_add(bdaddr_t *sba, bdaddr_t *dba)  { -	char path[MAX_PATH_LENGTH], addr[18];  	struct adapter *adapter;  	struct pending_pin_info *info; -	int id; -	GSList *l; - -	ba2str(sba, addr); - -	id = hci_devid(addr); -	if (id < 0) { -		error("No matching device id for %s", addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(sba); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; -  	info = g_new0(struct pending_pin_info, 1);  	bacpy(&info->bdaddr, dba); @@ -990,34 +996,20 @@ done:  int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  { -	char path[MAX_PATH_LENGTH], addr[18]; +	char addr[18];  	struct adapter *adapter;  	struct device *device;  	struct agent *agent; -	int id; -	GSList *l; - -	ba2str(sba, addr); -	id = hci_devid(addr); -	if (id < 0) { -		error("No matching device id for %s", addr); +	adapter = find_adapter(sba); +	if (!adapter) { +		error("No matching adapter found");  		return -1;  	}  	if (!hcid_dbus_use_experimental())  		goto old_fallback; -	snprintf(path, sizeof(path), "/hci%d", id); - -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); -		goto old_fallback; -	} - -	adapter = l->data; -  	ba2str(&ci->bdaddr, addr);  	device = adapter_find_device(adapter, addr); @@ -1036,26 +1028,21 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  					device);  old_fallback: -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	return handle_passkey_request_old(connection, dev, path, sba, &ci->bdaddr); +	return handle_passkey_request_old(connection, dev, adapter->path, sba, +						&ci->bdaddr);  }  int hcid_dbus_confirm_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci, char *pin)  { -	char path[MAX_PATH_LENGTH], addr[18]; -	int id; - -	ba2str(sba, addr); +	struct adapter *adapter; -	id = hci_devid(addr); -	if (id < 0) { -		error("No matching device id for %s", addr); +	adapter = find_adapter(sba); +	if (!adapter) { +		error("No matching adapter found");  		return -1;  	} -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	return handle_confirm_request_old(connection, dev, path, sba, +	return handle_confirm_request_old(connection, dev, adapter->path, sba,  						&ci->bdaddr, pin);  } @@ -1066,7 +1053,6 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  	char path[MAX_PATH_LENGTH], local_addr[18], peer_addr[18];  	const char *paddr = peer_addr;  	GSList *l; -	int id;  	DBusMessage *reply;  	struct device *device;  	struct bonding_request_info *bonding; @@ -1076,23 +1062,12 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  	ba2str(local, local_addr);  	ba2str(peer, peer_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	/* create the authentication reply */ -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("Unable to find matching adapter");  		return;  	} -	adapter = l->data; -  	if (status)  		cancel_passkey_agent_requests(adapter->passkey_agents, path,  						peer); @@ -1171,54 +1146,40 @@ cleanup:  void hcid_dbus_inquiry_start(bdaddr_t *local)  {  	struct adapter *adapter; -	char path[MAX_PATH_LENGTH], local_addr[18]; -	const char *ptr = path + ADAPTER_PATH_INDEX; -	int id; -	GSList *l; - -	ba2str(local, local_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); +	adapter = find_adapter(local); +	if (!adapter) { +		error("Unable to find matching adapter");  		return;  	} -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (l) { -		adapter = l->data; -		adapter->discov_active = 1; -		/* -		 * Cancel pending remote name request and clean the device list -		 * when inquiry is supported in periodic inquiry idle state. -		 */ -		if (adapter->pdiscov_active) -			pending_remote_name_cancel(adapter); +	adapter->discov_active = 1; +	/* +	 * Cancel pending remote name request and clean the device list +	 * when inquiry is supported in periodic inquiry idle state. +	 */ +	if (adapter->pdiscov_active) +		pending_remote_name_cancel(adapter); -		/* Disable name resolution for non D-Bus clients */ -		if (!adapter->discov_requestor) -			adapter->discov_type &= ~RESOLVE_NAME; +	/* Disable name resolution for non D-Bus clients */ +	if (!adapter->discov_requestor) +		adapter->discov_type &= ~RESOLVE_NAME; -		if (hcid_dbus_use_experimental()) { -			dbus_connection_emit_property_changed(connection, ptr, -						ADAPTER_INTERFACE, -						"PeriodicDiscovery", -						DBUS_TYPE_BOOLEAN, -						&adapter->discov_active); -		} -	} +	if (hcid_dbus_use_experimental()) +		dbus_connection_emit_property_changed(connection, +				adapter->path + ADAPTER_PATH_INDEX, +				ADAPTER_INTERFACE, "PeriodicDiscovery", +				DBUS_TYPE_BOOLEAN, &adapter->discov_active);  	send_adapter_signal(connection, adapter->dev_id, "DiscoveryStarted",  				DBUS_TYPE_INVALID);  	if (hcid_dbus_use_experimental())  		dbus_connection_emit_signal(connection, -				ptr, ADAPTER_INTERFACE, -				"DiscoveryStarted", -				DBUS_TYPE_INVALID); - +						adapter->path + ADAPTER_PATH_INDEX, +						ADAPTER_INTERFACE, +						"DiscoveryStarted", +						DBUS_TYPE_INVALID);  }  int found_device_req_name(struct adapter *adapter) @@ -1346,32 +1307,20 @@ static void send_out_of_range(const char *path, GSList *l)  void hcid_dbus_inquiry_complete(bdaddr_t *local)  {  	struct adapter *adapter; -	GSList *l; -	char path[MAX_PATH_LENGTH], local_addr[18];  	struct remote_dev_info *dev;  	bdaddr_t tmp; -	int id; -	ba2str(local, local_addr); - -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("Unable to find matching adapter");  		return;  	} -	adapter = l->data; -  	/* Out of range verification */  	if (adapter->pdiscov_active && !adapter->discov_active) { -		send_out_of_range(path, adapter->oor_devices); +		GSList *l; + +		send_out_of_range(adapter->path, adapter->oor_devices);  		g_slist_foreach(adapter->oor_devices, (GFunc) free, NULL);  		g_slist_free(adapter->oor_devices); @@ -1413,7 +1362,7 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)  	if (adapter->discov_active) {  		if (hcid_dbus_use_experimental()) { -			const char *ptr = path + ADAPTER_PATH_INDEX; +			const char *ptr = adapter->path + ADAPTER_PATH_INDEX;  			dbus_connection_emit_signal(connection, ptr,  						ADAPTER_INTERFACE,  						"DiscoveryCompleted", @@ -1421,7 +1370,7 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)  		} -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"DiscoveryCompleted",  						DBUS_TYPE_INVALID); @@ -1456,43 +1405,32 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)  void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)  {  	struct adapter *adapter; -	char path[MAX_PATH_LENGTH], local_addr[18]; -	int id; -	GSList *l;  	/* Don't send the signal if the cmd failed */  	if (status)  		return; -	ba2str(local, local_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); +	adapter->pdiscov_active = 1; -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (l) { -		adapter = l->data; -		adapter->pdiscov_active = 1; - -		/* Disable name resolution for non D-Bus clients */ -		if (!adapter->pdiscov_requestor) -			adapter->discov_type &= ~RESOLVE_NAME; +	/* Disable name resolution for non D-Bus clients */ +	if (!adapter->pdiscov_requestor) +		adapter->discov_type &= ~RESOLVE_NAME; -		if (hcid_dbus_use_experimental()) { -			const char *ptr = path + ADAPTER_PATH_INDEX; -			dbus_connection_emit_property_changed(connection, ptr, +	if (hcid_dbus_use_experimental()) +		dbus_connection_emit_property_changed(connection, +						adapter->path + ADAPTER_PATH_INDEX,  						ADAPTER_INTERFACE,  						"PeriodicDiscovery",  						DBUS_TYPE_BOOLEAN,  						&adapter->pdiscov_active); -		} -	} -	dbus_connection_emit_signal(connection, path, ADAPTER_INTERFACE, +	dbus_connection_emit_signal(connection, adapter->path, ADAPTER_INTERFACE,  					"PeriodicDiscoveryStarted",  					DBUS_TYPE_INVALID);  } @@ -1500,31 +1438,19 @@ void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)  void hcid_dbus_periodic_inquiry_exit(bdaddr_t *local, uint8_t status)  {  	struct adapter *adapter; -	char path[MAX_PATH_LENGTH], local_addr[18]; -	const char *ptr = path + ADAPTER_PATH_INDEX; -	int id; -	GSList *l; +	char *ptr;  	/* Don't send the signal if the cmd failed */  	if (status)  		return; -	ba2str(local, local_addr); - -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; +	ptr = adapter->path + ADAPTER_PATH_INDEX;  	/* reset the discover type to be able to handle D-Bus and non D-Bus  	 * requests */ @@ -1557,7 +1483,7 @@ void hcid_dbus_periodic_inquiry_exit(bdaddr_t *local, uint8_t status)  					"DiscoveryCompleted",  					DBUS_TYPE_INVALID); -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"DiscoveryCompleted",  						DBUS_TYPE_INVALID); @@ -1565,17 +1491,17 @@ void hcid_dbus_periodic_inquiry_exit(bdaddr_t *local, uint8_t status)  	}  	/* Send discovery completed signal if there isn't name to resolve */ -	dbus_connection_emit_signal(connection, path, ADAPTER_INTERFACE, +	dbus_connection_emit_signal(connection, adapter->path, +					ADAPTER_INTERFACE,  					"PeriodicDiscoveryStopped",  					DBUS_TYPE_INVALID); -	if (hcid_dbus_use_experimental()) { +	if (hcid_dbus_use_experimental())  		dbus_connection_emit_property_changed(connection, ptr,  						ADAPTER_INTERFACE,  						"PeriodicDiscovery",  						DBUS_TYPE_BOOLEAN,  						&adapter->discov_active); -	}  }  static char *extract_eir_name(uint8_t *data, uint8_t *type) @@ -1626,7 +1552,7 @@ static void emit_device_found(const char *path, const char *address,  void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  				int8_t rssi, uint8_t *data)  { -	char filename[PATH_MAX + 1], path[MAX_PATH_LENGTH]; +	char filename[PATH_MAX + 1];  	struct adapter *adapter;  	GSList *l;  	char local_addr[18], peer_addr[18], *name, *tmp_name; @@ -1635,26 +1561,16 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  	dbus_int16_t tmp_rssi = rssi;  	uint8_t name_type = 0x00;  	name_status_t name_status; -	int id;  	ba2str(local, local_addr);  	ba2str(peer, peer_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; -  	write_remote_class(local, peer, class);  	if (data) @@ -1683,7 +1599,8 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  	}  	/* send the device found signal */ -	dbus_connection_emit_signal(connection, path, ADAPTER_INTERFACE, +	dbus_connection_emit_signal(connection, adapter->path, +					ADAPTER_INTERFACE,  					"RemoteDeviceFound",  					DBUS_TYPE_STRING, &paddr,  					DBUS_TYPE_UINT32, &class, @@ -1727,7 +1644,7 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  	}  	if (name) { -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"RemoteNameUpdated",  						DBUS_TYPE_STRING, &paddr, @@ -1738,7 +1655,8 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  			name_status = NAME_SENT;  		if (hcid_dbus_use_experimental()) { -			emit_device_found(path + ADAPTER_PATH_INDEX, paddr, +			emit_device_found(adapter->path + ADAPTER_PATH_INDEX, +					paddr,  					"Address", DBUS_TYPE_STRING, &paddr,  					"Class", DBUS_TYPE_UINT32, &class,  					"RSSI", DBUS_TYPE_INT16, &tmp_rssi, @@ -1748,7 +1666,8 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  		g_free(name);  	} else if (hcid_dbus_use_experimental()) { -		emit_device_found(path + ADAPTER_PATH_INDEX, paddr, +		emit_device_found(adapter->path + ADAPTER_PATH_INDEX, +				paddr,  				"Address", DBUS_TYPE_STRING, &paddr,  				"Class", DBUS_TYPE_UINT32, &class,  				"RSSI", DBUS_TYPE_INT16, &tmp_rssi, @@ -1761,42 +1680,33 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  void hcid_dbus_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class)  { -	char local_addr[18], peer_addr[18]; +	char peer_addr[18];  	const char *paddr = peer_addr;  	uint32_t old_class = 0; -	int id; +	struct adapter *adapter;  	read_remote_class(local, peer, &old_class);  	if (old_class == class)  		return; -	ba2str(local, local_addr); -	ba2str(peer, peer_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	send_adapter_signal(connection, id, "RemoteClassUpdated", +	ba2str(peer, peer_addr); + +	send_adapter_signal(connection, adapter->dev_id, +				"RemoteClassUpdated",  				DBUS_TYPE_STRING, &paddr,  				DBUS_TYPE_UINT32, &class,  				DBUS_TYPE_INVALID);  	if (hcid_dbus_use_experimental()) { -		char path[MAX_PATH_LENGTH]; -		struct device *device; -		struct adapter *adapter;  		GSList *l; - -		snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -		l = g_slist_find_custom(adapters, path, find_adapter); -		if (!l) -			return; - -		adapter = l->data; +		struct device *device;  		l = g_slist_find_custom(adapter->devices, paddr,  				(GCompareFunc) device_address_cmp); @@ -1814,37 +1724,25 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,  				char *name)  {  	struct adapter *adapter; -	char path[MAX_PATH_LENGTH], local_addr[18], peer_addr[18]; +	char peer_addr[18];  	const char *paddr = peer_addr; -	int id; -	GSList *l; - -	ba2str(local, local_addr); -	ba2str(peer, peer_addr); - -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; +	ba2str(peer, peer_addr);  	if (status) -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"RemoteNameFailed",  						DBUS_TYPE_STRING, &paddr,  						DBUS_TYPE_INVALID);  	else { -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"RemoteNameUpdated",  						DBUS_TYPE_STRING, &paddr, @@ -1898,15 +1796,14 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,  	}  	if (adapter->discov_active) { -		if (hcid_dbus_use_experimental()) { -			const char *ptr = path + ADAPTER_PATH_INDEX; -			dbus_connection_emit_signal(connection, ptr, +		if (hcid_dbus_use_experimental()) +			dbus_connection_emit_signal(connection, +					adapter->path + ADAPTER_PATH_INDEX,  					ADAPTER_INTERFACE,  					"DiscoveryCompleted",  					DBUS_TYPE_INVALID); -		} -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"DiscoveryCompleted",  						DBUS_TYPE_INVALID); @@ -1917,33 +1814,22 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,  void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,  				bdaddr_t *peer)  { -	char path[MAX_PATH_LENGTH], local_addr[18], peer_addr[18]; +	char peer_addr[18];  	const char *paddr = peer_addr;  	struct adapter *adapter; -	int id;  	GSList *l; -	ba2str(local, local_addr); -	ba2str(peer, peer_addr); - -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; +	ba2str(peer, peer_addr);  	if (status) { -		cancel_passkey_agent_requests(adapter->passkey_agents, path, -						peer); +		cancel_passkey_agent_requests(adapter->passkey_agents, +						adapter->path, peer);  		release_passkey_agents(adapter, peer);  		l = g_slist_find_custom(adapter->pin_reqs, peer, pin_req_cmp); @@ -1957,7 +1843,7 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,  			adapter->bonding->hci_status = status;  	} else {  		/* Send the remote device connected signal */ -		dbus_connection_emit_signal(connection, path, +		dbus_connection_emit_signal(connection, adapter->path,  						ADAPTER_INTERFACE,  						"RemoteDeviceConnected",  						DBUS_TYPE_STRING, &paddr, @@ -1985,13 +1871,12 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status,  				uint16_t handle, uint8_t reason)  {  	DBusMessage *reply; -	char path[MAX_PATH_LENGTH], local_addr[18], peer_addr[18]; +	char peer_addr[18];  	const char *paddr = peer_addr;  	struct adapter *adapter;  	struct device *device;  	struct active_conn_info *dev;  	GSList *l; -	int id;  	gboolean connected = FALSE;  	if (status) { @@ -1999,23 +1884,12 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status,  		return;  	} -	ba2str(local, local_addr); - -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; -  	l = g_slist_find_custom(adapter->active_conn, &handle,  				active_conn_find_by_handle); @@ -2030,7 +1904,7 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status,  	hci_req_queue_remove(adapter->dev_id, &dev->bdaddr);  	/* Cancel D-Bus/non D-Bus requests */ -	cancel_passkey_agent_requests(adapter->passkey_agents, path, +	cancel_passkey_agent_requests(adapter->passkey_agents, adapter->path,  					&dev->bdaddr);  	release_passkey_agents(adapter, &dev->bdaddr); @@ -2076,7 +1950,8 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status,  	}  	/* Send the remote device disconnected signal */ -	dbus_connection_emit_signal(connection, path, ADAPTER_INTERFACE, +	dbus_connection_emit_signal(connection, adapter->path, +					ADAPTER_INTERFACE,  					"RemoteDeviceDisconnected",  					DBUS_TYPE_STRING, &paddr,  					DBUS_TYPE_INVALID); @@ -2257,24 +2132,19 @@ void hcid_dbus_setname_complete(bdaddr_t *local)  void hcid_dbus_setscan_enable_complete(bdaddr_t *local)  {  	struct adapter *adapter; -	char path[MAX_PATH_LENGTH], local_addr[18];  	read_scan_enable_rp rp;  	struct hci_request rq; -	int id, dd = -1; -	GSList *l; +	int dd = -1; -	ba2str(local, local_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	dd = hci_open_dev(id); +	dd = hci_open_dev(adapter->dev_id);  	if (dd < 0) { -		error("HCI device open failed: hci%d", id); +		error("HCI device open failed: hci%d", adapter->dev_id);  		return;  	} @@ -2297,21 +2167,13 @@ void hcid_dbus_setscan_enable_complete(bdaddr_t *local)  		goto failed;  	} -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); -		goto failed; -	} - -	adapter = l->data; -  	if (adapter->timeout_id) {  		g_source_remove(adapter->timeout_id);  		adapter->timeout_id = 0;  	}  	if (adapter->scan_enable != rp.enable) -		adapter_mode_changed(adapter, path, rp.enable); +		adapter_mode_changed(adapter, rp.enable);  failed:  	if (dd >= 0) @@ -2321,36 +2183,24 @@ failed:  void hcid_dbus_write_class_complete(bdaddr_t *local)  {  	struct adapter *adapter; -	char path[MAX_PATH_LENGTH], local_addr[18]; -	int id, dd; +	int dd;  	uint8_t cls[3]; -	GSList *l; -	ba2str(local, local_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; - -	dd = hci_open_dev(id); +	dd = hci_open_dev(adapter->dev_id);  	if (dd < 0) { -		error("HCI device open failed: hci%d", id); +		error("HCI device open failed: hci%d", adapter->dev_id);  		return;  	}  	if (hci_read_class_of_dev(dd, cls, 1000) < 0) {  		error("Can't read class of device on hci%d: %s (%d)", -						id, strerror(errno), errno); +			adapter->dev_id, strerror(errno), errno);  		hci_close_dev(dd);  		return;  	} @@ -2405,25 +2255,13 @@ void hcid_dbus_pin_code_reply(bdaddr_t *local, void *ptr)  	struct adapter *adapter;  	ret_pin_code_req_reply *ret = ptr + EVT_CMD_COMPLETE_SIZE;  	GSList *l; -	char path[MAX_PATH_LENGTH], local_addr[18]; -	int id; - -	ba2str(local, local_addr); -	id = hci_devid(local_addr); -	if (id < 0) { -		error("No matching device id for %s", local_addr); -		return; -	} -	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	l = g_slist_find_custom(adapters, path, find_adapter); -	if (!l) { -		error("Getting %s path data failed!", path); +	adapter = find_adapter(local); +	if (!adapter) { +		error("No matching adapter found");  		return;  	} -	adapter = l->data; -  	l = g_slist_find_custom(adapter->pin_reqs, &ret->bdaddr, pin_req_cmp);  	if (l) {  		struct pending_pin_info *p = l->data; | 
