diff options
Diffstat (limited to 'hcid/dbus.c')
-rw-r--r-- | hcid/dbus.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/hcid/dbus.c b/hcid/dbus.c index 7c1d3e34..9a805cd9 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -593,6 +593,36 @@ failed: return ret; } +int pending_bonding_cmp(const void *p1, const void *p2) +{ + const bdaddr_t *peer1 = p1; + const bdaddr_t *peer2 = p2; + + if (peer2) + return bacmp(peer1, peer2); + return -1; +} + +void hcid_dbus_pending_bonding_add(bdaddr_t *sba, bdaddr_t *dba) +{ + char path[MAX_PATH_LENGTH], addr[18]; + struct hci_dbus_data *pdata; + bdaddr_t *peer; + + ba2str(sba, addr); + + snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, hci_devid(addr)); + + if (!dbus_connection_get_object_path_data(connection, path, (void *) &pdata)) { + error("Getting %s path data failed!", path); + return; + } + + peer = malloc(sizeof(bdaddr_t)); + bacpy(peer, dba); + pdata->pending_bondings = slist_append(pdata->pending_bondings, peer); +} + void hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci) { char path[MAX_PATH_LENGTH], addr[18]; @@ -609,7 +639,7 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, const u struct hci_dbus_data *pdata; DBusMessage *message; char *local_addr, *peer_addr; - const char *name; + struct slist *l; bdaddr_t tmp; char path[MAX_PATH_LENGTH]; int id; @@ -644,12 +674,20 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, const u send_reply_and_unref(connection, message); #endif - if (!status) { - name = "BondingCreated"; - message = dev_signal_factory(pdata->dev_id, name, + + l = slist_find(pdata->pending_bondings, peer, pending_bonding_cmp); + if (l) { + bdaddr_t *p = l->data; + pdata->pending_bondings = slist_remove(pdata->pending_bondings, p); + free(p); + + if (!status) { + const char *name = "BondingCreated"; + message = dev_signal_factory(pdata->dev_id, name, DBUS_TYPE_STRING, &peer_addr, DBUS_TYPE_INVALID); - send_reply_and_unref(connection, message); + send_reply_and_unref(connection, message); + } } if (!pdata->bonding || bacmp(&pdata->bonding->bdaddr, peer)) |