Commit Graph
61778 Commits
Author SHA1 Message Date
Zbigniew Jędrzejewski-Szmek 96de029ad7 basic/path-util: stop ignoring non-absolute paths
112cfb1814 tried to improve handling of
paths when root is specified. It said:
> To avoid answering what a relative path means when called with a root
> prefix path_strv_canonicalize is now path_strv_canonicalize_absolute
> and only considers absolute paths. Fortunately all users of already call
> path_strv_canonicalize with a list of absolute paths.

Of course, other users were added later and for example now
SYSTEMD_HOSTNAME_WORDLIST_PATH=build/hostname-wordlist/ ... doesn't
work as expected. If root is not specified, there is really no reason
to ignore relative paths. They work relative to CWD per the usual convention.
It's up to the user to not use relative paths in a context where they
should not be used. When root is specified, continue to ignore the relative
paths, since there is no clear interpreation what they mean, but emit
a debug message.
2026-09-01 15:57:58 +02:00
Zbigniew Jędrzejewski-Szmek 6ec548c336 shared/fileio: avoid copying strv twice
search_and_fopen called search_and_fopen_internal which made a copy
of the search strv and then called search_and_open which made a copy
too.
2026-09-01 15:57:58 +02:00
Zbigniew Jędrzejewski-Szmek 98dbda7a2c test-hostname-pick-word: add a simple test to check word selection
This is useful to check if how fast the code is (painfully slow) and whether
worlds indeed are selected with a flat distribution probability (they are).

