summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2016-02-04 13:36:06 -0500
committerRay Strode <rstrode@redhat.com>2016-02-04 13:40:07 -0500
commit99eeae91c1f11997521ad3bc016a7b2d23ec7942 (patch)
tree534f2468fabcb24944c844d27017063ed59293c9
parenta5aea71e6747eee020bf8e8a6b944b99d830c75c (diff)
downloadgdm-99eeae91c1f11997521ad3bc016a7b2d23ec7942.tar.gz
daemon: support dbus user buses with X sessions
If the dbus user bus was started when the user first logged in, before the session was started, then that dbus daemon won't have DISPLAY and XAUTHORITY in its activation environment. This means programs activated from that dbus daemon also won't have DISPLAY and XAUTHORITY in their activation environments. This commit changes GDM to explicitly put the two variables in the activation environment via D-Bus, rather than sending them into the bus environment process when launching the bus (since in the case of the user bus, we don't launch it). https://bugzilla.gnome.org/show_bug.cgi?id=761568
-rw-r--r--daemon/gdm-x-session.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c
index 624f67ca..c01cc5ee 100644
--- a/daemon/gdm-x-session.c
+++ b/daemon/gdm-x-session.c
@@ -378,6 +378,9 @@ spawn_bus (State *state,
GSubprocess *subprocess = NULL;
GInputStream *input_stream = NULL;
GDataInputStream *data_stream = NULL;
+ GDBusConnection *connection = NULL;
+ GVariantBuilder *builder = NULL;
+ GVariant *reply = NULL;
GError *error = NULL;
const char *bus_env = NULL;
char *bus_address_fd_string;
@@ -407,9 +410,6 @@ spawn_bus (State *state,
arguments = g_ptr_array_new ();
launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_NONE);
- g_subprocess_launcher_setenv (launcher, "DISPLAY", state->display_name, TRUE);
- g_subprocess_launcher_setenv (launcher, "XAUTHORITY", state->auth_file, TRUE);
-
g_subprocess_launcher_take_fd (launcher, pipe_fds[1], BUS_ADDRESS_FILENO);
bus_address_fd_string = g_strdup_printf ("%d", BUS_ADDRESS_FILENO);
@@ -462,6 +462,42 @@ spawn_bus (State *state,
on_bus_finished,
state);
+ 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,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "UpdateActivationEnvironment",
+ g_variant_new ("(@a{ss})",
+ g_variant_builder_end (&builder)),
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &error);
+
+ if (reply == NULL) {
+ g_debug ("could not update activation environment: %s", error->message);
+ goto out;
+ }
+
+ g_variant_unref (reply);
+ g_clear_object (&connection);
+
is_running = TRUE;
out:
g_clear_object (&data_stream);