From 0c07606eea31a8e6e80ff6819339848c7b480fb9 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 4 Dec 2012 10:45:21 +0200 Subject: [PATCH] core: Remove event.c as a middle-man for PIN code based pairing --- src/event.c | 24 ---------------------- src/event.h | 1 - src/mgmt.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/event.c b/src/event.c index f3cd1af8d..e7be9a44a 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 f9a27986d..62d2f98b9 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 18a653ef1..04e6ea2b1 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); } } -- 2.47.3