From ca38ba28b13b35f05b10093d0240b19ea449a6a0 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 19 Dec 2012 19:12:47 +0200 Subject: [PATCH] core: Create a separate function for bonding failure cleanup --- src/adapter.c | 2 +- src/device.c | 21 ++++++++++++++++++++- src/device.h | 1 + src/mgmt.c | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 5539d55c6..0e97e5764 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1597,7 +1597,7 @@ static void reply_pending_requests(struct btd_adapter *adapter) struct btd_device *device = l->data; if (device_is_bonding(device, NULL)) - device_cancel_bonding(device, + device_bonding_failed(device, HCI_OE_USER_ENDED_CONNECTION); } } diff --git a/src/device.c b/src/device.c index 4af217961..a56eba2dc 100644 --- a/src/device.c +++ b/src/device.c @@ -3582,7 +3582,7 @@ void device_bonding_complete(struct btd_device *device, uint8_t status) if (status) { device_cancel_authentication(device, TRUE); - device_cancel_bonding(device, status); + device_bonding_failed(device, status); return; } @@ -3641,6 +3641,25 @@ gboolean device_is_bonding(struct btd_device *device, const char *sender) return g_str_equal(sender, dbus_message_get_sender(bonding->msg)); } +void device_bonding_failed(struct btd_device *device, uint8_t status) +{ + struct bonding_req *bonding = device->bonding; + DBusMessage *reply; + + DBG("status %u", status); + + if (!bonding) + return; + + if (device->authr) + device_cancel_authentication(device, FALSE); + + reply = new_authentication_return(bonding->msg, status); + g_dbus_send_message(btd_get_dbus_connection(), reply); + + bonding_request_free(bonding); +} + void device_cancel_bonding(struct btd_device *device, uint8_t status) { struct bonding_req *bonding = device->bonding; diff --git a/src/device.h b/src/device.h index 312861566..b9f8f764a 100644 --- a/src/device.h +++ b/src/device.h @@ -75,6 +75,7 @@ void device_set_auto_connect(struct btd_device *device, gboolean enable); gboolean device_is_connected(struct btd_device *device); void device_bonding_complete(struct btd_device *device, uint8_t status); gboolean device_is_bonding(struct btd_device *device, const char *sender); +void device_bonding_failed(struct btd_device *device, uint8_t status); void device_cancel_bonding(struct btd_device *device, uint8_t status); int device_request_pincode(struct btd_device *device, gboolean secure); int device_request_passkey(struct btd_device *device); diff --git a/src/mgmt.c b/src/mgmt.c index d70c941b7..798435fd7 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -623,7 +623,7 @@ static void mgmt_connect_failed(int sk, uint16_t index, void *buf, size_t len) if (device) { if (device_is_bonding(device, NULL)) - device_cancel_bonding(device, ev->status); + device_bonding_failed(device, ev->status); if (device_is_temporary(device)) adapter_remove_device(adapter, device, TRUE); } -- 2.47.3