diff options
Diffstat (limited to 'libnm/nm-client.c')
| -rw-r--r-- | libnm/nm-client.c | 77 |
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); |