summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-09-05 15:19:33 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-09-17 09:31:34 +0200
commit07e838567e7d7ae3fc5da9a7cd6902c34763f269 (patch)
tree0d23b1cc326c8ad957a66d1657bde2112b33e4c5
parentc1c970f1b180bc17422e61fc0d1b02addc3167fd (diff)
downloadNetworkManager-07e838567e7d7ae3fc5da9a7cd6902c34763f269.tar.gz
libnm: add nm_client_reload()
Introduce libnm API to reload NM configuration through the Reload() D-Bus method.
-rw-r--r--libnm/libnm.ver2
-rw-r--r--libnm/nm-client.c82
-rw-r--r--libnm/nm-client.h11
-rw-r--r--libnm/nm-manager.c58
-rw-r--r--libnm/nm-manager.h9
5 files changed, 162 insertions, 0 deletions
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__ */