Compare commits

...

12 Commits

Author SHA1 Message Date
Luca Boccassi a87e7e9050
Merge db50a2b55c into fb4c82b643 2024-09-18 11:09:24 -07:00
Antonio Alvarez Feijoo fb4c82b643 nsresourced: fix build without libbpf
```
In file included from ../src/nsresourced/nsresourced-manager.c:9:
../src/shared/bpf-link.h:5:10: fatal error: bpf/libbpf.h: No such file or directory
    5 | #include <bpf/libbpf.h>
      |          ^~~~~~~~~~~~~~
```

Follow-up for 46718d344f
2024-09-18 16:44:12 +02:00
Daan De Meyer 4d9ccdc9ae repart: Drop unprivileged subvolumes logic for btrfs
The functionality was explicitly not included in 6.11 for some
unknown reason so drop the logic from systemd-repart as well so
we don't release v257 with it included.
2024-09-18 16:41:42 +02:00
Antonio Alvarez Feijoo bf39626d61 man/repart: use <varname> instead of <variable>
Otherwise, `<variable>$BOOT</variable>` is rendered:

```
[2548/2992] Generating man/repart.d.5 with a custom command
Element variable in namespace '' encountered in para, but no template matches.
Element variable in namespace '' encountered in para, but no template matches.
```
2024-09-18 16:03:56 +02:00
Marius Hoch ff831e7c50 hwdb: Add accel orientation quirk for the IdeaPad Duet 3 10IGL5-LTE
Signed-off-by: Marius Hoch <mail@mariushoch.de>
2024-09-18 20:30:11 +09:00
Daan De Meyer 81af8f998e repart: Support specifying multiple directories to ExcludeFiles= 2024-09-18 10:22:33 +02:00
chenjiayi 4fc8a63f9e systemd: rewatch pids under cgroup v1 when sigchld of processes more than main pid and control pid is captured
If `Delegate` is configured in service, cgroup agent will never send out
any datagram as .control subcgroup is generated. Thus systemd will watch
all processes on the cgroup hierarchy for SIGCHLD to deal with unreliable
cgroup notifications.

In this way, systemd should rewatch all processes when any SIGCHLD is
captured, more than the control pid or main pid.
2024-09-18 10:13:20 +02:00
Jason Yundt dfb3155419 man: document ShowStatus and SetShowStatus()
SetShowStatus() was added in order to fix #11447. Recently, I ran into
the exact same problem that OP was experiencing in #11447. I wasn’t able
to figure out how to deal with the problem until I found #11447, and it
took me a while to find #11447.

This commit takes what I learned from reading #11447 and adds it to the
documentation. Hopefully, this will make it easier for other people who
run into the same problem in the future.
2024-09-18 10:11:55 +02:00
Daan De Meyer fc5037e7d7
Merge pull request #34464 from yuwata/test-space-in-path
test: allow to run tests under directory that contains spaces
2024-09-18 08:50:38 +02:00
Yu Watanabe 13f6ec7ce7 test: quote paths to executables
Fixes #34459.
2024-09-18 09:47:04 +09:00
Yu Watanabe 6e1816ef16 kernel-install: unquote plugin paths in KERNEL_INSTALL_PLUGINS
To support the case that paths to plugins contain spaces.

Prompted by #34459
2024-09-18 09:47:00 +09:00
Luca Boccassi db50a2b55c man: beef up soft-reboot example unit
Note that journal sockets have to be mounted for softreboot surviving units,
as per thread on the ML, otherwise logging does not work afterwards:

https://lists.freedesktop.org/archives/systemd-devel/2024-June/050382.html

Remove the oneshot, as it didn't actually make sense for a sleep infinity.
And run in a separate image, to showcase that the unit should really be
disconnected from the rootfs.
2024-06-10 12:30:36 +01:00
16 changed files with 154 additions and 139 deletions

View File

@ -760,8 +760,9 @@ sensor:modalias:i2c:bmc150_accel:dmi:*:svnLENOVO:*:pvrLenovoYoga300-11IBR:*
sensor:modalias:acpi:ACCL0001*:dmi:*:svnLENOVO:pn60072:pvr851*:* sensor:modalias:acpi:ACCL0001*:dmi:*:svnLENOVO:pn60072:pvr851*:*
ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1 ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1
# IdeaPad Duet 3 10IGL5 (82AT) # IdeaPad Duet 3 10IGL5 (82AT) and 10IGL5-LTE (82HK)
sensor:modalias:acpi:SMO8B30*:dmi:*:svnLENOVO*:pn82AT:* sensor:modalias:acpi:SMO8B30*:dmi:*:svnLENOVO*:pn82AT:*
sensor:modalias:acpi:SMO8B30*:dmi:*:svnLENOVO*:pn82HK:*
ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1 ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1
######################################### #########################################

