1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-07 09:56:51 +03:00

loginctl: use $XDG_SESSION_ID for "our" session

Instead of always letting logind guess what the caller's session is, let's
give it the value from $XDG_SESSION_ID when it is present in the caller's
environment.

Nowadays terminal emulators are often running as services under systemd --user,
and not as part of an actual session, so all loginctl calls which depend on
logind guessing the session will fail. I don't see a reason not to honour
$XDG_SESSION_ID.

This applies to LockSession, UnlockSession, TerminateSession, ActivateSession,
SetUserLinger.

Fixes #6032.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-05-31 22:23:30 -04:00
parent cf82fda94e
commit bdb07fa5ac

View File

@ -1074,12 +1074,11 @@ static int activate(int argc, char *argv[], void *userdata) {
polkit_agent_open_if_enabled();
if (argc < 2) {
/* No argument? Let's convert this into the empty
* session name, which the calls will then resolve to
* the caller's session. */
/* No argument? Let's either use $XDG_SESSION_ID (if specified), or an empty
* session name, in which case logind will try to guess our session. */
short_argv[0] = argv[0];
short_argv[1] = (char*) "";
short_argv[1] = getenv("XDG_SESSION_ID") ?: (char*) "";
short_argv[2] = NULL;
argv = short_argv;
@ -1155,8 +1154,11 @@ static int enable_linger(int argc, char *argv[], void *userdata) {
b = streq(argv[0], "enable-linger");
if (argc < 2) {
/* No argument? Let's either use $XDG_SESSION_ID (if specified), or an empty
* session name, in which case logind will try to guess our session. */
short_argv[0] = argv[0];
short_argv[1] = (char*) "";
short_argv[1] = getenv("XDG_SESSION_ID") ?: (char*) "";
short_argv[2] = NULL;
argv = short_argv;
argc = 2;