summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2016-08-25 10:36:13 -0400
committerRay Strode <rstrode@redhat.com>2016-08-29 12:25:52 -0400
commit957e75ef48f2131b9421e1b19cdf3da1db773ca5 (patch)
treee148a5a85460c7253bbcaabf1535c91ed7e040b5
parentc3c6ece1ad5b477ea22e2027245c191de504f852 (diff)
downloadgdm-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.c15
-rw-r--r--daemon/gdm-x-session.c55
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);