diff --git a/src/event.c b/src/event.c
index f3cd1af..e7be9a4 100644
--- a/src/event.c
+++ b/src/event.c
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
*
*/
-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
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;
{
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;
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);
}
}