Move PIN code storage access to core daemon
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 56ce978..b8bf00e 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -870,51 +870,18 @@
static void pin_code_request(int index, bdaddr_t *dba)
{
struct dev_info *dev = &devs[index];
- pin_code_reply_cp pr;
- struct hci_conn_info_req *cr;
- struct hci_conn_info *ci;
- char da[18], pin[17];
- int pinlen;
+ char addr[18];
+ int err;
- memset(&pr, 0, sizeof(pr));
- bacpy(&pr.bdaddr, dba);
+ ba2str(dba, addr);
+ DBG("hci%d PIN request for %s", index, addr);
- ba2str(dba, da);
- DBG("hci%d PIN request for %s", index, da);
-
- cr = g_malloc0(sizeof(*cr) + sizeof(*ci));
-
- bacpy(&cr->bdaddr, dba);
- cr->type = ACL_LINK;
- if (ioctl(dev->sk, HCIGETCONNINFO, (unsigned long) cr) < 0) {
- error("Can't get conn info: %s (%d)", strerror(errno), errno);
- goto reject;
+ err = btd_event_request_pin(&dev->bdaddr, dba);
+ if (err < 0) {
+ error("PIN code negative reply: %s", strerror(-err));
+ hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY,
+ 6, dba);
}
- ci = cr->conn_info;
-
- memset(pin, 0, sizeof(pin));
- pinlen = read_pin_code(&dev->bdaddr, dba, pin);
-
- if (pinlen > 0) {
- dev->pin_length = pinlen;
- memcpy(pr.pin_code, pin, pinlen);
- pr.pin_len = pinlen;
- hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_PIN_CODE_REPLY,
- PIN_CODE_REPLY_CP_SIZE, &pr);
- } else {
- /* Request PIN from passkey agent */
- if (btd_event_request_pin(&dev->bdaddr, ci) < 0)
- goto reject;
- }
-
- g_free(cr);
-
- return;
-
-reject:
- g_free(cr);
-
- hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, dba);
}
static void start_inquiry(bdaddr_t *local, uint8_t status, gboolean periodic)
diff --git a/src/event.c b/src/event.c
index 009560e..2a1edf1 100644
--- a/src/event.c
+++ b/src/event.c
@@ -129,12 +129,14 @@
error("Sending PIN code reply failed: %s (%d)", strerror(-err), -err);
}
-int btd_event_request_pin(bdaddr_t *sba, struct hci_conn_info *ci)
+int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba)
{
struct btd_adapter *adapter;
struct btd_device *device;
+ char pin[17];
+ int pinlen;
- if (!get_adapter_and_device(sba, &ci->bdaddr, &adapter, &device, TRUE))
+ if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
return -ENODEV;
/* Check if the adapter is not pairable and if there isn't a bonding in
@@ -142,6 +144,13 @@
if (!adapter_is_pairable(adapter) && !device_is_bonding(device, NULL))
return -EPERM;
+ memset(pin, 0, sizeof(pin));
+ pinlen = read_pin_code(sba, dba, pin);
+ if (pinlen > 0) {
+ btd_adapter_pincode_reply(adapter, dba, pin);
+ return 0;
+ }
+
return device_request_authentication(device, AUTH_TYPE_PINCODE, 0,
pincode_cb);
}
diff --git a/src/event.h b/src/event.h
index 4321949..83528a4 100644
--- a/src/event.h
+++ b/src/event.h
@@ -22,7 +22,7 @@
*
*/
-int btd_event_request_pin(bdaddr_t *sba, struct hci_conn_info *ci);
+int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba);
void btd_event_advertising_report(bdaddr_t *local, le_advertising_info *info);
void btd_event_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi, uint8_t *data);
void btd_event_set_legacy_pairing(bdaddr_t *local, bdaddr_t *peer, gboolean legacy);