From 9d15ae640d9df6e7b01b10db6b4825c4a51c3bc3 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 29 Apr 2021 18:01:12 +0200 Subject: [PATCH] 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) --- clients/cli/general.c | 55 +++++++++++++++++++++++++++---------------- 1 file 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" @@ -599,15 +600,31 @@ show_nm_permissions(NmCli *nmc) return TRUE; } +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