diff options
Diffstat (limited to 'hcid/adapter.c')
-rw-r--r-- | hcid/adapter.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c index 7e434965..281dd86c 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -273,7 +273,7 @@ void adapter_auth_request_replied(struct adapter *adapter, bdaddr_t *dba) auth = l->data; - auth->replied = 1; + auth->replied = TRUE; } struct pending_auth_info *adapter_find_auth_request(struct adapter *adapter, @@ -360,11 +360,32 @@ int pending_remote_name_cancel(struct adapter *adapter) return err; } +static int auth_info_agent_cmp(const void *a, const void *b) +{ + const struct pending_auth_info *auth = a; + const struct agent *agent = b; + + if (auth->agent == agent) + return 0; + + return -1; +} + static void device_agent_removed(struct agent *agent, void *user_data) { struct device *device = user_data; + struct pending_auth_info *auth; + GSList *l; device->agent = NULL; + + l = g_slist_find_custom(device->adapter->auth_reqs, agent, + auth_info_agent_cmp); + if (!l) + return; + + auth = l->data; + auth->agent = NULL; } static struct bonding_request_info *bonding_request_new(DBusConnection *conn, @@ -2743,6 +2764,8 @@ static void create_bond_req_exit(void *user_data) auth = adapter_find_auth_request(adapter, &adapter->bonding->bdaddr); if (auth) { cancel_auth_request(auth, adapter->dev_id); + if (auth->agent) + agent_cancel(auth->agent); adapter_remove_auth_request(adapter, &adapter->bonding->bdaddr); } @@ -2881,9 +2904,11 @@ static DBusMessage *adapter_cancel_bonding(DBusConnection *conn, */ g_io_channel_close(adapter->bonding->io); return not_authorized(msg); - } else - cancel_auth_request(auth_req, adapter->dev_id); + } + cancel_auth_request(auth_req, adapter->dev_id); + if (auth_req->agent) + agent_cancel(auth_req->agent); adapter_remove_auth_request(adapter, &bdaddr); } @@ -4080,7 +4105,18 @@ static DBusMessage *find_device(DBusConnection *conn, static void agent_removed(struct agent *agent, struct adapter *adapter) { + struct pending_auth_info *auth; + GSList *l; + adapter->agent = NULL; + + l = g_slist_find_custom(adapter->auth_reqs, agent, + auth_info_agent_cmp); + if (!l) + return; + + auth = l->data; + auth->agent = NULL; } static DBusMessage *register_agent(DBusConnection *conn, |