summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2021-04-29 18:01:12 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2021-06-10 18:09:03 +0200
commit9d15ae640d9df6e7b01b10db6b4825c4a51c3bc3 (patch)
tree1cbfefc2d283cbabf50c14d91771a71de0a1ba35
parentecda9fb41a233f938af5b05d761fcfadeaa9fb2b (diff)
downloadNetworkManager-9d15ae640d9df6e7b01b10db6b4825c4a51c3bc3.tar.gz
nmcli: invoke Reload() D-Bus method asynchronously
Invoke Reload() asynchronously and run the main loop. In this way, the polkit agent built into nmcli can be used to authenticate the reload request. Fixes: 5afcf9c045ad ('cli: add 'general reload' command') (cherry picked from commit 1d82c39bfa8e1a1495713988afc7ec62c0bb2714)
-rw-r--r--clients/cli/general.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/clients/cli/general.c b/clients/cli/general.c
index 4404ff05f7..b1182709f7 100644
--- a/clients/cli/general.c
+++ b/clients/cli/general.c
@@ -10,6 +10,7 @@
#include "nm-libnm-core-intern/nm-common-macros.h"
#include "nm-client-utils.h"
+#include "nm-glib-aux/nm-dbus-aux.h"
#include "polkit-agent.h"
#include "utils.h"
@@ -600,14 +601,30 @@ show_nm_permissions(NmCli *nmc)
}
static void
+reload_cb(GObject *source, GAsyncResult *result, gpointer user_data)
+{
+ NmCli * nmc = user_data;
+ gs_free_error GError *error = NULL;
+ gs_unref_variant GVariant *ret = NULL;
+
+ ret = nm_dbus_call_finish(result, &error);
+ if (error) {
+ g_string_printf(nmc->return_text,
+ _("Error: failed to reload: %s"),
+ nmc_error_get_simple_message(error));
+ nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+ }
+
+ quit();
+}
+
+static void
do_general_reload(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const *argv)
{
- gs_unref_variant GVariant *result = NULL;
- gs_free_error GError *error = NULL;
- gs_free const char ** values = NULL;
- gs_free char * err_token = NULL;
- gs_free char * joined = NULL;
- int flags = 0;
+ gs_free const char **values = NULL;
+ gs_free char * err_token = NULL;
+ gs_free char * joined = NULL;
+ int flags = 0;
next_arg(nmc, &argc, &argv, NULL);
@@ -650,20 +667,18 @@ do_general_reload(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const
return;
}
- result = nmc_dbus_call_sync(nmc,
- "/org/freedesktop/NetworkManager",
- "org.freedesktop.NetworkManager",
- "Reload",
- g_variant_new("(u)", flags),
- G_VARIANT_TYPE("()"),
- &error);
-
- if (error) {
- g_string_printf(nmc->return_text,
- _("Error: failed to reload: %s"),
- nmc_error_get_simple_message(error));
- nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
- }
+ nmc->should_wait++;
+ nm_dbus_call(G_BUS_TYPE_SYSTEM,
+ NM_DBUS_SERVICE,
+ NM_DBUS_PATH,
+ NM_DBUS_INTERFACE,
+ "Reload",
+ g_variant_new("(u)", flags),
+ G_VARIANT_TYPE("()"),
+ NULL,
+ (nmc->timeout == -1 ? 90 : nmc->timeout) * 1000,
+ reload_cb,
+ nmc);
}
static void