From 07e838567e7d7ae3fc5da9a7cd6902c34763f269 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 5 Sep 2019 15:19:33 +0200 Subject: libnm: add nm_client_reload() Introduce libnm API to reload NM configuration through the Reload() D-Bus method. --- libnm/libnm.ver | 2 ++ libnm/nm-client.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ libnm/nm-client.h | 11 ++++++++ libnm/nm-manager.c | 58 ++++++++++++++++++++++++++++++++++++++ libnm/nm-manager.h | 9 ++++++ 5 files changed, 162 insertions(+) diff --git a/libnm/libnm.ver b/libnm/libnm.ver index 4f2fce6d8c..e9a69d6881 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -1631,6 +1631,8 @@ global: libnm_1_22_0 { global: + nm_client_reload; + nm_client_reload_finish; nm_manager_reload_flags_get_type; nm_setting_gsm_get_auto_config; } libnm_1_20_0; diff --git a/libnm/nm-client.c b/libnm/nm-client.c index d744406bb9..26bf91f5fa 100644 --- a/libnm/nm-client.c +++ b/libnm/nm-client.c @@ -2737,6 +2737,88 @@ nm_client_checkpoint_adjust_rollback_timeout_finish (NMClient *client, error); } +static void +reload_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gs_unref_object GSimpleAsyncResult *simple = user_data; + GError *error = NULL; + + if (nm_manager_reload_finish (NM_MANAGER (object), result, &error)) + g_simple_async_result_set_op_res_gboolean (simple, TRUE); + else + g_simple_async_result_take_error (simple, error); + + g_simple_async_result_complete (simple); +} + +/** + * nm_client_reload: + * @client: the %NMClient + * @flags: flags indicating what to reload. + * @cancellable: a #GCancellable, or %NULL + * @callback: (scope async): callback to be called when the add operation completes + * @user_data: (closure): caller-specific data passed to @callback + * + * Reload NetworkManager's configuration and perform certain updates, like + * flushing caches or rewriting external state to disk. This is similar to + * sending SIGHUP to NetworkManager but it allows for more fine-grained control + * over what to reload (see @flags). It also allows non-root access via + * PolicyKit and contrary to signals it is synchronous. + * + * Since: 1.22 + **/ +void +nm_client_reload (NMClient *client, + NMManagerReloadFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (NM_IS_CLIENT (client)); + + if (!_nm_client_check_nm_running (client, &error)) { + g_simple_async_report_take_gerror_in_idle (G_OBJECT (client), callback, user_data, error); + return; + } + + simple = g_simple_async_result_new (G_OBJECT (client), callback, user_data, + nm_client_reload); + if (cancellable) + g_simple_async_result_set_check_cancellable (simple, cancellable); + nm_manager_reload (NM_CLIENT_GET_PRIVATE (client)->manager, + flags, + cancellable, reload_cb, simple); +} + +/** + * nm_client_reload_finish: + * @client: an #NMClient + * @result: the result passed to the #GAsyncReadyCallback + * @error: location for a #GError, or %NULL + * + * Gets the result of a call to nm_client_reload(). + * + * Returns: %TRUE on success or %FALSE on failure. + * + * Since: 1.22 + **/ +gboolean +nm_client_reload_finish (NMClient *client, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); + + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), + error); +} + /****************************************************************/ /* Object Initialization */ /****************************************************************/ diff --git a/libnm/nm-client.h b/libnm/nm-client.h index 4989800547..f8ffd52508 100644 --- a/libnm/nm-client.h +++ b/libnm/nm-client.h @@ -475,6 +475,17 @@ gboolean nm_client_checkpoint_adjust_rollback_timeout_finish (NMClient *client, GAsyncResult *result, GError **error); +NM_AVAILABLE_IN_1_22 +void nm_client_reload (NMClient *client, + NMManagerReloadFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +NM_AVAILABLE_IN_1_22 +gboolean nm_client_reload_finish (NMClient *client, + GAsyncResult *result, + GError **error); + G_END_DECLS #endif /* __NM_CLIENT_H__ */ diff --git a/libnm/nm-manager.c b/libnm/nm-manager.c index de1fa04e40..b4111cd040 100644 --- a/libnm/nm-manager.c +++ b/libnm/nm-manager.c @@ -1684,6 +1684,64 @@ nm_manager_checkpoint_adjust_rollback_timeout_finish (NMManager *manager, return !g_simple_async_result_propagate_error (simple, error); } +static void +reload_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gs_unref_object GSimpleAsyncResult *simple = user_data; + GError *error = NULL; + + if (nmdbus_manager_call_reload_finish (NMDBUS_MANAGER (object), + result, + &error)) + g_simple_async_result_set_op_res_gboolean (simple, TRUE); + else { + g_dbus_error_strip_remote_error (error); + g_simple_async_result_take_error (simple, error); + } + g_simple_async_result_complete (simple); +} + +void +nm_manager_reload (NMManager *manager, + NMManagerReloadFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (NM_IS_MANAGER (manager)); + + simple = g_simple_async_result_new (G_OBJECT (manager), callback, user_data, + nm_manager_reload); + if (cancellable) + g_simple_async_result_set_check_cancellable (simple, cancellable); + + nmdbus_manager_call_reload (NM_MANAGER_GET_PRIVATE (manager)->proxy, + flags, + cancellable, + reload_cb, + simple); + +} + +gboolean +nm_manager_reload_finish (NMManager *manager, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (manager), + nm_manager_reload), + FALSE); + + simple = G_SIMPLE_ASYNC_RESULT (result); + return !g_simple_async_result_propagate_error (simple, error); +} + /*****************************************************************************/ static void diff --git a/libnm/nm-manager.h b/libnm/nm-manager.h index 0970c2e382..9bbbe53af4 100644 --- a/libnm/nm-manager.h +++ b/libnm/nm-manager.h @@ -224,4 +224,13 @@ void _nm_activate_result_free (_NMActivateResult *result); /*****************************************************************************/ +void nm_manager_reload (NMManager *manager, + NMManagerReloadFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean nm_manager_reload_finish (NMManager *manager, + GAsyncResult *result, + GError **error); + #endif /* __NM_MANAGER_H__ */ -- cgit v1.2.1