The code is slow because the hashing and because chaseat is exteremely
inefficient :(
2026-09-01 15:55:45 +02:00
Zbigniew Jędrzejewski-Szmek 51636f3c39 repart: clamp copied timestamps to $SOURCE_DATE_EPOCH (#43545)
This greatly helps reproducibility, and we can actually achieve it with
https://github.com/dosfstools/dosfstools/commit/8da7bc93315c.
2026-08-28 13:22:41 +02:00
Martin Pitt ab2ab441f7 mkfs-util: forward a validated $SOURCE_DATE_EPOCH to mkfs.*
The previous commit uses `parse_source_date_epoch()` for creating FAT
time stamps. Do the same in `mtools_exec()`, `mkfs.*`, and
`$E2FSPROGS_FAKE_TIME` instead of passing the raw environment variable.

That avoids these programs creating time stamps from a value we would
have rejected ourselves (unparsable, overflowing), read differently
(e.g. octal numbers), or from one that `secure_getenv()` declines to
look at under AT_SECURE.

Note: mtools derives file and directory timestamps from
$SOURCE_DATE_EPOCH since v4.0.20 (2018).
2026-08-28 11:16:34 +02:00
Martin Pitt 94bb5f8e4d repart: clamp copied timestamps to $SOURCE_DATE_EPOCH
Use the new copy timestamp clamping mechanism from the previous commit
to fix unreproducible wall-clock files in the generated images.

That covers both modes: online mode writes through the kernel, and
offline mode stages the tree in a temporary directory before handing it
to mkfs or mcopy. `mcopy -m` then carries the clamped mtimes into the
FAT.

This complements commit 34c3d57474 (directory times) and commit
f191ca982c (FAT insertion order).

Cover all combinations (online/offline, with and without epoch) in the
new `testcase_vfat_reproducibility()`. Update `testcase_make_symlinks()`
to cover the symlink creation/re-fix their parent directory code paths.

Sadly, images are still not reproducible byte for byte. Document
systemd-repart's $SOURCE_DATE_EPOCH handling and remaining
reproducibility issues in the manpage.
2026-08-28 11:16:29 +02:00
Martin Pitt edbf043333 copy: support clamping the timestamps of copied inodes
Add a `ts_clamp` argument to `copy_tree_at_full()` and
`copy_times_full()` that clamps copied inodes to a given time stamp.
This is the recommended `$SOURCE_DATE_EPOCH` semantics [1] for
reproducible builds. Their non-`_full` APIs keep existing behaviour by
clamping to `USEC_INFINITY`.

atime and mtime are clamped separately: a file that was merely read
after the epoch has to keep its mtime and still lose its atime. E.g. FAT
(EFI partition) stores an access date.

[1] https://reproducible-builds.org/specs/source-date-epoch/
2026-08-28 11:12:56 +02:00
Zbigniew Jędrzejewski-Szmek 378e6c544b udevd: convert to VERB_COMMAND and add --introspect-cli
systemd-udevd is the same binary as udevadm, so the introspection data
describes both commands, from either name. The COMMAND intentionally
owns no verbs — all of udevadm's verbs are defined in udevadm.c right
after its own COMMAND, so that they are attributed to it.

The -V/--version output (GIT_VERSION) is preserved.
2026-08-28 09:59:16 +02:00
Zbigniew Jędrzejewski-Szmek b1a68327bb udevadm-wait: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-wait" option namespace. The verb's one-line
description from the abstract is retained, I think it is good enough
but shorter.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek 2775c49688 udevadm-verify: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-verify" option namespace.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek 2f15edc2ab udevadm-trigger: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-trigger" option namespace.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek 580587643a udevadm-test-builtin: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-test-builtin" option namespace. The list of
built-in commands is appended after the generic help. The man page
reference is now printed before the command list. It'd be somewhat
nicer to have it _after_, but that'd require a lot of plumbing to
split the help generated in two and just doesn't seem worth effort.

The list of commands is now printed to stdout (it went to stderr before),
arguably a backportable bugfix.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek 2ac1195458 udevadm-test: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-test" option namespace.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek 4a7a683d71 udevadm-settle: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-settle" option namespace.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek d77ecb5c37 udevadm-monitor: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-monitor" option namespace.
2026-08-28 09:58:38 +02:00
Zbigniew Jędrzejewski-Szmek d8b733d6dd udevadm-lock: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-control" option namespace. The synopsis
makes use of the new nulstr-argspec functionality:
  > udevadm [OPTION…] lock [OPTION…] COMMAND
  > udevadm [OPTION…] lock [OPTION…] --print
2026-08-28 09:58:36 +02:00
Zbigniew Jędrzejewski-Szmek e939427d5d udevadm-info: use common verb help and add --introspect-cli
The arg_no_pager variable is lifted to udevadm, so that it can be
referenced in the command structure. It's only used for 'udevadm info',
but that's OK. We can later generalize it if wanted.

The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in udevadm.c
and the "udevadm-info" option namespace. --help now goes through the
pager, like other commands with --no-pager.
2026-08-28 09:47:36 +02:00
Zbigniew Jędrzejewski-Szmek 0ba8647c6d udevadm-hwdb: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in udevadm.c
and the "udevadm-control" option namespace. The new VERB_DEPRECATED flag
is used.
2026-08-28 09:47:36 +02:00
Zbigniew Jędrzejewski-Szmek da4f84ae4a udevadm-control: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-control" option namespace. The synopsis
is now "udevadm [OPTION…] control OPTION…".
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 96b091a6b4 udevadm-cat: use common verb help and add --introspect-cli
The custom help() is replaced by the common verb help, which derives the
synopsis, abstract, and option list from the verb declaration in
udevadm.c and the "udevadm-cat" option namespace.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek a35f5d5eba udevadm: convert to VERB_COMMAND and add --introspect-cli
The verbs declare their subcommand option namespaces, so the
introspection data describes the options of every subcommand, nested in
the verb objects.

The bare version number output (a dracut compatibility requirement) is
preserved for --version/-V and the "version" verb.

The "lock" verb's argument specification is simplified to "COMMAND" --
other verbs do not mention their options in the argspec either, and the
subcommand help states where the options may go.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 868d22628c shared/verbs: add flag VERB_DEPRECATED
Previously, verbs were skipped in --help automatically when their
.help field was nil. But this doesn't work in two ways:
- in introspection data we want to show the option, but marked as
  deprecated
- in udevadm (and maybe other programs with verbs with own options in
  the future), we need to show help for the verb.

So add an explicit flag to mark verbs as deprecated and skip them in
help even if .help is set. If there's a footer, print it highlighted
in red automatically.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 4aea8cedd2 shared/verbs: add a footer for verbs
This will be needed for 'udevadm hwdb' which carries a footer.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 84d19dc8f9 shared/verbs: add flag VERB_OPTION_REQUIRED 2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 3cfe456323 shared/verbs: add command_print_verb_help()
A helper to print the help of a single verb, derived entirely from the
data in the SYSTEMD_VERBS and SYSTEMD_OPTIONS sections: the synopsis is
built from the verb name and argspec, the one-line verb help serves as
the abstract, the options come from the verb's option namespace, and the
man page links from the command the verb belongs to. A flag allows
suppressing the man page links for callers which append custom sections.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek efd63ddfbf shared/verbs: turn verb argument specification into nulstr
Like the command-level CommandDescription.argspec, a verb's argspec is now
a nulstr, so that a verb may declare multiple alternative usage lines. The
verbs help table renders one synopsis line per nulstr entry in the
synopsis cell.

All verb argument specifications must gain an explicit NUL suffix. This
is a lot of churn, but I think this needs to be done. For now, there'll
be only one user of the new functionality (i.e. a verb with more than
one argspec), but I think we'll eventually want to use this in other
places too.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 057fc4251a shared/verbs: allow verbs to declare an option namespace
Verbs like udevadm's subcommands parse their own options from a dedicated
option namespace. Allow the namespace to be declared in the verb
definition (via the new VERB_SCOPE_NS* macros), and report the options of
that namespace in the verb's CLI introspection object.

This is conformant with the CLI-Introspection Specification: verbs are
represented as nested command objects, which may carry their own "options"
array just like the top-level command object.
2026-08-28 09:29:04 +02:00
Zbigniew Jędrzejewski-Szmek 23e8e4e80f shared/verbs: rename "footer" to "postscript" in introspection
The spec PR uses that term now. I didn't change the internal
variable name because I don't like the new name.
2026-08-28 09:28:23 +02:00
Martin Pitt e6b35a8f00 repart: report a failed parent directory time stamp
Every other error in `do_copy_files()` reaches the user through
`log_error_errno()` already.
2026-08-28 09:06:38 +02:00
Martin Pitt a7a58fc9a9 copy: fix argument naming in copy_directory_at_full() 2026-08-28 07:51:34 +02:00
Martin Pitt 6d51f6eb04 mkfs-util: fix error reporting in the mkfs child
`r` at that point holds the return value of `pidref_safe_fork_full()`,
which is 0 in the child, so a failing `setenv()` was reported as
"Success".

Also, fix a stray "°".
2026-08-28 07:30:09 +02:00
felix h a11144d0a9 tree-wide: format man page references as foo(1) 2026-08-28 06:34:45 +09:00
Arian van Putten c7837840f5 firstboot: apply hostname via hostnamed varlink API
Previously we just wrote /etc/hostname and returned. The kernel hostname
was left at whatever PID 1 sethostname()'d very early in boot (before
/etc/hostname existed), which meant hostnamectl reported the transient
hostname instead of the static one until the next reboot.

Call io.systemd.Hostname.SetStaticHostname on the running system so
hostnamed writes /etc/hostname and updates the kernel hostname in one
step. If hostnamed is unreachable (masked or absent on minimal images)
fall back to writing /etc/hostname directly. --root=/--image= also keeps
writing the file directly, since hostnamed only manages the running
system.
2026-08-28 06:29:58 +09:00
Zbigniew Jędrzejewski-Szmek 3d0ef4aefe various: mark files with the usual license tags
For .clang-format and pytest.ini, MIT-0 is used because people might want
to copy those.
2026-08-28 06:26:09 +09:00
Yu Watanabe a2de89f622 libc: call epoll_pwait2 syscall directly instead of resolving glibc symbols
As mentioned in a05fe6684a, glibc provides two
wrappers for epoll_pwait2() on 32-bit architectures, and sys/epoll.h,
together with features-time64.h, selects the appropriate one.

To avoid depending on symbols introduced in newer glibc releases, that
commit relied on the glibc internal macro __USE_TIME_BITS64 to determine
which wrapper to use. However, that is incorrect on some architectures.
See:
https://sourceware.org/git/?p=glibc.git;a=commit;h=a4ed0471d71739928a0d0fa3258b3ff3b158e9b9

The above glibc commit introduces a new internal macro,
__USE_TIME64_REDIRECTS, which correctly describes whether the time64
wrapper should be used. However, we cannot rely on it because it was
introduced in glibc 2.40, while our baseline remains glibc 2.34.

Moreover, even after raising the baseline, relying on glibc internal
implementation details is undesirable.

Instead, call the epoll_pwait2 syscall directly. This avoids any
dependency on glibc wrapper selection logic while preserving the original
goal of avoiding newer glibc symbols.

As a side effect, this also enables epoll_pwait2() on musl, which does not
currently provide a libc wrapper for it.

Currently, epoll_pwait2() is only used by sd-event, so this is also the
simplest solution.
2026-08-28 06:19:13 +09:00
Yu Watanabe 82fb7a0297 import: dlopen libacl only when libarchive support is enabled
Otherwise, test-dlopen-note.py fails when libarchive support is disabled
but libacl support is enabled.

Also, log the dlopen_libarchive() failure at LOG_ERR level, matching how
the other failures are already logged.

Fixes #43530.
2026-08-27 17:05:34 +02:00
Luca Boccassi 2de150d7b7 Add experimental manpage marker, use it for sd-sysupdate and move it back to libexecdir (#43533) 2026-08-27 10:46:01 +01:00
Yu Watanabe 445c6ce8a2 compress: several fixlets for decompressor (#43506) 2026-08-27 07:58:38 +09:00
Yu Watanabe daef042536 journal: also allow to store coredump by systemd-coredumpd.service 2026-08-27 05:52:53 +09:00
Yu Watanabe 264ca8f827 coredump: support kernel coredump socket protocol
Since kernel v6.17, we can set a path to unix socket to core_pattern
(with request mode). See also:
https://lore.kernel.org/all/20250603-work-coredump-socket-protocol-v2-0-05a5f0c18ecc@kernel.org/

This introduces a tiny service that prepares and listens on a UNIX
socket to be passed to the kernel core pattern. When a process is
crashed, the kernel connects to the socket, and sends information
about the crashed process and passes coredump through the socket.
The service accepts the connection, and forks a worker process that
receives coredump from the kernel.
2026-08-27 05:52:49 +09:00
Yu Watanabe 0351920ac7 coredump: do not coredump in setting up logger
If log_parse_environment() or log_set_target_and_open() triggers
assertion or so, then we may enter endless loop. Let's disable coredump
earlier.
2026-08-27 05:50:14 +09:00
Yu Watanabe 3fd564e876 coredump: do not try to read si_code more than once
This also renames coredump_context_read_pidfd_info() to
coredump_context_read_code(), as it only reads COREDUMP_CODE.

This does not change anything effectively, as the function is called
only once. Preparation for later change.
2026-08-27 05:50:14 +09:00
Yu Watanabe d81e6b93d6 process-util: split out procfs_get_stat_flags() from pid_is_kernel_thread() 2026-08-27 05:50:14 +09:00
Yu Watanabe 059b41654f include: add missing definition of PF_DUMPCORE 2026-08-27 05:50:14 +09:00
dongshengyuan 2ff5250ae7 homework: skip LUKS fallocate for metadata operations
UpdateHomeEx needs to set up the home temporarily so that it can
write the refreshed identity records. Inspect and password changes use
the same setup path for metadata-oriented work.

For LUKS homes with luksDiscard=no, home_setup_luks() fully
allocates the backing image while setting it up. If diskSize=max was
previously written to a sparse image, this can fail with ENOSPC before
the user can disable auto-resize mode again.

Add a setup flag that lets metadata operations skip the full-image
fallocate step. Real create, activate, and resize paths keep the
existing allocation behavior.

Before, reproduced on Ubuntu 26.04 with /home on tmpfs:

  homectl create reprohomed \
          --storage=luks \
          --fs-type=btrfs \
          --disk-size=300M \
          --auto-resize-mode=shrink-and-grow \
          --luks-discard=no
  homectl update reprohomed --disk-size=max
  dd if=/dev/zero of=/var/tmp/homed-repro/filler bs=1M count=500
  systemctl restart systemd-homed.service
  homectl update reprohomed --auto-resize-mode=off

  Operation on home reprohomed failed:
  Not enough disk space for home reprohomed

Fixes #34527

Follow-up for: ab3b6fcb40
2026-08-27 04:54:38 +09:00
Yu Watanabe d8c0fa3cb8 import: finalize decompressor
Otherwise, the result may be truncated, or trailing garbage may be
silently accepted.
2026-08-27 04:36:57 +09:00
Yu Watanabe dac2b39405 compress: strictly check if stream finished on decompress
Previously, even when the compressed data was truncated, or had
trailing garbage, the decompressor might not detect it.

To fix the issue, update the check if stream is finished.
With this change, now decompressor_push() must be called with
size == 0 to finalize the stream.
2026-08-27 04:36:57 +09:00
Yu Watanabe d9b6e8663c compress: check cursor position in should_sparse()
Otherwise, the result will be broken, as skipped area by lseek() is not
cleared.
2026-08-27 04:36:57 +09:00
Yu Watanabe f577c38a52 compress: inline error handling 2026-08-27 04:36:50 +09:00
Yu Watanabe fefe8f3132 compress: use consistent error code for failure in BZ2_bzDecompressInit() 2026-08-27 04:36:29 +09:00