Diff between 8a10ddc5488040af60f244a3a783636e3fbcc6d8 and ca38ba28b13b35f05b10093d0240b19ea449a6a0

Changed Files

File Additions Deletions Status
src/adapter.c +1 -1 modified
src/device.c +20 -1 modified
src/device.h +1 -0 modified
src/mgmt.c +1 -1 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index 5539d55..0e97e57 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 4af2179..a56eba2 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 3128615..b9f8f76 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 d70c941..798435f 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);
 	}