summary refs log tree commit diff
path: root/libnm/nm-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm/nm-client.c')
-rw-r--r--libnm/nm-client.c77
1 files changed, 40 insertions, 37 deletions
diff --git a/libnm/nm-client.c b/libnm/nm-client.c
index 47f1548e..2a91c2ff 100644
--- a/libnm/nm-client.c
+++ b/libnm/nm-client.c
@@ -92,6 +92,13 @@ G_DEFINE_TYPE_WITH_CODE (NMClient, nm_client, G_TYPE_OBJECT,
 #define NM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CLIENT, NMClientPrivate))
 
 typedef struct {
+	NMClient *client;
+	GCancellable *cancellable;
+	GSimpleAsyncResult *result;
+	int pending_init;
+} NMClientInitData;
+
+typedef struct {
 	NMManager *manager;
 	NMRemoteSettings *settings;
 	NMDnsManager *dns_manager;
@@ -2268,12 +2275,22 @@ objects_created (NMClient *client, GDBusObjectManager *object_manager, GError **
 static void name_owner_changed (GObject *object, GParamSpec *pspec, gpointer user_data);
 
 static gboolean
+_om_has_name_owner (GDBusObjectManager *object_manager)
+{
+	gs_free char *name_owner = NULL;
+
+	nm_assert (G_IS_DBUS_OBJECT_MANAGER_CLIENT (object_manager));
+
+	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (object_manager));
+	return !!name_owner;
+}
+
+static gboolean
 init_sync (GInitable *initable, GCancellable *cancellable, GError **error)
 {
 	NMClient *client = NM_CLIENT (initable);
 	NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client);
 	GList *objects, *iter;
-	gchar *name_owner;
 
 	priv->object_manager = g_dbus_object_manager_client_new_for_bus_sync (_nm_dbus_bus_type (),
 	                                                                      G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START,
@@ -2285,9 +2302,7 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error)
 	if (!priv->object_manager)
 		return FALSE;
 
-	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (priv->object_manager));
-	if (name_owner) {
-		g_free (name_owner);
+	if (_om_has_name_owner (priv->object_manager)) {
 		if (!objects_created (client, priv->object_manager, error))
 			return FALSE;
 
@@ -2316,16 +2331,11 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error)
 
 /* Asynchronous initialization. */
 
-typedef struct {
-	NMClient *client;
-	GCancellable *cancellable;
-	GSimpleAsyncResult *result;
-	int pending_init;
-} NMClientInitData;
-
 static void
 init_async_complete (NMClientInitData *init_data)
 {
+	if (init_data->pending_init > 0)
+		return;
 	g_simple_async_result_complete (init_data->result);
 	g_object_unref (init_data->result);
 	g_clear_object (&init_data->cancellable);
@@ -2338,14 +2348,13 @@ async_inited_obj_nm (GObject *object, GAsyncResult *result, gpointer user_data)
 	NMClientInitData *init_data = user_data;
 	GError *error = NULL;
 
+	nm_assert (init_data && init_data->pending_init > 0);
+
 	if (!g_async_initable_init_finish (G_ASYNC_INITABLE (object), result, &error))
 		g_simple_async_result_take_error (init_data->result, error);
 
-	if (init_data) {
-		init_data->pending_init--;
-		if (init_data->pending_init == 0)
-			init_async_complete (init_data);
-	}
+	init_data->pending_init--;
+	init_async_complete (init_data);
 }
 
 static void
@@ -2405,10 +2414,11 @@ unhook_om (NMClient *self)
 static void
 new_object_manager (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
-	NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (source_object);
+	NMClient *self = NM_CLIENT (user_data);
+	NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (self);
 
-	g_object_notify (G_OBJECT (user_data), NM_CLIENT_NM_RUNNING);
 	g_clear_object (&priv->new_object_manager_cancellable);
+	g_object_notify (G_OBJECT (user_data), NM_CLIENT_NM_RUNNING);
 }
 
 static void
@@ -2418,16 +2428,13 @@ got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data)
 	NMClient *client;
 	NMClientPrivate *priv;
 	GList *objects, *iter;
-	gchar *name_owner;
 	GError *error = NULL;
 	GDBusObjectManager *object_manager;
 
 	object_manager = g_dbus_object_manager_client_new_for_bus_finish (result, &error);
 	if (object_manager == NULL) {
-		if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
-			g_simple_async_result_take_error (init_data->result, error);
-			init_async_complete (init_data);
-		}
+		g_simple_async_result_take_error (init_data->result, error);
+		init_async_complete (init_data);
 		return;
 	}
 
@@ -2435,9 +2442,7 @@ got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data)
 	priv = NM_CLIENT_GET_PRIVATE (client);
 	priv->object_manager = object_manager;
 
-	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (priv->object_manager));
-	if (name_owner) {
-		g_free (name_owner);
+	if (_om_has_name_owner (priv->object_manager)) {
 		if (!objects_created (client, priv->object_manager, &error)) {
 			g_simple_async_result_take_error (init_data->result, error);
 			init_async_complete (init_data);
@@ -2458,9 +2463,9 @@ got_object_manager (GObject *object, GAsyncResult *result, gpointer user_data)
 			                             async_inited_obj_nm, init_data);
 		}
 		g_list_free_full (objects, g_object_unref);
+	}
 
-	} else
-		init_async_complete (init_data);
+	init_async_complete (init_data);
 
 	g_signal_connect (priv->object_manager, "notify::name-owner",
 	                  G_CALLBACK (name_owner_changed), client);
@@ -2497,17 +2502,15 @@ name_owner_changed (GObject *object, GParamSpec *pspec, gpointer user_data)
 	NMClient *self = user_data;
 	NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (self);
 	GDBusObjectManager *object_manager = G_DBUS_OBJECT_MANAGER (object);
-	gchar *name_owner;
-
-	name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (object));
-	if (name_owner) {
-		g_free (name_owner);
-		g_object_unref (object_manager);
-		if (priv->new_object_manager_cancellable)
-			g_cancellable_cancel (priv->new_object_manager_cancellable);
+
+	nm_assert (object_manager == priv->object_manager);
+
+	if (_om_has_name_owner (object_manager)) {
+		g_clear_object (&priv->object_manager);
+		nm_clear_g_cancellable (&priv->new_object_manager_cancellable);
 		priv->new_object_manager_cancellable = g_cancellable_new ();
 		prepare_object_manager (self, priv->new_object_manager_cancellable,
-		                        new_object_manager, user_data);
+		                        new_object_manager, self);
 	} else {
 		g_signal_handlers_disconnect_by_func (object_manager, object_added, self);
 		unhook_om (self);