diff options
author | Ray Strode <rstrode@redhat.com> | 2016-08-25 10:36:13 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2016-08-29 12:25:52 -0400 |
commit | 957e75ef48f2131b9421e1b19cdf3da1db773ca5 (patch) | |
tree | e148a5a85460c7253bbcaabf1535c91ed7e040b5 | |
parent | c3c6ece1ad5b477ea22e2027245c191de504f852 (diff) | |
download | gdm-957e75ef48f2131b9421e1b19cdf3da1db773ca5.tar.gz |
gdm-{x,wayland}-session: drop dependency on DBUS_SESSION_BUS_ADDRESS
DBUS_SESSION_BUS_ADDRESS is not the preferred way to find the session
bus these days. Instead it's expected to be found at $XDG_RUNTIME_DIR/bus
This commit changes the session launcher code, to just try to get a
connection to the bus explicitly, instead relying on
the presence of DBUS_SESSION_BUS_ADDRESS to know whether to start a
fallback bus.
https://bugzilla.gnome.org/show_bug.cgi?id=770395
-rw-r--r-- | daemon/gdm-wayland-session.c | 15 | ||||
-rw-r--r-- | daemon/gdm-x-session.c | 55 |
2 files changed, 42 insertions, 28 deletions
diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c index 8592fa7b..6f77741d 100644 --- a/daemon/gdm-wayland-session.c +++ b/daemon/gdm-wayland-session.c @@ -89,13 +89,13 @@ static gboolean spawn_bus (State *state, GCancellable *cancellable) { + GDBusConnection *bus_connection = NULL; GPtrArray *arguments = NULL; GSubprocessLauncher *launcher = NULL; GSubprocess *subprocess = NULL; GInputStream *input_stream = NULL; GDataInputStream *data_stream = NULL; GError *error = NULL; - const char *bus_env = NULL; char *bus_address_fd_string = NULL; char *bus_address = NULL; gsize bus_address_size; @@ -106,10 +106,13 @@ spawn_bus (State *state, g_debug ("Running session message bus"); - bus_env = g_getenv ("DBUS_SESSION_BUS_ADDRESS"); - if (bus_env != NULL) { + bus_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + cancellable, + NULL); + + if (bus_connection != NULL) { g_debug ("session message bus already running, not starting another one"); - state->bus_address = g_strdup (bus_env); + g_clear_object (&bus_connection); return TRUE; } @@ -241,7 +244,9 @@ spawn_session (State *state, } launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_NONE); - g_subprocess_launcher_setenv (launcher, "DBUS_SESSION_BUS_ADDRESS", state->bus_address, TRUE); + if (state->bus_address != NULL) { + g_subprocess_launcher_setenv (launcher, "DBUS_SESSION_BUS_ADDRESS", state->bus_address, TRUE); + } subprocess = g_subprocess_launcher_spawnv (launcher, (const char * const *) argv, &error); diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c index eac1dab2..d0a00cad 100644 --- a/daemon/gdm-x-session.c +++ b/daemon/gdm-x-session.c @@ -49,8 +49,9 @@ typedef struct char *auth_file; char *display_name; - GSubprocess *bus_subprocess; - char *bus_address; + GSubprocess *bus_subprocess; + GDBusConnection *bus_connection; + char *bus_address; GSubprocess *session_subprocess; char *session_command; @@ -373,30 +374,16 @@ static gboolean update_bus_environment (State *state, GCancellable *cancellable) { - GDBusConnection *connection = NULL; GVariantBuilder builder; GVariant *reply = NULL; GError *error = NULL; gboolean environment_updated = FALSE; - connection = g_dbus_connection_new_for_address_sync (state->bus_address, - G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | - G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, - NULL, - cancellable, - &error); - - if (connection == NULL) { - g_debug ("could not open connection to session bus: %s", - error->message); - goto out; - } - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}")); g_variant_builder_add (&builder, "{ss}", "DISPLAY", state->display_name); g_variant_builder_add (&builder, "{ss}", "XAUTHORITY", state->auth_file); - reply = g_dbus_connection_call_sync (connection, + reply = g_dbus_connection_call_sync (state->bus_connection, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", @@ -417,7 +404,6 @@ update_bus_environment (State *state, environment_updated = TRUE; out: - g_clear_object (&connection); g_clear_error (&error); return environment_updated; @@ -427,13 +413,13 @@ static gboolean spawn_bus (State *state, GCancellable *cancellable) { + GDBusConnection *bus_connection = NULL; GPtrArray *arguments = NULL; GSubprocessLauncher *launcher = NULL; GSubprocess *subprocess = NULL; GInputStream *input_stream = NULL; GDataInputStream *data_stream = NULL; GError *error = NULL; - const char *bus_env = NULL; char *bus_address_fd_string; char *bus_address = NULL; gsize bus_address_size; @@ -444,10 +430,13 @@ spawn_bus (State *state, g_debug ("Running session message bus"); - bus_env = g_getenv ("DBUS_SESSION_BUS_ADDRESS"); - if (bus_env != NULL) { + bus_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + cancellable, + NULL); + + if (bus_connection != NULL) { g_debug ("session message bus already running, not starting another one"); - state->bus_address = g_strdup (bus_env); + state->bus_connection = bus_connection; return TRUE; } @@ -513,6 +502,22 @@ spawn_bus (State *state, on_bus_finished, state); + + bus_connection = g_dbus_connection_new_for_address_sync (state->bus_address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, + cancellable, + &error); + + if (bus_connection == NULL) { + g_debug ("could not open connection to session bus: %s", + error->message); + goto out; + } + + state->bus_connection = bus_connection; + is_running = TRUE; out: g_clear_object (&data_stream); @@ -573,7 +578,10 @@ spawn_session (State *state, g_subprocess_launcher_setenv (launcher, "DISPLAY", state->display_name, TRUE); g_subprocess_launcher_setenv (launcher, "XAUTHORITY", state->auth_file, TRUE); - g_subprocess_launcher_setenv (launcher, "DBUS_SESSION_BUS_ADDRESS", state->bus_address, TRUE); + + if (state->bus_address != NULL) { + g_subprocess_launcher_setenv (launcher, "DBUS_SESSION_BUS_ADDRESS", state->bus_address, TRUE); + } vt = g_getenv ("XDG_VTNR"); @@ -712,6 +720,7 @@ clear_state (State **out_state) State *state = *out_state; g_clear_object (&state->cancellable); + g_clear_object (&state->bus_connection); g_clear_object (&state->session_subprocess); g_clear_object (&state->x_subprocess); g_clear_pointer (&state->auth_file, g_free); |