Diff between d4f24ab37693f6eaf9dfc53529000d895cdca09a and 4711fff515c7d510ec7018640b316cfb7f181760

Changed Files

File Additions Deletions Status
src/adapter.c +14 -0 modified
src/adapter.h +2 -0 modified
src/agent.c +26 -4 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index 3d994c5..fadb905 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2793,6 +2793,8 @@ static void load_config(struct btd_adapter *adapter)
 
 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 {
+	struct agent *agent;
+
 	adapter->up = up;
 	adapter->already_up = up;
 
@@ -2805,6 +2807,13 @@ gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
 		return FALSE;
 	}
 
+	agent = agent_get(NULL);
+	if (agent) {
+		uint8_t io_cap = agent_get_io_capability(agent);
+		adapter_set_io_capability(adapter, io_cap);
+		agent_unref(agent);
+	}
+
 	sdp_init_services_list(&adapter->bdaddr);
 
 	btd_adapter_gatt_server_start(adapter);
@@ -3601,6 +3610,11 @@ void adapter_bonding_complete(struct btd_adapter *adapter,
 	check_oob_bonding_complete(adapter, bdaddr, status);
 }
 
+int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
+{
+	return mgmt_set_io_capability(adapter->dev_id, io_cap);
+}
+
 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
 {
 	return mgmt_read_local_oob_data(adapter->dev_id);
diff --git a/src/adapter.h b/src/adapter.h
index 6b27608..5030cb0 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -209,6 +209,8 @@ void adapter_bonding_complete(struct btd_adapter *adapter,
 					const bdaddr_t *bdaddr,
 					uint8_t addr_type, uint8_t status);
 
+int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap);
+
 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter);
 void adapter_read_local_oob_data_complete(struct btd_adapter *adapter,
 					uint8_t *hash, uint8_t *randomizer);
diff --git a/src/agent.c b/src/agent.c
index 823ce31..3c460de 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -45,6 +45,7 @@
 #include "dbus-common.h"
 #include "adapter.h"
 #include "device.h"
+#include "manager.h"
 #include "agent.h"
 
 #define IO_CAPABILITY_DISPLAYONLY	0x00
@@ -140,6 +141,23 @@ static void agent_request_free(struct agent_request *req, gboolean destroy)
 	g_free(req);
 }
 
+static void set_io_cap(struct btd_adapter *adapter, gpointer user_data)
+{
+	struct agent *agent = user_data;
+
+	adapter_set_io_capability(adapter, agent->capability);
+}
+
+static void set_default_agent(struct agent *agent)
+{
+	if (default_agent == agent)
+		return;
+
+	default_agent = agent;
+
+	manager_foreach_adapter(set_io_cap, agent);
+}
+
 static void agent_disconnect(DBusConnection *conn, void *user_data)
 {
 	struct agent *agent = user_data;
@@ -152,6 +170,12 @@ static void agent_disconnect(DBusConnection *conn, void *user_data)
 	}
 
 	g_hash_table_remove(agent_list, agent->owner);
+
+	agent = agent_get(NULL);
+	if (agent) {
+		set_default_agent(agent);
+		agent_unref(agent);
+	}
 }
 
 struct agent *agent_ref(struct agent *agent)
@@ -172,9 +196,6 @@ void agent_unref(struct agent *agent)
 	if (agent->ref > 0)
 		return;
 
-	if (agent == default_agent)
-		default_agent = NULL;
-
 	if (agent->request) {
 		DBusError err;
 		agent_pincode_cb pincode_cb;
@@ -963,7 +984,7 @@ static DBusMessage *request_default(DBusConnection *conn, DBusMessage *msg,
 	if (!agent)
 		return btd_error_does_not_exist(msg);
 
-	default_agent = agent;
+	set_default_agent(agent);
 
 	return dbus_message_new_method_return(msg);
 }
@@ -993,5 +1014,6 @@ void btd_agent_cleanup(void)
 	g_dbus_unregister_interface(btd_get_dbus_connection(),
 				"/org/bluez", "org.bluez.AgentManager1");
 
+	default_agent = NULL;
 	g_hash_table_destroy(agent_list);
 }