</varlistentry>
<varlistentry>
- <term><option>--variables=yes|no</option></term>
+ <term><option>--variables=yes|no|auto</option></term>
<listitem><para>Controls whether to touch the firmware's boot loader list stored in EFI variables,
- and other EFI variables. If not specified defaults to no when execution in a container runtime is
- detected, yes otherwise.</para>
+ and other EFI variables. If not specified or set to <option>auto</option>, EFI variables will not
+ be modified when execution in a container runtime is detected. <option>yes</option> may be used to
+ explicit override the check.</para>
<xi:include href="version-info.xml" xpointer="v258"/></listitem>
</varlistentry>
<term><option>--lightweight=<replaceable>BOOLEAN</replaceable></option></term>
<listitem><para>Controls whether to activate the per-user service manager for the target user. By
- default if the target user is <literal>root</literal> or a system user the per-user service manager
- is not activated as effect of the <command>run0</command> invocation, otherwise it is.</para>
+ default (unset or set to <option>auto</option>), if the target user is <literal>root</literal> or
+ a system user the per-user service manager is not activated as effect of the <command>run0</command>
+ invocation, otherwise it is.</para>
<para>This ultimately controls the <varname>$XDG_SESSION_CLASS</varname> environment variable
<citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
<term><option>--copy-ownership=</option></term>
<listitem><para>Controls whether file ownership (user and group) is preserved when copying files
- with <option>--copy-from</option> or <option>--copy-to</option>. Takes a boolean. If
- <literal>yes</literal>, ownership is always preserved. If <literal>no</literal>, ownership is never
- preserved and the current user's UID/GID is used instead. If not specified, ownership is preserved
- when copying directory trees, but not when copying individual regular files.
+ with <option>--copy-from</option> or <option>--copy-to</option>. Takes a boolean, or <option>auto</option>.
+ If <literal>yes</literal>, ownership is always preserved. If <literal>no</literal>, ownership is never
+ preserved and the current user's UID/GID is used instead. If not specified or <option>auto</option>,
+ ownership is preserved when copying directory trees, but not when copying individual regular files.
</para>
<xi:include href="version-info.xml" xpointer="v260"/></listitem>
break;
case ARG_VARIABLES:
- r = parse_tristate_argument("--variables=", optarg, &arg_touch_variables);
+ r = parse_tristate_argument_with_auto("--variables=", optarg, &arg_touch_variables);
if (r < 0)
return r;
break;
}
case ARG_COPY_OWNERSHIP:
- r = parse_tristate_argument("--copy-ownership=", optarg, &arg_copy_ownership);
+ r = parse_tristate_argument_with_auto("--copy-ownership=", optarg, &arg_copy_ownership);
if (r < 0)
return r;
break;
break;
case ARG_LIGHTWEIGHT:
- r = parse_tristate_argument("--lightweight=", optarg, &arg_lightweight);
+ r = parse_tristate_argument_with_auto("--lightweight=", optarg, &arg_lightweight);
if (r < 0)
return r;
break;
/* Returns the result through *ret and the return value. */
+ assert(optname);
+
if (s) {
r = parse_boolean(s);
if (r < 0)
- return log_error_errno(r, "Failed to parse boolean argument to %s: %s.", optname, s);
+ return log_error_errno(r, "Failed to parse boolean argument to '%s': %s", optname, s);
if (ret)
*ret = r;
}
}
-int parse_tristate_argument(const char *optname, const char *s, int *ret) {
+int parse_tristate_argument_with_auto(const char *optname, const char *s, int *ret) {
int r;
- if (s) {
- r = parse_boolean(s);
- if (r < 0)
- return log_error_errno(r, "Failed to parse boolean argument to %s: %s.", optname, s);
-
- if (ret)
- *ret = r;
+ assert(optname);
+ assert(s); /* We refuse NULL optarg here, since that would be ambiguous on cmdline:
+ for --enable-a[=BOOL], --enable-a is intuitively interpreted as true rather than "auto"
+ (parse_boolean_argument() does exactly that). IOW, tristate options should require
+ arguments. */
- return r;
- } else {
- if (ret)
- *ret = -1;
+ r = parse_tristate_full(s, "auto", ret);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse tristate argument to '%s': %s", optname, s);
- return 0;
- }
+ return 0;
}
int parse_json_argument(const char *s, sd_json_format_flags_t *ret) {
#include "shared-forward.h"
int parse_boolean_argument(const char *optname, const char *s, bool *ret);
-int parse_tristate_argument(const char *optname, const char *s, int *ret);
+int parse_tristate_argument_with_auto(const char *optname, const char *s, int *ret);
int parse_json_argument(const char *s, sd_json_format_flags_t *ret);
int parse_path_argument(const char *path, bool suppress_root, char **arg);
int parse_signal_argument(const char *s, int *ret);
break;
case ARG_CHECK_INHIBITORS:
- r = parse_tristate_full(optarg, "auto", &arg_check_inhibitors);
+ r = parse_tristate_argument_with_auto("--check-inhibitors=", optarg, &arg_check_inhibitors);
if (r < 0)
- return log_error_errno(r, "Failed to parse --check-inhibitors= argument: %s", optarg);
+ return r;
break;
case ARG_PLAIN: