about summary refs log tree commit diff
path: root/clients/cli/agent.c
diff options
context:
space:
mode:
Diffstat (limited to 'clients/cli/agent.c')
-rw-r--r--clients/cli/agent.c96
1 files changed, 56 insertions, 40 deletions
diff --git a/clients/cli/agent.c b/clients/cli/agent.c
index f4057df9..f3707db7 100644
--- a/clients/cli/agent.c
+++ b/clients/cli/agent.c
@@ -5,8 +5,6 @@
 
 #include "nm-default.h"
 
-#include "agent.h"
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <readline/readline.h>
@@ -16,6 +14,7 @@
 #include "utils.h"
 #include "nm-secret-agent-simple.h"
 #include "polkit-agent.h"
+#include "nm-polkit-listener.h"
 
 static void
 usage (void)
@@ -122,12 +121,12 @@ secrets_requested (NMSecretAgentSimple *agent,
 	                                 success ? secrets : NULL);
 }
 
-static NMCResultCode
-do_agent_secret (NmCli *nmc, int argc, char **argv)
+static void
+do_agent_secret (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
 {
 	next_arg (nmc, &argc, &argv, NULL);
 	if (nmc->complete)
-		return nmc->return_value;
+		return;
 
 	/* Create secret agent */
 	nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-agent");
@@ -145,76 +144,93 @@ do_agent_secret (NmCli *nmc, int argc, char **argv)
 		g_string_printf (nmc->return_text, _("Error: secret agent initialization failed"));
 		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
 	}
+}
 
-	return nmc->return_value;
+static void
+polkit_registered (gpointer instance,
+                   gpointer user_data)
+{
+	g_print (_("nmcli successfully registered as a polkit agent.\n"));
+}
+
+static void
+polkit_error (gpointer instance,
+              const char *error,
+              gpointer user_data)
+{
+	g_main_loop_quit (loop);
 }
 
-static NMCResultCode
-do_agent_polkit (NmCli *nmc, int argc, char **argv)
+static void
+do_agent_polkit (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
 {
-	GError *error = NULL;
+	gs_free_error GError *error = NULL;
 
 	next_arg (nmc, &argc, &argv, NULL);
 	if (nmc->complete)
-		return nmc->return_value;
+		return;
 
-	/* Initialize polkit agent */
 	if (!nmc_polkit_agent_init (nmc, TRUE, &error)) {
 		g_dbus_error_strip_remote_error (error);
-		g_string_printf (nmc->return_text, _("Error: polkit agent initialization failed: %s"),
+		g_string_printf (nmc->return_text,
+		                 _("Error: polkit agent initialization failed: %s"),
 		                 error->message);
 		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
-		g_error_free (error);
 	} else {
 		/* We keep running */
 		nmc->should_wait++;
-
-		g_print (_("nmcli successfully registered as a polkit agent.\n"));
+		g_signal_connect (nmc->pk_listener,
+		                  NM_POLKIT_LISTENER_SIGNAL_ERROR,
+		                  G_CALLBACK (polkit_error),
+		                  NULL);
+		g_signal_connect (nmc->pk_listener,
+		                  NM_POLKIT_LISTENER_SIGNAL_REGISTERED,
+		                  G_CALLBACK (polkit_registered),
+		                  NULL);
+
+		/* keep running */
+		nmc->should_wait++;
 	}
-
-	return nmc->return_value;
 }
 
-static NMCResultCode
-do_agent_all (NmCli *nmc, int argc, char **argv)
+static void
+do_agent_all (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
 {
-	NMCResultCode secret_res;
+	NMCResultCode r;
 
 	next_arg (nmc, &argc, &argv, NULL);
 	if (nmc->complete)
-		return nmc->return_value;
+		return;
 
 	/* Run both secret and polkit agent */
-	secret_res = do_agent_secret (nmc, argc, argv);
-	if (secret_res != NMC_RESULT_SUCCESS) {
+	do_agent_secret (cmd, nmc, argc, argv);
+	r = nmc->return_value;
+	if (r != NMC_RESULT_SUCCESS) {
 		g_printerr ("%s\n", nmc->return_text->str);
 		g_string_truncate (nmc->return_text, 0);
+		nmc->return_value = NMC_RESULT_SUCCESS;
 	}
 
-	nmc->return_value = do_agent_polkit (nmc, argc, argv);
+	do_agent_polkit (cmd, nmc, argc, argv);
 	if (nmc->return_value != NMC_RESULT_SUCCESS) {
 		g_printerr ("%s\n", nmc->return_text->str);
 		g_string_truncate (nmc->return_text, 0);
 	}
 
-	if (nmc->return_value == NMC_RESULT_SUCCESS && secret_res != NMC_RESULT_SUCCESS)
-		nmc->return_value = secret_res;
-
-	return nmc->return_value;
+	if (r != NMC_RESULT_SUCCESS)
+		nmc->return_value = r;
 }
 
-static const NMCCommand agent_cmds[] = {
-	{ "secret",  do_agent_secret,  usage_agent_secret,  TRUE,   TRUE },
-	{ "polkit",  do_agent_polkit,  usage_agent_polkit,  TRUE,   TRUE },
-	{ "all",     do_agent_all,     usage_agent_all,     TRUE,   TRUE },
-	{ NULL,      do_agent_all,     usage,               TRUE,   TRUE },
-};
-
-NMCResultCode
-do_agent (NmCli *nmc, int argc, char **argv)
+void
+nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv)
 {
-	next_arg (nmc, &argc, &argv, NULL);
-	nmc_do_cmd (nmc, agent_cmds, *argv, argc, argv);
+	static const NMCCommand cmds[] = {
+		{ "secret", do_agent_secret, usage_agent_secret, TRUE, TRUE },
+		{ "polkit", do_agent_polkit, usage_agent_polkit, TRUE, TRUE },
+		{ "all",    do_agent_all,    usage_agent_all,    TRUE, TRUE },
+		{ NULL,     do_agent_all,    usage,              TRUE, TRUE },
+	};
 
-	return nmc->return_value;
+	next_arg (nmc, &argc, &argv, NULL);
+	nmc_do_cmd (nmc, cmds, *argv, argc, argv);
 }