diff --git a/src/adapter.c b/src/adapter.c
index b38c813..f5abfe3 100644
--- a/src/adapter.c
+++ b/src/adapter.c
static GSList *adapter_drivers = NULL;
static GSList *disconnect_list = NULL;
+static GSList *conn_fail_list = NULL;
struct link_key_info {
bdaddr_t bdaddr;
device_unblock(device, FALSE, TRUE);
}
+static void conn_fail_notify(struct btd_device *dev, uint8_t status)
+{
+ GSList *l;
+
+ for (l = conn_fail_list; l; l = g_slist_next(l)) {
+ btd_conn_fail_cb conn_fail_cb = l->data;
+ conn_fail_cb(dev, status);
+ }
+}
+
+void btd_add_conn_fail_cb(btd_conn_fail_cb func)
+{
+ conn_fail_list = g_slist_append(conn_fail_list, func);
+}
+
+void btd_remove_conn_fail_cb(btd_conn_fail_cb func)
+{
+ conn_fail_list = g_slist_remove(conn_fail_list, func);
+}
+
static void connect_failed_callback(uint16_t index, uint16_t length,
const void *param, void *user_data)
{
device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
ev->addr.type);
if (device) {
+ conn_fail_notify(device, ev->status);
+
/* If the device is in a bonding process cancel any auth request
* sent to the agent before proceeding, but keep the bonding
* request structure. */
diff --git a/src/adapter.h b/src/adapter.h
index 8895197..f88c339 100644
--- a/src/adapter.h
+++ b/src/adapter.h
void btd_add_disconnect_cb(btd_disconnect_cb func);
void btd_remove_disconnect_cb(btd_disconnect_cb func);
+typedef void (*btd_conn_fail_cb) (struct btd_device *device, uint8_t status);
+void btd_add_conn_fail_cb(btd_conn_fail_cb func);
+void btd_remove_conn_fail_cb(btd_conn_fail_cb func);
+
struct btd_adapter *adapter_find(const bdaddr_t *sba);
struct btd_adapter *adapter_find_by_id(int id);
void adapter_foreach(adapter_cb func, gpointer user_data);