Diff between 36c9b884fa7db2642306c3ba1ca99ebcdc671f68 and 0c07606eea31a8e6e80ff6819339848c7b480fb9

Changed Files

File Additions Deletions Status
src/event.c +0 -24 modified
src/event.h +0 -1 modified
src/mgmt.c +55 -3 modified

Full Patch

diff --git a/src/event.c b/src/event.c
index f3cd1af..e7be9a4 100644
--- a/src/event.c
+++ b/src/event.c
@@ -83,30 +83,6 @@ static gboolean get_adapter_and_device(const bdaddr_t *src, bdaddr_t *dst,
 	return TRUE;
 }
 
-int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba, gboolean secure)
-{
-	struct btd_adapter *adapter;
-	struct btd_device *device;
-	char pin[17];
-	ssize_t pinlen;
-	gboolean display = FALSE;
-
-	if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
-		return -ENODEV;
-
-	memset(pin, 0, sizeof(pin));
-	pinlen = btd_adapter_get_pin(adapter, device, pin, &display);
-	if (pinlen > 0 && (!secure || pinlen == 16)) {
-		if (display && device_is_bonding(device, NULL))
-			return device_notify_pincode(device, secure, pin);
-
-		btd_adapter_pincode_reply(adapter, dba, pin, pinlen);
-		return 0;
-	}
-
-	return device_request_pincode(device, secure);
-}
-
 int btd_event_user_confirm(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey)
 {
 	struct btd_adapter *adapter;
diff --git a/src/event.h b/src/event.h
index f9a2798..62d2f98 100644
--- a/src/event.h
+++ b/src/event.h
@@ -22,7 +22,6 @@
  *
  */
 
-int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba, gboolean secure);
 void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer,
 				uint8_t bdaddr_type, int8_t rssi,
 				bool confirm_name, bool legacy,
diff --git a/src/mgmt.c b/src/mgmt.c
index 18a653e..04e6ea2 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
@@ -84,6 +84,34 @@ static guint mgmt_watch = 0;
 static uint8_t mgmt_version = 0;
 static uint16_t mgmt_revision = 0;
 
+static bool get_adapter_and_device(const bdaddr_t *src, bdaddr_t *dst,
+					struct btd_adapter **adapter,
+					struct btd_device **device,
+					bool create)
+{
+	char peer_addr[18];
+
+	*adapter = manager_find_adapter(src);
+	if (!*adapter) {
+		error("Unable to find matching adapter");
+		return false;
+	}
+
+	ba2str(dst, peer_addr);
+
+	if (create)
+		*device = adapter_get_device(*adapter, peer_addr);
+	else
+		*device = adapter_find_device(*adapter, peer_addr);
+
+	if (create && !*device) {
+		error("Unable to get device object!");
+		return false;
+	}
+
+	return true;
+}
+
 static void read_version_complete(int sk, void *buf, size_t len)
 {
 	struct mgmt_hdr hdr;
@@ -618,6 +646,11 @@ static void mgmt_pin_code_request(int sk, uint16_t index, void *buf, size_t len)
 {
 	struct mgmt_ev_pin_code_request *ev = buf;
 	struct controller_info *info;
+	struct btd_adapter *adapter;
+	struct btd_device *device;
+	gboolean display = FALSE;
+	char pin[17];
+	ssize_t pinlen;
 	char addr[18];
 	int err;
 
@@ -637,10 +670,29 @@ static void mgmt_pin_code_request(int sk, uint16_t index, void *buf, size_t len)
 
 	info = &controllers[index];
 
-	err = btd_event_request_pin(&info->bdaddr, &ev->addr.bdaddr,
-								ev->secure);
+	if (!get_adapter_and_device(&info->bdaddr, &ev->addr.bdaddr,
+						&adapter, &device, true))
+		return;
+
+	memset(pin, 0, sizeof(pin));
+	pinlen = btd_adapter_get_pin(adapter, device, pin, &display);
+	if (pinlen > 0 && (!ev->secure || pinlen == 16)) {
+		if (display && device_is_bonding(device, NULL)) {
+			err = device_notify_pincode(device, ev->secure, pin);
+			if (err < 0) {
+				error("device_notify_pin: %s", strerror(-err));
+				mgmt_pincode_reply(index, &ev->addr.bdaddr,
+								NULL, 0);
+			}
+		} else {
+			mgmt_pincode_reply(index, &ev->addr.bdaddr, pin, pinlen);
+		}
+		return;
+	}
+
+	err = device_request_pincode(device, ev->secure);
 	if (err < 0) {
-		error("btd_event_request_pin: %s", strerror(-err));
+		error("device_request_pin: %s", strerror(-err));
 		mgmt_pincode_reply(index, &ev->addr.bdaddr, NULL, 0);
 	}
 }