Diff between 0960fd397a99db1b35677b2cda89f1c1051c325d and 3a3074accbfc72126def9f8dc2cf92681512af7d

Changed Files

File Additions Deletions Status
client/agent.c +11 -2 modified
client/agent.h +2 -1 modified
client/main.c +26 -11 modified

Full Patch

diff --git a/client/agent.c b/client/agent.c
index 6ab0d4d..5f1a1ba 100644
--- a/client/agent.c
+++ b/client/agent.c
@@ -36,6 +36,7 @@
 #define AGENT_INTERFACE "org.bluez.Agent1"
 
 static gboolean agent_registered = FALSE;
+static const char *agent_capability = NULL;
 static DBusMessage *pending_message = NULL;
 
 dbus_bool_t agent_completion(void)
@@ -98,6 +99,7 @@ static DBusMessage *release_agent(DBusConnection *conn,
 		rl_clear_message();
 
 	agent_registered = FALSE;
+	agent_capability = NULL;
 
 	rl_printf("Agent released\n");
 
@@ -197,7 +199,7 @@ static const GDBusMethodTable methods[] = {
 static void register_agent_setup(DBusMessageIter *iter, void *user_data)
 {
 	const char *path = AGENT_PATH;
-	const char *capability = "";
+	const char *capability = agent_capability;
 
 	dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
 	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &capability);
@@ -223,13 +225,17 @@ static void register_agent_reply(DBusMessage *message, void *user_data)
 	}
 }
 
-void agent_register(DBusConnection *conn, GDBusProxy *manager)
+void agent_register(DBusConnection *conn, GDBusProxy *manager,
+						const char *capability)
+
 {
 	if (agent_registered == TRUE) {
 		rl_printf("Agent is already registered\n");
 		return;
 	}
 
+	agent_capability = capability;
+
 	if (g_dbus_register_interface(conn, AGENT_PATH,
 					AGENT_INTERFACE, methods,
 					NULL, NULL, NULL, NULL) == FALSE) {
@@ -244,6 +250,8 @@ void agent_register(DBusConnection *conn, GDBusProxy *manager)
 		rl_printf("Failed to call register agent method\n");
 		return;
 	}
+
+	agent_capability = NULL;
 }
 
 static void unregister_agent_setup(DBusMessageIter *iter, void *user_data)
@@ -262,6 +270,7 @@ static void unregister_agent_reply(DBusMessage *message, void *user_data)
 
 	if (dbus_set_error_from_message(&error, message) == FALSE) {
 		agent_registered = FALSE;
+		agent_capability = NULL;
 		rl_printf("Agent unregistered\n");
 
 		if (g_dbus_unregister_interface(conn, AGENT_PATH,
diff --git a/client/agent.h b/client/agent.h
index 6e4536d..c86d0d5 100644
--- a/client/agent.h
+++ b/client/agent.h
@@ -21,7 +21,8 @@
  *
  */
 
-void agent_register(DBusConnection *conn, GDBusProxy *manager);
+void agent_register(DBusConnection *conn, GDBusProxy *manager,
+						const char *capability);
 void agent_unregister(DBusConnection *conn, GDBusProxy *manager);
 
 dbus_bool_t agent_completion(void);
diff --git a/client/main.c b/client/main.c
index 77cdd92..9654df5 100644
--- a/client/main.c
+++ b/client/main.c
@@ -44,7 +44,7 @@ static GMainLoop *main_loop;
 static DBusConnection *dbus_conn;
 
 static GDBusProxy *agent_manager;
-static gboolean auto_register_agent = FALSE;
+static gchar *auto_register_agent = NULL;
 
 static GDBusProxy *default_ctrl;
 static GList *ctrl_list;
@@ -219,8 +219,9 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
 		if (!agent_manager) {
 			agent_manager = proxy;
 
-			if (auto_register_agent == TRUE)
-				agent_register(dbus_conn, agent_manager);
+			if (auto_register_agent)
+				agent_register(dbus_conn, agent_manager,
+							auto_register_agent);
 		}
 	}
 }
@@ -531,14 +532,17 @@ static void cmd_agent(const char *arg)
 		return;
 
 	if (enable == TRUE) {
-		auto_register_agent = TRUE;
+		g_free(auto_register_agent);
+		auto_register_agent = g_strdup("");
 
 		if (agent_manager)
-			agent_register(dbus_conn, agent_manager);
+			agent_register(dbus_conn, agent_manager,
+						auto_register_agent);
 		else
 			rl_printf("Agent registration enabled\n");
 	} else {
-		auto_register_agent = FALSE;
+		g_free(auto_register_agent);
+		auto_register_agent = NULL;
 
 		if (agent_manager)
 			agent_unregister(dbus_conn, agent_manager);
@@ -1000,13 +1004,24 @@ static guint setup_signalfd(void)
 }
 
 static gboolean option_version = FALSE;
-static gboolean option_agent = FALSE;
+
+static gboolean parse_agent(const char *key, const char *value,
+					gpointer user_data, GError **error)
+{
+	if (value)
+		auto_register_agent = g_strdup(value);
+	else
+		auto_register_agent = g_strdup("");
+
+	return TRUE;
+}
 
 static GOptionEntry options[] = {
 	{ "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
 				"Show version information and exit" },
-	{ "agent", 'a', 0, G_OPTION_ARG_NONE, &option_agent,
-				"Automatically register agent handler" },
+	{ "agent", 'a', G_OPTION_FLAG_OPTIONAL_ARG,
+				G_OPTION_ARG_CALLBACK, parse_agent,
+				"Register agent handler", "CAPABILITY" },
 	{ NULL },
 };
 
@@ -1036,8 +1051,6 @@ int main(int argc, char *argv[])
 		exit(0);
 	}
 
-	auto_register_agent = option_agent;
-
 	main_loop = g_main_loop_new(NULL, FALSE);
 	dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
 
@@ -1075,5 +1088,7 @@ int main(int argc, char *argv[])
 	g_list_free_full(ctrl_list, proxy_leak);
 	g_list_free_full(dev_list, proxy_leak);
 
+	g_free(auto_register_agent);
+
 	return 0;
 }