summaryrefslogtreecommitdiffstats
path: root/hcid
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-06-05 11:32:55 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2008-06-05 11:32:55 +0000
commit41e8f6dc730096d303b71175adc508a66126ea06 (patch)
treeec5548bb17b9fed0276f32d17a1af13e6bd43e94 /hcid
parent67beb97a8c563bee457bf18d1dffce6bf943a3dd (diff)
Clean up adapter lookup
Diffstat (limited to 'hcid')
-rw-r--r--hcid/dbus-hci.c482
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;