Thomas Haller 2023-03-23 13:07:37 +01:00
commit 5bee60bb81
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
3 changed files with 68 additions and 45 deletions

View file

@ -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) {

View file

@ -1410,18 +1410,70 @@ 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);
if (priv->objmgr_registration_id == 0) {
/* Do nothing. We're presumably in the configure-and-quit mode. */
return TRUE;
}
g_return_val_if_fail(G_IS_DBUS_CONNECTION(priv->main_dbus_connection), FALSE);
ret = g_dbus_connection_call_sync(
priv->main_dbus_connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS,
"RequestName",
g_variant_new("(su)", NM_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE),
G_VARIANT_TYPE("(u)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (!ret) {
_LOGE("fatal failure to acquire D-Bus service \"%s"
": %s",
NM_DBUS_SERVICE,
error->message);
return FALSE;
}
g_variant_get(ret, "(u)", &result);
if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
_LOGE("fatal failure to acquire D-Bus service \"%s\" (%u). Service already taken",
NM_DBUS_SERVICE,
(guint) result);
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.
@ -1435,11 +1487,6 @@ nm_dbus_manager_acquire_bus(NMDBusManager *self, gboolean request_name)
g_dbus_connection_set_exit_on_close(priv->main_dbus_connection, FALSE);
if (!request_name) {
_LOGD("D-Bus connection created");
return TRUE;
}
registration_id = g_dbus_connection_register_object(
priv->main_dbus_connection,
OBJECT_MANAGER_SERVER_BASE_PATH,
@ -1453,39 +1500,9 @@ nm_dbus_manager_acquire_bus(NMDBusManager *self, gboolean request_name)
return FALSE;
}
ret = g_dbus_connection_call_sync(
priv->main_dbus_connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS,
"RequestName",
g_variant_new("(su)", NM_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE),
G_VARIANT_TYPE("(u)"),
G_DBUS_CALL_FLAGS_NONE,
-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;
}
g_variant_get(ret, "(u)", &result);
if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
_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;
}
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;
}

View file

@ -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);