diff options
-rw-r--r-- | hcid/dbus.c | 48 | ||||
-rw-r--r-- | hcid/dbus.h | 1 | ||||
-rw-r--r-- | hcid/hcid.h | 1 | ||||
-rw-r--r-- | hcid/security.c | 2 |
4 files changed, 47 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)) diff --git a/hcid/dbus.h b/hcid/dbus.h index 5bab94ce..5c775871 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -108,6 +108,7 @@ struct hci_dbus_data { struct slist *passkey_agents; struct bonding_request_info *bonding; struct slist *active_conn; + struct slist *pending_bondings; }; struct passkey_agent { diff --git a/hcid/hcid.h b/hcid/hcid.h index 3714a666..cbaa6048 100644 --- a/hcid/hcid.h +++ b/hcid/hcid.h @@ -146,6 +146,7 @@ void hcid_dbus_set_experimental(); int hcid_dbus_use_experimental(); int hcid_dbus_register_device(uint16_t id); int hcid_dbus_unregister_device(uint16_t id); +void hcid_dbus_pending_bonding_add(bdaddr_t *sba, bdaddr_t *dba); void hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci); void hcid_dbus_inquiry_start(bdaddr_t *local); diff --git a/hcid/security.c b/hcid/security.c index 25bfeac2..d8b6affb 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -379,6 +379,8 @@ static void pin_code_request(int dev, bdaddr_t *sba, bdaddr_t *dba) hcid_dbus_request_pin(dev, sba, ci); } + hcid_dbus_pending_bonding_add(sba, &ci->bdaddr); + free(cr); return; |