summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2015-07-07 19:13:52 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2015-07-07 19:13:52 +0200
commit586cd08e1bbf8d6b1a960dc94f46235fde0d68c1 (patch)
tree9ad797636c2ec494bacc9794691623b5ff9904d6
parent2d1ca11270e66777c90a449096203afebc37ec9c (diff)
downloadsystemd-586cd08e1bbf8d6b1a960dc94f46235fde0d68c1.tar.gz
logind: allow sessions to share a VT if it's a greeter
Old gdm and lightdm start the user-session during login before they destroy the greeter-session. Therefore, the user-session will take over the VT from the greeter. We recently prevented this by never allowing multiple sessions on the same VT. Fix this now, by explicitly allowing this if the owning session is a GREETER. Note that gdm no longer behaves like this. Instead, due to wayland, they always use a different VT for each session. All other login-managers are highly encouraged to destroy the greeter-session _before_ starting the user-session. We now work around this, but this will probably not last forever (and will already have nasty side-effects on the greeter-session).
-rw-r--r--src/login/logind-dbus.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 0cc2cdf997..c92761f435 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -690,8 +690,19 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
}
manager_get_session_by_pid(m, leader, &session);
- if (!session && vtnr > 0 && vtnr < m->seat0->position_count)
+ if (!session && vtnr > 0 && vtnr < m->seat0->position_count) {
session = m->seat0->positions[vtnr];
+ /*
+ * Old gdm and lightdm start the user-session on the same VT as
+ * the greeter session. But they destroy the greeter session
+ * after the user-session and want the user-session to take
+ * over the VT. We need to support this for
+ * backwards-compatibility, so make sure we allow new sessions
+ * on a VT that a greeter is running on.
+ */
+ if (session && session->class == SESSION_GREETER)
+ session = NULL;
+ }
if (session) {
_cleanup_free_ char *path = NULL;
_cleanup_close_ int fifo_fd = -1;