run: make custom slice imply XDG_SESSION_CLASS=none

--slice and --slice-inherit are intended to make the new service unit
part of a specific slice. Logind is incompatible with that goal, as a
session of any kind will prompt logind to immediately yoink the new
command from the service unit into a new session scope, which does not
inherit from run0's own slice. The use can still explicitly request a
session with --setenv=XDG_SESSION_CLASS=<class>.

Also make --slice and --slice-inherit conflict with --lightweight and
--area, which depend on logind to be effective.
This commit is contained in:
Ronan Pigott
2026-06-28 13:48:02 +09:00
committed by Yu Watanabe
parent c99674a408
commit 313e2a38ab
2 changed files with 22 additions and 7 deletions
+16 -5
View File
@@ -992,6 +992,14 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) {
_cleanup_strv_free_ char **l = NULL;
char **args = option_parser_get_args(&opts);
bool custom_slice = arg_slice_inherit || arg_slice;
if (custom_slice && arg_lightweight >= 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--lightweight= may not be combined with a custom slice");
if (custom_slice && !isempty(arg_area))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--area= may not be combined with a custom slice");
if (!strv_isempty(args)) {
if (arg_validate)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -1108,9 +1116,12 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) {
}
if (!strv_env_get(arg_environment, "XDG_SESSION_CLASS")) {
const char *class = NULL;
if (custom_slice)
class = "none";
/* If logging into an area, imply lightweight mode */
if (arg_lightweight < 0 && !isempty(arg_area))
else if (arg_lightweight < 0 && !isempty(arg_area))
arg_lightweight = true;
/* When using run0 to acquire privileges temporarily, let's not pull in session manager by
@@ -1120,14 +1131,14 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) {
* this for root or --empower though, under the assumption that if a regular user temporarily
* transitions into another regular user it's a better default that the full user environment is
* uniformly available. */
if (arg_lightweight < 0 && (become_root() || arg_empower))
else if (arg_lightweight < 0 && (become_root() || arg_empower))
arg_lightweight = true;
if (arg_lightweight >= 0) {
const char *class =
arg_lightweight ? (arg_stdio == ARG_STDIO_PTY ? (become_root() ? "user-early-light" : "user-light") : "background-light") :
if (arg_lightweight >= 0)
class = arg_lightweight ? (arg_stdio == ARG_STDIO_PTY ? (become_root() ? "user-early-light" : "user-light") : "background-light") :
(arg_stdio == ARG_STDIO_PTY ? (become_root() ? "user-early" : "user") : "background");
if (class) {
log_debug("Setting XDG_SESSION_CLASS to '%s'.", class);
r = strv_env_assign(&arg_environment, "XDG_SESSION_CLASS", class);