diff --git a/src/adapter.c b/src/adapter.c
index 0909a22..9fadc1c 100644
--- a/src/adapter.c
+++ b/src/adapter.c
guint off_timer;
GSList *powered_callbacks;
+ GSList *pin_callbacks;
GSList *loaded_drivers;
};
g_slist_free(adapter->devices);
unload_drivers(adapter);
+ g_slist_free(adapter->pin_callbacks);
/* Return adapter to down state if it was not up on init */
adapter_ops->restore_powered(adapter->dev_id);
return 0;
}
+void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
+ btd_adapter_pin_cb_t cb)
+{
+ adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
+}
+
+void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
+ btd_adapter_pin_cb_t cb)
+{
+ adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
+}
+
+ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
+ char *pin_buf)
+{
+ GSList *l;
+ btd_adapter_pin_cb_t cb;
+ bdaddr_t sba, dba;
+ ssize_t ret;
+
+ for (l = adapter->pin_callbacks; l != NULL; l = g_slist_next(l)) {
+ cb = l->data;
+ ret = cb(adapter, dev, pin_buf);
+ if (ret > 0)
+ return ret;
+ }
+
+ adapter_get_address(adapter, &sba);
+ device_get_address(dev, &dba);
+
+ return read_pin_code(&sba, &dba, pin_buf);
+}
+
int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)
{
if (ops->setup == NULL)
diff --git a/src/adapter.h b/src/adapter.h
index 38ea3ca..687275a 100644
--- a/src/adapter.h
+++ b/src/adapter.h
int btd_adapter_switch_online(struct btd_adapter *adapter);
int btd_adapter_switch_offline(struct btd_adapter *adapter);
+typedef ssize_t (*btd_adapter_pin_cb_t) (struct btd_adapter *adapter,
+ struct btd_device *dev, char *out);
+void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
+ btd_adapter_pin_cb_t cb);
+void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
+ btd_adapter_pin_cb_t cb);
+ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
+ char *pin_buf);
+
typedef void (*bt_hci_result_t) (uint8_t status, gpointer user_data);
struct btd_adapter_ops {
diff --git a/src/event.c b/src/event.c
index 2a43bc8..7398fd3 100644
--- a/src/event.c
+++ b/src/event.c
return -ENODEV;
memset(pin, 0, sizeof(pin));
- pinlen = read_pin_code(sba, dba, pin);
+ pinlen = btd_adapter_get_pin(adapter, device, pin);
if (pinlen > 0 && (!secure || pinlen == 16)) {
btd_adapter_pincode_reply(adapter, dba, pin, pinlen);
return 0;