summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-03-23 13:07:37 +0100
committerThomas Haller <thaller@redhat.com>2023-03-23 13:07:37 +0100
commit5bee60bb813f8dab5885f6f5b6704bf8cf336d0e (patch)
tree25bd6ce5e18d4abde3850641c5a99104e441c60e
parent2805ddcbcc23c4e97abad2028b670b5626704ace (diff)
parenta6f5dbb426a9fa76cc2914d0cb685d98369bbce7 (diff)
downloadNetworkManager-5bee60bb813f8dab5885f6f5b6704bf8cf336d0e.tar.gz
core: merge branch 'th/dbus-request-name-later'
https://bugzilla.redhat.com/show_bug.cgi?id=2175919 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1560
-rw-r--r--src/core/main.c16
-rw-r--r--src/core/nm-dbus-manager.c81
-rw-r--r--src/core/nm-dbus-manager.h4
3 files changed, 62 insertions, 39 deletions
diff --git a/src/core/main.c b/src/core/main.c
index 2eb230d9ca..4c7de6cd37 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -266,13 +266,14 @@ _dbus_manager_init(NMConfig *config)
c_a_q_type = nm_config_get_configure_and_quit(config);
- if (c_a_q_type == NM_CONFIG_CONFIGURE_AND_QUIT_DISABLED)
- return nm_dbus_manager_acquire_bus(busmgr, TRUE);
+ if (c_a_q_type == NM_CONFIG_CONFIGURE_AND_QUIT_INITRD) {
+ /* in initrd we don't have D-Bus at all. Don't even try to get the G_BUS_TYPE_SYSTEM
+ * connection. And of course don't claim the D-Bus name. */
+ return TRUE;
+ }
- nm_assert(c_a_q_type == NM_CONFIG_CONFIGURE_AND_QUIT_INITRD);
- /* in initrd we don't have D-Bus at all. Don't even try to get the G_BUS_TYPE_SYSTEM
- * connection. And of course don't claim the D-Bus name. */
- return TRUE;
+ nm_assert(c_a_q_type == NM_CONFIG_CONFIGURE_AND_QUIT_DISABLED);
+ return nm_dbus_manager_setup(busmgr);
}
/*
@@ -507,6 +508,9 @@ main(int argc, char *argv[])
nm_log_dbg(LOGD_CORE, "setting up local loopback");
nm_platform_link_change_flags(NM_PLATFORM_GET, 1, IFF_UP, TRUE);
+ if (!nm_dbus_manager_request_name_sync(nm_dbus_manager_get()))
+ goto done;
+
success = TRUE;
if (configure_and_quit == FALSE) {
diff --git a/src/core/nm-dbus-manager.c b/src/core/nm-dbus-manager.c
index af7de8c458..0bde5971d8 100644
--- a/src/core/nm-dbus-manager.c
+++ b/src/core/nm-dbus-manager.c
@@ -1410,48 +1410,23 @@ nm_dbus_manager_start(NMDBusManager *self,
}
gboolean
-nm_dbus_manager_acquire_bus(NMDBusManager *self, gboolean request_name)
+nm_dbus_manager_request_name_sync(NMDBusManager *self)
{
NMDBusManagerPrivate *priv;
gs_free_error GError *error = NULL;
gs_unref_variant GVariant *ret = NULL;
guint32 result;
- guint registration_id;
g_return_val_if_fail(NM_IS_DBUS_MANAGER(self), FALSE);
priv = NM_DBUS_MANAGER_GET_PRIVATE(self);
- /* Create the D-Bus connection and registering the name synchronously.
- * That is necessary because we need to exit right away if we can't
- * acquire the name despite connecting to the bus successfully.
- * It means that something is gravely broken -- such as another NetworkManager
- * instance running. */
- priv->main_dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
- if (!priv->main_dbus_connection) {
- _LOGE("cannot connect to D-Bus: %s", error->message);
- return FALSE;
- }
-
- g_dbus_connection_set_exit_on_close(priv->main_dbus_connection, FALSE);
-
- if (!request_name) {
- _LOGD("D-Bus connection created");
+ if (priv->objmgr_registration_id == 0) {
+ /* Do nothing. We're presumably in the configure-and-quit mode. */
return TRUE;
}
- registration_id = g_dbus_connection_register_object(
- priv->main_dbus_connection,
- OBJECT_MANAGER_SERVER_BASE_PATH,
- NM_UNCONST_PTR(GDBusInterfaceInfo, &interface_info_objmgr),
- &dbus_vtable_objmgr,
- self,
- NULL,
- &error);
- if (!registration_id) {
- _LOGE("failure to register object manager: %s", error->message);
- return FALSE;
- }
+ g_return_val_if_fail(G_IS_DBUS_CONNECTION(priv->main_dbus_connection), FALSE);
ret = g_dbus_connection_call_sync(
priv->main_dbus_connection,
@@ -1465,12 +1440,12 @@ nm_dbus_manager_acquire_bus(NMDBusManager *self, gboolean request_name)
-1,
NULL,
&error);
+
if (!ret) {
_LOGE("fatal failure to acquire D-Bus service \"%s"
": %s",
NM_DBUS_SERVICE,
error->message);
- g_dbus_connection_unregister_object(priv->main_dbus_connection, registration_id);
return FALSE;
}
@@ -1479,13 +1454,55 @@ nm_dbus_manager_acquire_bus(NMDBusManager *self, gboolean request_name)
_LOGE("fatal failure to acquire D-Bus service \"%s\" (%u). Service already taken",
NM_DBUS_SERVICE,
(guint) result);
- g_dbus_connection_unregister_object(priv->main_dbus_connection, registration_id);
+ return FALSE;
+ }
+
+ _LOGI("acquired D-Bus service \"%s\"", NM_DBUS_SERVICE);
+ return TRUE;
+}
+
+gboolean
+nm_dbus_manager_setup(NMDBusManager *self)
+{
+ NMDBusManagerPrivate *priv;
+ gs_free_error GError *error = NULL;
+ guint registration_id;
+
+ g_return_val_if_fail(NM_IS_DBUS_MANAGER(self), FALSE);
+
+ priv = NM_DBUS_MANAGER_GET_PRIVATE(self);
+
+ g_return_val_if_fail(!priv->main_dbus_connection, FALSE);
+
+ /* Create the D-Bus connection and registering the name synchronously.
+ * That is necessary because we need to exit right away if we can't
+ * acquire the name despite connecting to the bus successfully.
+ * It means that something is gravely broken -- such as another NetworkManager
+ * instance running. */
+ priv->main_dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (!priv->main_dbus_connection) {
+ _LOGE("cannot connect to D-Bus: %s", error->message);
+ return FALSE;
+ }
+
+ g_dbus_connection_set_exit_on_close(priv->main_dbus_connection, FALSE);
+
+ registration_id = g_dbus_connection_register_object(
+ priv->main_dbus_connection,
+ OBJECT_MANAGER_SERVER_BASE_PATH,
+ NM_UNCONST_PTR(GDBusInterfaceInfo, &interface_info_objmgr),
+ &dbus_vtable_objmgr,
+ self,
+ NULL,
+ &error);
+ if (!registration_id) {
+ _LOGE("failure to register object manager: %s", error->message);
return FALSE;
}
priv->objmgr_registration_id = registration_id;
- _LOGI("acquired D-Bus service \"%s\"", NM_DBUS_SERVICE);
+ _LOGD("D-Bus connection created and ObjectManager object registered");
return TRUE;
}
diff --git a/src/core/nm-dbus-manager.h b/src/core/nm-dbus-manager.h
index b68161db88..078dbdd203 100644
--- a/src/core/nm-dbus-manager.h
+++ b/src/core/nm-dbus-manager.h
@@ -37,7 +37,9 @@ typedef void (*NMDBusManagerSetPropertyHandler)(NMDBusObject
GVariant *value,
gpointer user_data);
-gboolean nm_dbus_manager_acquire_bus(NMDBusManager *self, gboolean request_name);
+gboolean nm_dbus_manager_setup(NMDBusManager *self);
+
+gboolean nm_dbus_manager_request_name_sync(NMDBusManager *self);
GDBusConnection *nm_dbus_manager_get_dbus_connection(NMDBusManager *self);