View File

@ -593,8 +593,6 @@ node /org/freedesktop/systemd1 {
<!--method GetJobBefore is not documented!--> <!--method GetJobBefore is not documented!-->
<!--method SetShowStatus is not documented!-->
<!--method ListUnitsFiltered is not documented!--> <!--method ListUnitsFiltered is not documented!-->
<!--method ListUnitsByPatterns is not documented!--> <!--method ListUnitsByPatterns is not documented!-->
@ -673,8 +671,6 @@ node /org/freedesktop/systemd1 {
<!--property ConfirmSpawn is not documented!--> <!--property ConfirmSpawn is not documented!-->
<!--property ShowStatus is not documented!-->
<!--property DefaultStandardOutput is not documented!--> <!--property DefaultStandardOutput is not documented!-->
<!--property DefaultStandardError is not documented!--> <!--property DefaultStandardError is not documented!-->
@ -1362,6 +1358,24 @@ node /org/freedesktop/systemd1 {
<para><function>ResetFailedUnit()</function> resets the "failed" state of a specific unit.</para> <para><function>ResetFailedUnit()</function> resets the "failed" state of a specific unit.</para>
<para><function>SetShowStatus()</function> configures the display of status messages during bootup and
shutdown. The <varname>mode</varname> parameter can be set to any value that's valid for the
<varname>systemd.show_status</varname> kernel parameter. For more information about
<varname>systemd.show_status</varname>, see
<citerefentry project="man-pages"><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
The <varname>mode</varname> parameter can also be set to an empty string. When <varname>mode</varname>
is set to an empty string, <function>SetShowStatus()</function> will reset
<varname>ShowStatus</varname> back to its original value. You can use
<function>SetShowStatus()</function> create a service that does something like this:
<orderedlist>
<listitem><para>Send a D-Bus message that will turn off status messages.</para></listitem>
<listitem><para>Block until a reply to that message is received.</para></listitem>
<listitem><para>Print multiples lines without being interrupted by status messages.</para></listitem>
<listitem><para>Send a D-Bus message that will reset <varname>ShowStatus</varname> back to its
original value.</para></listitem>
</orderedlist>
</para>
<para><function>ResetFailed()</function> resets the "failed" state of all units.</para> <para><function>ResetFailed()</function> resets the "failed" state of all units.</para>
<para><function>ListUnits()</function> returns an array of all currently loaded units. Note that <para><function>ListUnits()</function> returns an array of all currently loaded units. Note that
@ -1788,6 +1802,12 @@ node /org/freedesktop/systemd1 {
<para><varname>Environment</varname> encodes the environment block passed to all executed services. It <para><varname>Environment</varname> encodes the environment block passed to all executed services. It
may be altered with bus calls such as <function>SetEnvironment()</function> (see above).</para> may be altered with bus calls such as <function>SetEnvironment()</function> (see above).</para>
<para><varname>ShowStatus</varname> encodes systemd's current policy for displaying status messages
during bootup and shutdown. Its value can be any valid value for the
<varname>systemd.show_status</varname> kernel parameter (see
<citerefentry project="man-pages"><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>).
It may be altered using <function>SetShowStatus()</function> (see above).</para>
<para><varname>UnitPath</varname> encodes the currently active unit file search path. It is an array of <para><varname>UnitPath</varname> encodes the currently active unit file search path. It is an array of
file system paths encoded as strings.</para> file system paths encoded as strings.</para>

View File

@ -483,18 +483,18 @@
<term><varname>ExcludeFiles=</varname></term> <term><varname>ExcludeFiles=</varname></term>
<term><varname>ExcludeFilesTarget=</varname></term> <term><varname>ExcludeFilesTarget=</varname></term>
<listitem><para>Takes an absolute file system path referring to a source file or directory on the <listitem><para>Takes one or more absolute paths, separated by whitespace, each referring to a
host. This setting may be used to exclude files or directories from the host from being copied into source file or directory on the host. This setting may be used to exclude files or directories from
the file system when <varname>CopyFiles=</varname> is used. This option may be used multiple times to the host from being copied into the file system when <varname>CopyFiles=</varname> is used. This
exclude multiple files or directories from host from being copied into the newly formatted file option may be used multiple times to exclude multiple files or directories from host from being
system.</para> copied into the newly formatted file system.</para>
<para>If the path is a directory and ends with <literal>/</literal>, only the directory's <para>If the path is a directory and ends with <literal>/</literal>, only the directory's
contents are excluded but not the directory itself. If the path is a directory and does not end with contents are excluded but not the directory itself. If the path is a directory and does not end with
<literal>/</literal>, both the directory and its contents are excluded.</para> <literal>/</literal>, both the directory and its contents are excluded.</para>
<para><varname>ExcludeFilesTarget=</varname> is like <varname>ExcludeFiles=</varname> except that <para><varname>ExcludeFilesTarget=</varname> is like <varname>ExcludeFiles=</varname> except that
instead of excluding the path on the host from being copied into the partition, we exclude any files instead of excluding the path on the host from being copied into the partition, it exclude any files
and directories from being copied into the given path in the partition.</para> and directories from being copied into the given path in the partition.</para>
<para>When <para>When
@ -922,9 +922,9 @@
target for some other supplement definition. A target cannot have more than one supplement partition target for some other supplement definition. A target cannot have more than one supplement partition
associated with it.</para> associated with it.</para>
<para>For example, distributions can use this to implement <variable>$BOOT</variable> as defined in <para>For example, distributions can use this to implement <varname>$BOOT</varname> as defined in
the <ulink url="https://uapi-group.org/specifications/specs/boot_loader_specification/">Boot Loader the <ulink url="https://uapi-group.org/specifications/specs/boot_loader_specification/">Boot Loader
Specification</ulink>. Distributions may prefer to use the ESP as <variable>$BOOT</variable> whenever Specification</ulink>. Distributions may prefer to use the ESP as <varname>$BOOT</varname> whenever
possible, but to adhere to the spec XBOOTLDR must sometimes be used instead. So, they should create possible, but to adhere to the spec XBOOTLDR must sometimes be used instead. So, they should create
two definitions: the first defining an ESP big enough to hold just the bootloader, and a second for two definitions: the first defining an ESP big enough to hold just the bootloader, and a second for
the XBOOTLDR that's sufficiently large to hold kernels and configured as a supplement for the ESP. the XBOOTLDR that's sufficiently large to hold kernels and configured as a supplement for the ESP.

View File

@ -106,7 +106,10 @@
normal shutdown, reboot and maintenance mode. Finally, they have to be ordered after normal shutdown, reboot and maintenance mode. Finally, they have to be ordered after
<constant>basic.target</constant> to ensure correct ordering on boot. Note that in case any new or <constant>basic.target</constant> to ensure correct ordering on boot. Note that in case any new or
custom units are used to isolate to, or that implement an equivalent shutdown functionality, they will custom units are used to isolate to, or that implement an equivalent shutdown functionality, they will
also have to be configured manually for correct ordering and conflicting. For example:</para> also have to be configured manually for correct ordering and conflicting. In addition, to ensure the
service is disconnected from the rootfs resources (see next paragraph), it should run from a separate
image, but with the journal sockets mounted so that it is still allowed to log to the system journal.
For example:</para>
<programlisting>[Unit] <programlisting>[Unit]
Description=My Surviving Service Description=My Surviving Service
@ -118,7 +121,9 @@ Conflicts=reboot.target kexec.target poweroff.target halt.target rescue.target e
Before=shutdown.target rescue.target emergency.target Before=shutdown.target rescue.target emergency.target
[Service] [Service]
Type=oneshot RootImage=/var/lib/root.raw
TemporaryFileSystem=/run
BindReadOnlyPaths=/run/systemd/journal/socket /run/systemd/journal/stdout
ExecStart=sleep infinity</programlisting> ExecStart=sleep infinity</programlisting>
</listitem> </listitem>

View File

@ -3001,7 +3001,12 @@ SystemCallErrorNumber=EPERM</programlisting>
<para><option>tty</option> connects standard output to a tty (as configured via <varname>TTYPath=</varname>, <para><option>tty</option> connects standard output to a tty (as configured via <varname>TTYPath=</varname>,
see below). If the TTY is used for output only, the executed process will not become the controlling process of see below). If the TTY is used for output only, the executed process will not become the controlling process of
the terminal, and will not fail or wait for other processes to release the terminal.</para> the terminal, and will not fail or wait for other processes to release the terminal. Note: if a unit
tries to print multiple lines to a TTY during bootup or shutdown, then there's a chance that those
lines will be broken up by status messages. <function>SetShowStatus()</function> can be used to
prevent this problem. See
<citerefentry project="man-pages"><refentrytitle>org.freedesktop.systemd1</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details.</para>
<para><option>journal</option> connects standard output with the journal, which is accessible via <para><option>journal</option> connects standard output with the journal, which is accessible via
<citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>. Note <citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>. Note

View File

@ -568,7 +568,11 @@
<listitem><para>Enables display of status messages on the <listitem><para>Enables display of status messages on the
console, as controlled via console, as controlled via
<varname>systemd.show_status=1</varname> on the kernel command <varname>systemd.show_status=1</varname> on the kernel command
line.</para></listitem> line.</para>
<para>You may want to use <function>SetShowStatus()</function> instead of
<constant>SIGRTMIN+20</constant> in order to prevent race conditions. See
<citerefentry project="man-pages"><refentrytitle>org.freedesktop.systemd1</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -579,7 +583,11 @@
controlled via controlled via
<varname>systemd.show_status=0</varname> <varname>systemd.show_status=0</varname>
on the kernel command on the kernel command
line.</para></listitem> line.</para>
<para>You may want to use <function>SetShowStatus()</function> instead of
<constant>SIGRTMIN+21</constant> in order to prevent race conditions. See
<citerefentry project="man-pages"><refentrytitle>org.freedesktop.systemd1</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View File

@ -4169,7 +4169,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
* detect when the cgroup becomes empty. Note that the control process is always * detect when the cgroup becomes empty. Note that the control process is always
* our child so it's pointless to watch all other processes. */ * our child so it's pointless to watch all other processes. */
if (!control_pid_good(s)) if (!control_pid_good(s))
if (!s->main_pid_known || s->main_pid_alien) if (!s->main_pid_known || s->main_pid_alien || unit_cgroup_delegate(u))
(void) unit_enqueue_rewatch_pids(u); (void) unit_enqueue_rewatch_pids(u);
} }

View File

@ -404,15 +404,16 @@ static int context_set_path_strv(Context *c, char* const* strv, const char *sour
static int context_set_plugins(Context *c, const char *s, const char *source) { static int context_set_plugins(Context *c, const char *s, const char *source) {
_cleanup_strv_free_ char **v = NULL; _cleanup_strv_free_ char **v = NULL;
int r;
assert(c); assert(c);
if (c->plugins || !s) if (c->plugins || !s)
return 0; return 0;
v = strv_split(s, NULL); r = strv_split_full(&v, s, NULL, EXTRACT_UNQUOTE);
if (!v) if (r < 0)
return log_oom(); return log_error_errno(r, "Failed to parse plugin paths from %s: %m", source);
return context_set_path_strv(c, v, source, "plugins", &c->plugins); return context_set_path_strv(c, v, source, "plugins", &c->plugins);
} }

View File

@ -46,7 +46,13 @@ echo 'DTBDTBDTBDTB' >"$D/sources/subdir/whatever.dtb"
export KERNEL_INSTALL_CONF_ROOT="$D/sources" export KERNEL_INSTALL_CONF_ROOT="$D/sources"
# We "install" multiple plugins, but control which ones will be active via install.conf. # We "install" multiple plugins, but control which ones will be active via install.conf.
export KERNEL_INSTALL_PLUGINS="${ukify_install} ${loaderentry_install} ${uki_copy_install}" KERNEL_INSTALL_PLUGINS="'${loaderentry_install}' '${uki_copy_install}'"
if [[ -n "$ukify_install" ]]; then
# shellcheck disable=SC2089
KERNEL_INSTALL_PLUGINS="'${ukify_install}' $KERNEL_INSTALL_PLUGINS"
fi
# shellcheck disable=SC2090
export KERNEL_INSTALL_PLUGINS
export BOOT_ROOT="$D/boot" export BOOT_ROOT="$D/boot"
export BOOT_MNT="$D/boot" export BOOT_MNT="$D/boot"
export MACHINE_ID='3e0484f3634a418b8e6a39e8828b03e3' export MACHINE_ID='3e0484f3634a418b8e6a39e8828b03e3'

View File

@ -6,7 +6,9 @@
#include "sd-daemon.h" #include "sd-daemon.h"
#include "bpf-dlopen.h" #include "bpf-dlopen.h"
#if HAVE_VMLINUX_H
#include "bpf-link.h" #include "bpf-link.h"
#endif
#include "build-path.h" #include "build-path.h"
#include "common-signal.h" #include "common-signal.h"
#include "env-util.h" #include "env-util.h"

View File

@ -304,19 +304,6 @@ static SubvolumeFlags subvolume_flags_from_string(const char *s) {
return flags; return flags;
} }
static char* subvolume_flags_to_string(SubvolumeFlags flags) {
const char *l[CONST_LOG2U(_SUBVOLUME_FLAGS_MASK + 1) + 1]; /* one string per known flag at most */
size_t m = 0;
if (FLAGS_SET(flags, SUBVOLUME_RO))
l[m++] = "ro";
assert(m < ELEMENTSOF(l));
l[m] = NULL;
return strv_join((char**) l, ",");
}
typedef struct Subvolume { typedef struct Subvolume {
char *path; char *path;
SubvolumeFlags flags; SubvolumeFlags flags;
@ -1742,8 +1729,9 @@ static int config_parse_exclude_files(
const char *rvalue, const char *rvalue,
void *data, void *data,
void *userdata) { void *userdata) {
_cleanup_free_ char *resolved = NULL;
char ***exclude_files = ASSERT_PTR(data); char ***exclude_files = ASSERT_PTR(data);
const char *p = ASSERT_PTR(rvalue);
int r; int r;
if (isempty(rvalue)) { if (isempty(rvalue)) {
@ -1751,20 +1739,34 @@ static int config_parse_exclude_files(
return 0; return 0;
} }
r = specifier_printf(rvalue, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved); for (;;) {
if (r < 0) { _cleanup_free_ char *word = NULL, *resolved = NULL;
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in ExcludeFiles= path, ignoring: %s", rvalue); r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE);
return 0; if (r == -ENOMEM)
return log_oom();
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Invalid syntax, ignoring: %s", p);
return 0;
}
if (r == 0)
return 0;
r = specifier_printf(word, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in %s path, ignoring: %s", lvalue, word);
return 0;
}
r = path_simplify_and_warn(resolved, PATH_CHECK_ABSOLUTE|PATH_KEEP_TRAILING_SLASH, unit, filename, line, lvalue);
if (r < 0)
return 0;
if (strv_consume(exclude_files, TAKE_PTR(resolved)) < 0)
return log_oom();
} }
r = path_simplify_and_warn(resolved, PATH_CHECK_ABSOLUTE|PATH_KEEP_TRAILING_SLASH, unit, filename, line, lvalue);
if (r < 0)
return 0;
if (strv_consume(exclude_files, TAKE_PTR(resolved)) < 0)
return log_oom();
return 0; return 0;
} }
@ -2423,6 +2425,14 @@ static int partition_read_definition(Partition *p, const char *path, const char
"SizeMinBytes=/SizeMaxBytes= cannot be used with Verity=%s.", "SizeMinBytes=/SizeMaxBytes= cannot be used with Verity=%s.",
verity_mode_to_string(p->verity)); verity_mode_to_string(p->verity));
if (!ordered_hashmap_isempty(p->subvolumes) && arg_offline > 0)
return log_syntax(NULL, LOG_ERR, path, 1, SYNTHETIC_ERRNO(EOPNOTSUPP),
"Subvolumes= cannot be used with --offline=yes.");
if (p->default_subvolume && arg_offline > 0)
return log_syntax(NULL, LOG_ERR, path, 1, SYNTHETIC_ERRNO(EOPNOTSUPP),
"DefaultSubvolume= cannot be used with --offline=yes.");
if (p->default_subvolume && !ordered_hashmap_contains(p->subvolumes, p->default_subvolume)) if (p->default_subvolume && !ordered_hashmap_contains(p->subvolumes, p->default_subvolume))
return log_syntax(NULL, LOG_ERR, path, 1, SYNTHETIC_ERRNO(EINVAL), return log_syntax(NULL, LOG_ERR, path, 1, SYNTHETIC_ERRNO(EINVAL),
"DefaultSubvolume= must be one of the paths in Subvolumes=."); "DefaultSubvolume= must be one of the paths in Subvolumes=.");
@ -4271,7 +4281,7 @@ static int prepare_temporary_file(Context *context, PartitionTarget *t, uint64_t
static bool loop_device_error_is_fatal(const Partition *p, int r) { static bool loop_device_error_is_fatal(const Partition *p, int r) {
assert(p); assert(p);
return arg_offline == 0 || (r != -ENOENT && !ERRNO_IS_PRIVILEGE(r)); return arg_offline == 0 || (r != -ENOENT && !ERRNO_IS_PRIVILEGE(r)) || !ordered_hashmap_isempty(p->subvolumes) || p->default_subvolume;
} }
static int partition_target_prepare( static int partition_target_prepare(
@ -5778,38 +5788,6 @@ static int partition_populate_filesystem(Context *context, Partition *p, const c
return 0; return 0;
} }
static int append_btrfs_subvols(char ***l, OrderedHashmap *subvolumes, const char *default_subvolume) {
Subvolume *subvolume;
int r;
assert(l);
ORDERED_HASHMAP_FOREACH(subvolume, subvolumes) {
_cleanup_free_ char *s = NULL, *f = NULL;
s = strdup(subvolume->path);
if (!s)
return log_oom();
f = subvolume_flags_to_string(subvolume->flags);
if (!f)
return log_oom();
if (streq_ptr(subvolume->path, default_subvolume) &&
!strextend_with_separator(&f, ",", "default"))
return log_oom();
if (!isempty(f) && !strextend_with_separator(&s, ":", f))
return log_oom();
r = strv_extend_many(l, "--subvol", s);
if (r < 0)
return log_oom();
}
return 0;
}
static int finalize_extra_mkfs_options(const Partition *p, const char *root, char ***ret) { static int finalize_extra_mkfs_options(const Partition *p, const char *root, char ***ret) {
_cleanup_strv_free_ char **sv = NULL; _cleanup_strv_free_ char **sv = NULL;
int r; int r;
@ -5823,18 +5801,6 @@ static int finalize_extra_mkfs_options(const Partition *p, const char *root, cha
"Failed to determine mkfs command line options for '%s': %m", "Failed to determine mkfs command line options for '%s': %m",
p->format); p->format);
if (partition_needs_populate(p) && root && streq(p->format, "btrfs")) {
r = append_btrfs_subvols(&sv, p->subvolumes, p->default_subvolume);
if (r < 0)
return r;
if (p->suppressing) {
r = append_btrfs_subvols(&sv, p->suppressing->subvolumes, NULL);
if (r < 0)
return r;
}
}
*ret = TAKE_PTR(sv); *ret = TAKE_PTR(sv);
return 0; return 0;
} }

View File

@ -197,7 +197,7 @@ _unused_ static void test_compress_stream(const char *compression,
ASSERT_OK(compress(src, dst, -1, &uncompressed_size)); ASSERT_OK(compress(src, dst, -1, &uncompressed_size));
if (cat) { if (cat) {
assert_se(asprintf(&cmd, "%s %s | diff %s -", cat, pattern, srcfile) > 0); assert_se(asprintf(&cmd, "%s %s | diff '%s' -", cat, pattern, srcfile) > 0);
assert_se(system(cmd) == 0); assert_se(system(cmd) == 0);
} }
@ -212,7 +212,7 @@ _unused_ static void test_compress_stream(const char *compression,
r = decompress(dst, dst2, st.st_size); r = decompress(dst, dst2, st.st_size);
assert_se(r == 0); assert_se(r == 0);
assert_se(asprintf(&cmd2, "diff %s %s", srcfile, pattern2) > 0); assert_se(asprintf(&cmd2, "diff '%s' %s", srcfile, pattern2) > 0);
assert_se(system(cmd2) == 0); assert_se(system(cmd2) == 0);
log_debug("/* test faulty decompression */"); log_debug("/* test faulty decompression */");

View File

@ -52,7 +52,8 @@ static void test_event_spawn_self(const char *self, const char *arg, bool with_p
log_debug("/* %s(%s, %s) */", __func__, arg, yes_no(with_pidfd)); log_debug("/* %s(%s, %s) */", __func__, arg, yes_no(with_pidfd));
assert_se(cmd = strjoin(self, " ", arg)); /* 'self' may contain spaces, hence needs to be quoted. */
assert_se(cmd = strjoin("'", self, "' ", arg));
test_event_spawn_core(with_pidfd, cmd, result_buf, BUF_SIZE); test_event_spawn_core(with_pidfd, cmd, result_buf, BUF_SIZE);

View File

@ -4,32 +4,32 @@ set -e
ANALYZE="${1:-systemd-analyze}" ANALYZE="${1:-systemd-analyze}"
$ANALYZE compare-versions 1 lt 2 "$ANALYZE" compare-versions 1 lt 2
$ANALYZE compare-versions 1 '<' 2 "$ANALYZE" compare-versions 1 '<' 2
$ANALYZE compare-versions 1 le 2 "$ANALYZE" compare-versions 1 le 2
$ANALYZE compare-versions 1 '<=' 2 "$ANALYZE" compare-versions 1 '<=' 2
$ANALYZE compare-versions 1 ne 2 "$ANALYZE" compare-versions 1 ne 2
$ANALYZE compare-versions 1 '!=' 2 "$ANALYZE" compare-versions 1 '!=' 2
( ! $ANALYZE compare-versions 1 ge 2 ) ( ! "$ANALYZE" compare-versions 1 ge 2 )
( ! $ANALYZE compare-versions 1 '>=' 2 ) ( ! "$ANALYZE" compare-versions 1 '>=' 2 )
( ! $ANALYZE compare-versions 1 eq 2 ) ( ! "$ANALYZE" compare-versions 1 eq 2 )
( ! $ANALYZE compare-versions 1 '==' 2 ) ( ! "$ANALYZE" compare-versions 1 '==' 2 )
( ! $ANALYZE compare-versions 1 gt 2 ) ( ! "$ANALYZE" compare-versions 1 gt 2 )
( ! $ANALYZE compare-versions 1 '>' 2 ) ( ! "$ANALYZE" compare-versions 1 '>' 2 )
test "$($ANALYZE compare-versions 1 2)" = '1 < 2' test "$("$ANALYZE" compare-versions 1 2)" = '1 < 2'
test "$($ANALYZE compare-versions 2 2)" = '2 == 2' test "$("$ANALYZE" compare-versions 2 2)" = '2 == 2'
test "$($ANALYZE compare-versions 2 1)" = '2 > 1' test "$("$ANALYZE" compare-versions 2 1)" = '2 > 1'
test "$($ANALYZE compare-versions '' '')" = "'' == ''" test "$("$ANALYZE" compare-versions '' '')" = "'' == ''"
set +e set +e
$ANALYZE compare-versions 1 2; ret1=$? "$ANALYZE" compare-versions 1 2; ret1=$?
$ANALYZE compare-versions 2 2; ret2=$? "$ANALYZE" compare-versions 2 2; ret2=$?
$ANALYZE compare-versions 2 1; ret3=$? "$ANALYZE" compare-versions 2 1; ret3=$?
set -e set -e
test $ret1 == 12 test "$ret1" == 12
test $ret2 == 0 test "$ret2" == 0
test $ret3 == 11 test "$ret3" == 11

View File

@ -44,9 +44,9 @@ test_one() (
fi fi
if [[ "${input##*/}" =~ \.fstab\.input ]]; then if [[ "${input##*/}" =~ \.fstab\.input ]]; then
SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD="$initrd" SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=yes root=fstab" SYSTEMD_FSTAB="$input" SYSTEMD_SYSROOT_FSTAB="/dev/null" $generator "$out" "$out" "$out" SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD="$initrd" SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=yes root=fstab" SYSTEMD_FSTAB="$input" SYSTEMD_SYSROOT_FSTAB="/dev/null" "$generator" "$out" "$out" "$out"
else else
SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD="$initrd" SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=no $(cat "$input")" $generator "$out" "$out" "$out" SYSTEMD_LOG_LEVEL=debug SYSTEMD_IN_INITRD="$initrd" SYSTEMD_SYSFS_CHECK=no SYSTEMD_PROC_CMDLINE="fstab=no $(cat "$input")" "$generator" "$out" "$out" "$out"
fi fi
# The option x-systemd.growfs creates symlink to system's systemd-growfs@.service in .mount.wants directory. # The option x-systemd.growfs creates symlink to system's systemd-growfs@.service in .mount.wants directory.

View File

@ -53,7 +53,7 @@ for f in $(find "$SOURCE"/test-*.input | sort -V); do
echo "*** Running $f" echo "*** Running $f"
prepare_testdir "${f%.input}" prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf" cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
$SYSUSERS --root="$TESTDIR" "$SYSUSERS" --root="$TESTDIR"
compare "${f%.*}" "" compare "${f%.*}" ""
done done
@ -62,7 +62,7 @@ for f in $(find "$SOURCE"/test-*.input | sort -V); do
echo "*** Running $f on stdin" echo "*** Running $f on stdin"
prepare_testdir "${f%.input}" prepare_testdir "${f%.input}"
touch "$TESTDIR/etc/sysusers.d/test.conf" touch "$TESTDIR/etc/sysusers.d/test.conf"
$SYSUSERS --root="$TESTDIR" - <"$f" "$SYSUSERS" --root="$TESTDIR" - <"$f"
compare "${f%.*}" "on stdin" compare "${f%.*}" "on stdin"
done done
@ -72,9 +72,9 @@ for f in $(find "$SOURCE"/test-*.input | sort -V); do
prepare_testdir "${f%.input}" prepare_testdir "${f%.input}"
touch "$TESTDIR/etc/sysusers.d/test.conf" touch "$TESTDIR/etc/sysusers.d/test.conf"
# this overrides test.conf which is masked on disk # this overrides test.conf which is masked on disk
$SYSUSERS --root="$TESTDIR" --replace=/etc/sysusers.d/test.conf - <"$f" "$SYSUSERS" --root="$TESTDIR" --replace=/etc/sysusers.d/test.conf - <"$f"
# this should be ignored # this should be ignored
$SYSUSERS --root="$TESTDIR" --replace=/usr/lib/sysusers.d/test.conf - <"$SOURCE/test-1.input" "$SYSUSERS" --root="$TESTDIR" --replace=/usr/lib/sysusers.d/test.conf - <"$SOURCE/test-1.input"
compare "${f%.*}" "on stdin with --replace" compare "${f%.*}" "on stdin with --replace"
done done
@ -84,9 +84,9 @@ echo "*** Testing --inline"
prepare_testdir "$SOURCE/inline" prepare_testdir "$SOURCE/inline"
# copy a random file to make sure it is ignored # copy a random file to make sure it is ignored
cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf" cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf"
$SYSUSERS --root="$TESTDIR" --inline \ "$SYSUSERS" --root="$TESTDIR" --inline \
"u u1 222 - - /bin/zsh" \ "u u1 222 - - /bin/zsh" \
"g g1 111" "g g1 111"
compare "$SOURCE/inline" "(--inline)" compare "$SOURCE/inline" "(--inline)"
@ -95,19 +95,19 @@ echo "*** Testing --inline with --replace"
prepare_testdir "$SOURCE/inline" prepare_testdir "$SOURCE/inline"
# copy a random file to make sure it is ignored # copy a random file to make sure it is ignored
cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf" cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf"
$SYSUSERS --root="$TESTDIR" \ "$SYSUSERS" --root="$TESTDIR" \
--inline \ --inline \
--replace=/etc/sysusers.d/confuse.conf \ --replace=/etc/sysusers.d/confuse.conf \
"u u1 222 - - /bin/zsh" \ "u u1 222 - - /bin/zsh" \
"g g1 111" "g g1 111"
compare "$SOURCE/inline" "(--inline --replace=…)" compare "$SOURCE/inline" "(--inline --replace=…)"
echo "*** Testing --inline with no /etc" echo "*** Testing --inline with no /etc"
rm -rf "${TESTDIR:?}/etc" rm -rf "${TESTDIR:?}/etc"
$SYSUSERS --root="$TESTDIR" --inline \ "$SYSUSERS" --root="$TESTDIR" --inline \
"u u1 222 - - /bin/zsh" \ "u u1 222 - - /bin/zsh" \
"g g1 111" "g g1 111"
compare "$SOURCE/inline" "(--inline)" compare "$SOURCE/inline" "(--inline)"
@ -136,7 +136,7 @@ for f in $(find "$SOURCE"/test-*.input | sort -V); do
echo "*** Running $f (with login.defs)" echo "*** Running $f (with login.defs)"
prepare_testdir "${f%.input}" prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf" cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
$SYSUSERS --root="$TESTDIR" "$SYSUSERS" --root="$TESTDIR"
# shellcheck disable=SC2050 # shellcheck disable=SC2050
[ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max
@ -152,7 +152,7 @@ for f in $(find "$SOURCE"/test-*.input | sort -V); do
echo "*** Running $f (with login.defs symlinked)" echo "*** Running $f (with login.defs symlinked)"
prepare_testdir "${f%.input}" prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf" cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
$SYSUSERS --root="$TESTDIR" "$SYSUSERS" --root="$TESTDIR"
# shellcheck disable=SC2050 # shellcheck disable=SC2050
[ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max
@ -166,7 +166,7 @@ for f in $(find "$SOURCE"/unhappy-*.input | sort -V); do
echo "*** Running test $f" echo "*** Running test $f"
prepare_testdir "${f%.input}" prepare_testdir "${f%.input}"
cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf" cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
SYSTEMD_LOG_LEVEL=info $SYSUSERS --root="$TESTDIR" 2>&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >"$TESTDIR/err" SYSTEMD_LOG_LEVEL=info "$SYSUSERS" --root="$TESTDIR" 2>&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >"$TESTDIR/err"
if ! diff -u "$TESTDIR/err" "${f%.*}.expected-err"; then if ! diff -u "$TESTDIR/err" "${f%.*}.expected-err"; then
echo >&2 "**** Unexpected error output for $f" echo >&2 "**** Unexpected error output for $f"
cat >&2 "$TESTDIR/err" cat >&2 "$TESTDIR/err"