summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-04-21 21:22:05 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-04-23 17:21:13 +0200
commit4672499b95083d2f4b38ec9f409d72c74ade2902 (patch)
tree11dc1b6e6260cbcfd381d6197262efa02a294b76
parent0498c5487fe29ffddc93955faa159a8c99790c90 (diff)
downloadNetworkManager-4672499b95083d2f4b38ec9f409d72c74ade2902.tar.gz
core: fix bus initialization order
We currently start the bus manager only after the creation of a NMManager because the NMManager is needed to handle set-property bus calls. However, objects created by NMManager (e.g. NMDnsSystemdResolved) need a bus connection and so their initialization currently fail. To fix this, split nm_dbus_manager_start() in two parts: first only create the connection and acquire the bus. After this step the NMManager can be set up. In the second step, set NMManager as the set-property handler and start exporting objects on the bus. Fixes: 297d4985abcc7b571b8c090ee90622357fc60e16
-rw-r--r--src/main.c14
-rw-r--r--src/nm-dbus-manager.c35
-rw-r--r--src/nm-dbus-manager.h8
3 files changed, 36 insertions, 21 deletions
diff --git a/src/main.c b/src/main.c
index bd8e26a556..b3f9f40ee6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -225,7 +225,7 @@ int
main (int argc, char *argv[])
{
gboolean success = FALSE;
- NMManager *manager;
+ NMManager *manager = NULL;
NMConfig *config;
GError *error = NULL;
gboolean wrote_pidfile = FALSE;
@@ -395,12 +395,13 @@ main (int argc, char *argv[])
NM_CONFIG_KEYFILE_KEY_MAIN_AUTH_POLKIT,
NM_CONFIG_DEFAULT_MAIN_AUTH_POLKIT_BOOL));
- manager = nm_manager_setup ();
+ if (!nm_dbus_manager_acquire_bus (nm_dbus_manager_get ()))
+ goto done_no_manager;
- if (!nm_dbus_manager_start (nm_dbus_manager_get (),
- nm_manager_dbus_set_property_handle,
- manager))
- goto done;
+ manager = nm_manager_setup ();
+ nm_dbus_manager_start (nm_dbus_manager_get(),
+ nm_manager_dbus_set_property_handle,
+ manager);
nm_dispatcher_init ();
@@ -453,6 +454,7 @@ done:
nm_dns_manager_stop (nm_dns_manager_get ());
+done_no_manager:
if (global_opt.pidfile && wrote_pidfile)
unlink (global_opt.pidfile);
diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c
index 65c74d3227..060ae81d83 100644
--- a/src/nm-dbus-manager.c
+++ b/src/nm-dbus-manager.c
@@ -83,6 +83,7 @@ typedef struct {
GDBusConnection *connection;
GDBusProxy *proxy;
guint objmgr_registration_id;
+ gboolean started;
} NMDBusManagerPrivate;
struct _NMDBusManager {
@@ -930,6 +931,7 @@ _obj_register (NMDBusManager *self,
nm_assert (c_list_is_empty (&obj->internal.registration_lst_head));
nm_assert (priv->connection);
+ nm_assert (priv->started);
n_klasses = 0;
gtype = G_OBJECT_TYPE (obj);
@@ -1107,7 +1109,7 @@ _nm_dbus_manager_obj_export (NMDBusObject *obj)
nm_assert_not_reached ();
c_list_link_tail (&priv->objects_lst_head, &obj->internal.objects_lst);
- if (priv->connection)
+ if (priv->connection && priv->started)
_obj_register (self, obj);
}
@@ -1306,7 +1308,7 @@ _nm_dbus_manager_obj_emit_signal (NMDBusObject *obj,
self = obj->internal.bus_manager;
priv = NM_DBUS_MANAGER_GET_PRIVATE (self);
- if (!priv->connection) {
+ if (!priv->connection || !priv->started) {
nm_g_variant_unref_floating (args);
return;
}
@@ -1453,29 +1455,41 @@ static const GDBusInterfaceInfo interface_info_objmgr = NM_DEFINE_GDBUS_INTERFAC
/*****************************************************************************/
-gboolean
+void
nm_dbus_manager_start (NMDBusManager *self,
NMDBusManagerSetPropertyHandler set_property_handler,
gpointer set_property_handler_data)
{
NMDBusManagerPrivate *priv;
+ NMDBusObject *obj;
+
+ g_return_if_fail (NM_IS_DBUS_MANAGER (self));
+ priv = NM_DBUS_MANAGER_GET_PRIVATE (self);
+ g_return_if_fail (priv->connection);
+
+ priv->set_property_handler = set_property_handler;
+ priv->set_property_handler_data = set_property_handler_data;
+ priv->started = TRUE;
+
+ c_list_for_each_entry (obj, &priv->objects_lst_head, internal.objects_lst)
+ _obj_register (self, obj);
+}
+
+gboolean
+nm_dbus_manager_acquire_bus (NMDBusManager *self)
+{
+ NMDBusManagerPrivate *priv;
gs_free_error GError *error = NULL;
gs_unref_variant GVariant *ret = NULL;
gs_unref_object GDBusConnection *connection = NULL;
gs_unref_object GDBusProxy *proxy = NULL;
guint32 result;
guint registration_id;
- NMDBusObject *obj;
g_return_val_if_fail (NM_IS_DBUS_MANAGER (self), FALSE);
priv = NM_DBUS_MANAGER_GET_PRIVATE (self);
- priv->set_property_handler = set_property_handler;
- priv->set_property_handler_data = set_property_handler_data;
-
- g_return_val_if_fail (!priv->connection, FALSE);
-
/* we will create the D-Bus connection and registering the name synchronously.
* The reason why that is necessary is because:
* (1) if we are unable to create a D-Bus connection, it means D-Bus is not
@@ -1557,9 +1571,6 @@ nm_dbus_manager_start (NMDBusManager *self,
_LOGI ("acquired D-Bus service \"%s\"", NM_DBUS_SERVICE);
- c_list_for_each_entry (obj, &priv->objects_lst_head, internal.objects_lst)
- _obj_register (self, obj);
-
return TRUE;
}
diff --git a/src/nm-dbus-manager.h b/src/nm-dbus-manager.h
index 617f8a674c..cacda966f6 100644
--- a/src/nm-dbus-manager.h
+++ b/src/nm-dbus-manager.h
@@ -49,9 +49,11 @@ typedef void (*NMDBusManagerSetPropertyHandler) (NMDBusObject *obj,
GVariant *value,
gpointer user_data);
-gboolean nm_dbus_manager_start (NMDBusManager *self,
- NMDBusManagerSetPropertyHandler handler,
- gpointer handler_data);
+gboolean nm_dbus_manager_acquire_bus (NMDBusManager *self);
+
+void nm_dbus_manager_start (NMDBusManager *self,
+ NMDBusManagerSetPropertyHandler set_property_handler,
+ gpointer set_property_handler_data);
GDBusConnection *nm_dbus_manager_get_connection (NMDBusManager *self);