Commit Graph
90993 Commits
Author SHA1 Message Date
Yu Watanabe 1a15ce95ac sysupdate: fix transfer config parsing and cleanup regressions (#43287) 2026-08-06 20:20:29 +09:00
dongshengyuan aec96077fa shell-completion: add updatectl completions
Add bash and zsh completions for updatectl commands and options.
Complete targets and host features dynamically from updatectl output.

Closes #43277
2026-08-06 12:12:09 +01:00
dongshengyuan a3839ade4e sysupdate: allow long CurrentSymlink= paths
CurrentSymlink= accepts a symlink path, but the parser used NAME_MAX
for specifier expansion. Absolute and target-relative paths can be
longer than one filename component while still staying below PATH_MAX.

Reproducer: configure CurrentSymlink= to a path longer than NAME_MAX
and run systemd-sysupdate list with debug logging.

Before: sysupdate logged that CurrentSymlink= specifier expansion
failed and ignored the setting.

After: the transfer parses cleanly and list emits no CurrentSymlink=
specifier expansion warning.

Follow-up for: 43cc7a3ef4
2026-08-06 10:06:00 +08:00
dongshengyuan 215c438372 sysupdate: allow long metadata URLs
138829b784 moved Documentation=, AppStream=, and related URL parsing
into sysupdate-config.c, but kept NAME_MAX as the specifier expansion
limit. These settings are URLs, not filenames.

Reproducer: configure a feature Documentation= URL longer than
NAME_MAX and run systemd-sysupdate features FEATURE.

Before: the URL was ignored after ENAMETOOLONG during specifier
expansion.

After: features FEATURE prints the long Documentation URL.

Follow-up for: 138829b784
2026-08-06 10:06:00 +08:00
dongshengyuan 753b0a6e24 sysupdate: allow resetting version filters
systemd drop-ins use an empty assignment to reset list and scalar
settings. MinVersion= and ProtectVersion= treated an empty assignment
as an invalid version and kept the earlier value active.

Reproducer: define MinVersion=v2 and ProtectVersion=v1, then add a
drop-in with empty MinVersion= and ProtectVersion= assignments.

Before: sysupdate logged invalid-version warnings for the empty values.

After: list logs no invalid-version warnings and shows both v1 and v2.

Follow-up for: 43cc7a3ef4
2026-08-06 10:06:00 +08:00
dongshengyuan 073965ab2f sysupdate: parse PartitionFlags= as hexadecimal
sysupdate.d(5) documents PartitionFlags= as a hexadecimal integer, and
sysupdate patterns format partition flags with PRIx64. The parser used
safe_atou64(), which rejected values such as abcdef.

Reproducer: set PartitionFlags=abcdef in a partition target transfer
and run systemd-sysupdate list with debug logging.

Before: sysupdate logged:
Failed to parse partition flags, ignoring: abcdef

After: the transfer parses cleanly and list emits no partition-flags
parse warning.

Follow-up for: 43cc7a3ef4
2026-08-06 10:06:00 +08:00
dongshengyuan 09f8b59ac3 sysupdate: remove current partial instance names
48fff6a27a switched filesystem transfers to predictable
.sysupdate.partial.* names, but transfer_remove_temporary()
still only scanned the legacy .# prefix.

Remove the current partial prefix there too. Pending instances
are deliberately left for transfer_vacuum(), so ProtectVersion=
can still spare protected pending versions.

Follow-up for: 48fff6a27a
2026-08-06 10:06:00 +08:00
dongshengyuan a3ab9d2c1a sysupdate: honor default MatchPartitionType= for partitions
sysupdate.d(5) documents linux-generic as the default
MatchPartitionType= for partition targets. After 10eaca4159,
omitting the option left partition_type_set false and update failed
before acquiring the image.

Reproducer: create a partition target transfer without
MatchPartitionType= and run systemd-sysupdate update.

Before: update failed with:
Partition type must be set for partition targets.

After: update succeeds on a linux-generic slot and installs the
version, leaving the GPT label as part-v1.

Follow-up for: 10eaca4159
2026-08-06 10:06:00 +08:00
rodin-ia f807a6f26d hwdb: Add HP EliteBook 845 G7 Fn+F11 airplane mode key mapping
Add a hwdb entry for the HP EliteBook 845 G7 laptop.

The Fn+F11 airplane mode key is reported as KEY_F8 by the atkbd
driver. Map it to !wlan to expose the correct wireless radio switch
event to userspace.
2026-08-06 00:42:07 +01:00
Yu Watanabe 0e410a6b9d sd-journal: prefer exact cursor match after seek (#43297)
Fixes #31516.
2026-08-06 05:48:05 +09:00
Yu Watanabe 5f53643138 sysctl: add --verify option to verify written values (#43258) 2026-08-06 05:46:11 +09:00
Frantisek Sumsal 2ade235150 Revert "ci: fix /etc and /usr ownership"
The issue with the GHA images should be resolved.

This reverts commit 6d7a2ec6ba.
2026-08-06 05:42:54 +09:00
Thomas Kopp a01c001bf3 hwdb: Add accelerometer matrix for SHIFTbook 1
Fixes autorotation on the SHIFTbook 1
2026-08-06 05:42:10 +09:00
Hüseyin Kutsi Balcı cbd17d9f8d man: fix seven cross-references with the wrong section number
Each of these citerefentry targets exists, but is referenced with a
section it is not installed in, so the generated link does not resolve
and 'man <page>' sends the reader to the wrong section.

  systemd-confext              1 -> 8
  systemd-cryptsetup@.service  5 -> 8
  systemd-firstboot.service    8 -> 1  (three places)
  systemd-nspawn               8 -> 1
  systemd-userdbd.service      7 -> 8

The section for each was taken from the refmeta of the page that
defines it. In systemd.special.xml the neighbouring reference to
systemd-veritysetup@.service already uses 8, which is what the
cryptsetup one should have been.
2026-08-06 05:40:45 +09:00
Confusedphoton 373a4020d5 hwdb: mark ASUS ROG Flow Z13 (GZ302EA) touchpad as internal
The ASUS ROG Flow Z13 (GZ302EA) keyboard/touchpad (USB 0B05:1A30) is
attached through a USB port that firmware reports as removable.
Because of that, 65-integration.rules sets
ID_INPUT_TOUCHPAD_INTEGRATION=external, and libinput skips
disable-while-typing (DWT) for the device.

The touchpad is physically integrated into the tablet's keyboard
accessory, which has no supported standalone/external use case, so
add a hwdb entry in 70-touchpad.hwdb that overrides
ID_INPUT_TOUCHPAD_INTEGRATION=internal, restoring DWT. This mirrors
the existing Microsoft Surface Type Cover entry, which addresses the
same root cause.
2026-08-06 05:40:32 +09:00
Frantisek Sumsal 8e762e6b9f test: verify cursor-seeking in the opposite direction as well 2026-08-05 21:06:43 +02:00
Frantisek Sumsal 868d07d1d4 sd-journal: prefer exact cursor match after seek
Since 262299dccb compare_locations() falls
through to a realtime-based comparison in compare_boot_ids() if the
compared entries have different boot IDs (and seqnum IDs). This can,
however, cause us to pick up the wrong entry/file on systems with
unreliable/missing RTC, where early-boot entries of a boot might have
earlier realtime timestamp compared to the previous boot.

For example, here's a minimal reproducer consisting of two journal files
containing three entries from two separate boot IDs:

$ journalctl --file one.journal -o export
__CURSOR=s=ba37c62fcacf406aad088166c4963cd1;i=1;b=c220efc91dd440deb89d82c98ddb11a5;m=186a0;t=1e8480;x=39d4323a8e5a248d
__REALTIME_TIMESTAMP=2000000
__MONOTONIC_TIMESTAMP=100000
__SEQNUM=1
__SEQNUM_ID=ba37c62fcacf406aad088166c4963cd1
_BOOT_ID=c220efc91dd440deb89d82c98ddb11a5
NUMBER=1

$ journalctl --file two.journal -o export
__CURSOR=s=9d15197efcc54d8ca5d6e7cce28373e2;i=1;b=686dc35e78f64b6ba126018ab6e8bae9;m=186a0;t=f4240;x=57db1c7bd38b37ed
__REALTIME_TIMESTAMP=1000000
__MONOTONIC_TIMESTAMP=100000
__SEQNUM=1
__SEQNUM_ID=9d15197efcc54d8ca5d6e7cce28373e2
_BOOT_ID=686dc35e78f64b6ba126018ab6e8bae9
NUMBER=2

__CURSOR=s=9d15197efcc54d8ca5d6e7cce28373e2;i=2;b=686dc35e78f64b6ba126018ab6e8bae9;m=30d40;t=2dc6c0;x=3513732159948113
__REALTIME_TIMESTAMP=3000000
__MONOTONIC_TIMESTAMP=200000
__SEQNUM=2
__SEQNUM_ID=9d15197efcc54d8ca5d6e7cce28373e2
_BOOT_ID=686dc35e78f64b6ba126018ab6e8bae9
NUMBER=3

The first file (one.journal) contains a single entry from the first boot
(c220efc91dd440deb89d82c98ddb11a5) and a realtime timestamp of 2s. The
second file (two.journal) contains two entries from the second boot
(686dc35e78f64b6ba126018ab6e8bae9) - the first entry has a realtime
timestamp of 1s (i.e. _earlier_ than the tail timestamp of the first
boot), and the second entry has a realtime timestamp of 3s (i.e.  after
a time correction).

This works fine for forward iteration, but seeking directly to the
second entry is when things go south:

First entry:
$ python3 <<EOF
c = "s=ba37c62fcacf406aad088166c4963cd1;i=1;b=c220efc91dd440deb89d82c98ddb11a5;m=186a0;t=1e8480;x=39d4323a8e5a248d"
from systemd import journal; j = journal.Reader(path="."); j.seek_cursor(c); j.get_next(); print(j.test_cursor(c))
EOF
True

Second entry:
$ python3 <<EOF
c = "s=9d15197efcc54d8ca5d6e7cce28373e2;i=1;b=686dc35e78f64b6ba126018ab6e8bae9;m=186a0;t=f4240;x=57db1c7bd38b37ed"
from systemd import journal; j = journal.Reader(path="."); j.seek_cursor(c); j.get_next(); print(j.test_cursor(c))
EOF
False

That's because:
  - we call sd_journal_seek_cursor(...) and parse it (seqnum, seqnum_id,
    boot_id, realtime, ...)
  - we call sd_journal_next() -> real_journal_next() which iterates over
    all open journal files to find all candidate entries and pick the
    best one
  - for each journal file we call next_beyond_location()
  - for next_beyond_location(one.journal) we get:
    - last_direction is _DIRECTION_INVALID, so we call find_location_with_matches()
    - we fall all the way through to journal_file_move_to_entry_by_realtime()
    - here we try to find the first entry with realtime >= 1s; this file
      has only one entry with realtime = 2s which matches
  - we got a match and new_file is unset, so we set it to one.journal
  - for next_beyond_location(two.journal) we get:
    - we fall through to find_location_with_matches()
    - here we have a matching seqnum, so we call journal_file_move_to_entry_by_seqnum()
  - we got another match but new_file is set, so we call compare_locations(two.journal, one.journal):
    - we fall through to compare_boot_ids()
    - we get the tail timestamps of both journal files and return
      CMP(second boot, first boot) -> CMP(3s, 2s) = 1
  - this bubbles up back to real_journal_next() where found = false, so
    new_file remains one.journal (the wrong journal file)
  - this is followed by set_location(one.journal), which makes the
    following sd_journal_test_cursor() call fail, as the
    boot_id/seqnum_id/... of the current position don't match with the
    cursor

To fix this, let's track the journal file that holds the exact cursor
match, and override the chosen candidate if needed once we process all
open journals.

Resolves: #31516
2026-08-05 21:06:43 +02:00
Hashim Khan c59ad15aec man: clarify enqueue-marked uses try-restart semantics
Document that needs-restart/needs-reload markers follow try-restart /
try-reload behavior for enqueue-marked, and drop the duplicated note
from the deprecated --marked alias entry.
2026-08-06 01:53:42 +09:00
dongshengyuan 756399c79e repart: fix shallow_join_strv() dedup scan
shallow_join_strv() shallow-copies the first strv into a temporary
array, then uses strv_contains() while appending entries from the
second strv. That helper requires a NUL-terminated strv.

Keep the temporary array terminated before each lookup. After an
append, the previous terminator is overwritten, so postponing the
NULL write until after the loop would let the next strv_contains()
scan past the initialized entries.

This is a correctness fix, not an optimization: it avoids a
potential out-of-bounds read when deduplicating the second strv.
2026-08-05 23:56:41 +09:00
dongshengyuan 1a43aec562 sd-netlink: append multipart messages in O(1)
Commit 52ceba53d3 made multipart replies append in receive
order, but each append walked the chain from the head.

Cache the tail on the chain head, so new fragments can be
linked directly. The visible next-pointer chain and order stay
unchanged.

Follow-up for: 52ceba53d3
2026-08-05 23:18:09 +09:00
Semyon Klintsov 0168430d91 dbus: allow FreezeUnit and ThawUnit D-Bus requests (#43292)
This change adds explicit D-Bus policy rules to allow calling the
Freeze and Thaw methods on the systemd interfaces.

- Add D-Bus policy rules for Manager interface FreezeUnit/ThawUnit methods
- Add D-Bus policy rules for Unit interface Freeze/Thaw methods
2026-08-05 14:44:25 +01:00
lzwind 02b2eb9ede man: clarify that --fido2-with-user-presence= may not be supported (#43266)
Reword the note for --fido2-with-user-presence= to make it clear that the
setting has no effect if the token does not support the up feature, or does
not allow the user presence requirement to be enabled or disabled for the
requested operation. Drop the surrounding parentheses and the spurious
"in other contexts" qualifier.

Apply the same rewording to the sibling --fido2-with-client-pin= and
--fido2-with-user-verification= options so the three parallel FIDO2
entries stay consistent.

Fixes #23632.
2026-08-05 16:59:47 +09:00
Yu Watanabe 0f8c9182f3 pcrlock: error out if requested PCR was dropped (#43260)
- --strict=/--full moved to the OPTION_LONG() parser framework that
replaced getopt in the meantime
- the is-supported commit is dropped, main grew that verb independently.
That also gets rid of the early tpm2_support() gate that broke CI back
then, and TEST-70-TPM2 runs with a software TPM these days anyway
- special_glyph() → glyph() renames
- the log table PCR filter needs an EVENT_LOG_RECORD_IS_PCR() guard now
that the event log has NV-index records
2026-08-05 13:17:21 +09:00
Yu Watanabe 3273e223ad man: mention userdb.transient.* credentials in userdbctl(1)
These were only explained in systemd.system-credentials(7).
Let's also list them in userdbctl(1).

Follow-up for cc43510a13.
2026-08-05 11:38:46 +09:00
Yu Watanabe 7b2906af9f test: split out inline python script
Then, we can apply ruff to the script.
2026-08-05 11:37:29 +09:00
Ludwig NusselandAkarithos d2bb93565c pcrlock: skip make-policy tests if environment lacks TPM support
make-policy needs to write into an NVindex. For that we need an actual
TPM.

Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Ludwig Nussel 8ab0aaea3c pcrlock: honor pcr arg for filtering list-components 2026-08-04 14:11:43 -07:00
Ludwig Nussel 2e7c9a24a1 pcrlock: ignore empty device path
Don't mark records with empty device path as invalid. When shim is in
use such records are normal :-/
https://github.com/rhboot/shim/issues/642
2026-08-04 14:11:43 -07:00
Ludwig NusselandAkarithos 230f171837 pcrlock: reduce verbosity a bit
Not sure what a good compromise between too much and too less is.
Semi happy with SYSTEMD_LOG_LEVEL=notice now.

Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Ludwig NusselandAkarithos 8f631ffe05 pcrlock: limit list view to selected PCRs
Makes it easier to inspect specific PCRs

Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Ludwig NusselandAkarithos d1cec47900 pcrlock: add --strict option
Add a --strict option that makes sure all PCRs for which components were
found are indeed included in the set of predicted PCRs. Instead throw an
error. Avoids creating a policy less secure than requested.

Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Ludwig NusselandAkarithos dcde7c750d pcrlock: don't add checkmark for missing component
Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Ludwig NusselandAkarithos 18fed0d0d4 pcrlock: shorten displayed hash bytes
Shorten number of bytes show of sha256 hashes. Similar to git, makes
output less wide and more readable.

Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Ludwig NusselandAkarithos be9c38a77d pcrlock: exclude red and green color ranges
Using red and green in the output is rather confusing as that is
normally associated with good or bad like in the checkmark columns.
So let's exclude those colors from the display.

Co-authored-by: Akarithos <277667353+Akarithos@users.noreply.github.com>
2026-08-04 14:11:43 -07:00
Emilio Sepulveda a8391e4b78 po: Translated using Weblate (Interlingua)
Currently translated at 22.3% (64 of 286 strings)

Co-authored-by: Emilio Sepulveda <emism.translations@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/ia/
Translation: systemd/main
2026-08-05 01:25:06 +09:00
Weblate Translation Memory c152901e6c po: Translated using Weblate (Italian)
Currently translated at 100.0% (286 of 286 strings)

Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/it/
Translation: systemd/main
2026-08-05 01:25:06 +09:00
Emanuele Petriglia 1334398d7d po: Translated using Weblate (Italian)
Currently translated at 100.0% (286 of 286 strings)

Co-authored-by: Emanuele Petriglia <inbox@emanuelepetriglia.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/it/
Translation: systemd/main
2026-08-05 01:25:06 +09:00
Daan De Meyer 2dd07068a3 vmspawn: apply --grow-image= to the ephemeral copy
Combining --ephemeral with --grow-image= truncated the file passed to
--image= to the requested size before the VM was started, so a mode whose
entire purpose is to leave the original image untouched modified it on
disk.

Skip growing the original image when running ephemeral, and instead create
the qcow2 overlay with the requested virtual size, so the guest sees the
larger disk while the base image stays read-only. As only the overlay is
sized in that case, the base image format no longer matters, so allow
--grow-image= together with qcow2 images when running ephemeral. The round
up to a multiple of 4096 moves to option parsing so both paths apply the
same value.

The vmspawn drive test grows an ephemeral VM and checks that the image
passed to --image= keeps its size, and that the overlay QEMU runs off is
created at the requested one.
2026-08-04 23:21:55 +09:00
dongshengyuan 0b7c68eb3a userdb: apply UUID filters to group records
group_record_match() handled the other filters, but ignored match->uuid,
so userdbctl group --uuid=... could still return non-matching groups.

Add the same UUID check used by user_record_match().

Reproduced locally:
build/userdbctl --uuid=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa \
  --output=json group root

Before result:
The command succeeded and printed the root group record.

Follow-up for: 466562c69b
2026-08-04 22:46:41 +09:00
Luca Boccassi 4e3fff9061 Revert "macro: EDG compiler frontends doesn't support enum types"
The EDG parser version 6.8 now supports C23 enums with fixed underlying
types, and VSCode ships with it, so this workaround can now be removed
without breaking VSCode's internal parser.

https://en.cppreference.com/c/compiler_support/23

This reverts commit e01ca3afdb.
2026-08-04 22:46:13 +09:00
dongshengyuan fd828b4bd6 test-nss-users: quote empty member lists
Use shell_maybe_quote() with SHELL_ESCAPE_EMPTY when
logging joined group and shadow group member vectors,
so empty vectors are rendered explicitly as "".

Follow-up for: f0d1266821

Follow-up for: 2eaca3ea5f
2026-08-04 22:45:15 +09:00
Simon de Vlieger bdb5d53d4f 60-ukify: skip /proc/cmdline in containers
When running inside a container (during image builds or such),
`/proc/cmdline` belongs to the host and would leak the host's root= (or a
faked placeholder like root=/dev/osbuild) into the UKI.

Mirror the same guard that `90-loaderentry.install` has: check
`systemd-detect-virt --container` before falling back to `/proc/cmdline`,
and return an empty cmdline if we are in a container to ensure both
modes (`uki` and `bls`) work the same.

Signed-off-by: Simon de Vlieger <cmdr@supakeen.com>
2026-08-04 19:18:17 +09:00
Yu Watanabe 7314e1cf76 options: use strv_join()
strv_join() is an alias of strv_join_full() with NULL for prefix and
false for escape_separator. Let's use the shorter form.
2026-08-04 19:17:56 +09:00
Yu Watanabe 2bb1f6a651 env-file: cleanups for write_env_file_label()
Explicitly call label_ops_post() where necessary with specific
arguments. Previously, regardless if fopen_tmpfile_linkable_at()
success, label_ops_post() was called but its argument was heavily
conditionalized. Let's call it both on failure and success cases
with specific arguments. This should be easy to read.

This also
- moves variable declarations where used,
- drops unnecessary boolean flag call_label_ops_post.

No functional change. Just reafactoring.

Hopefully silence CID#1664328, though it is false-positive.
2026-08-04 14:37:52 +09:00
Liu Zheng 23058066e6 repart: pass FileSystemSectorSize= to mkfs.erofs
The erofs branch in make_filesystem() never passed the sector size to
mkfs.erofs, so FileSystemSectorSize= was silently ignored for erofs
partitions. mkfs.erofs defaults to the page size (e.g. 16K on aarch64),
which is too large for some use cases such as UFS with 4K blocks.

Pass -b <sector_size> to mkfs.erofs, but only when it is smaller than the
page size, since mkfs.erofs defaults to the page size and rejects larger
values. This matches how the other supported filesystems (xfs, ext4,
btrfs, f2fs, vfat) already handle sector_size.

Fixes #43238
2026-08-04 14:37:00 +09:00
Liu Zheng 205a83833e repart: document implied CopyFiles= denylists
systemd-repart implicitly excludes the contents of APIVFS and temporary
directories (/proc, /sys, /dev, /tmp, /run, /var/tmp) when copying files
via CopyFiles=. When populating a root partition, the contents below the
mount points of other partitions in the image (e.g. /boot, /efi for an
esp partition) are excluded as well, so that data belonging to a separate
partition is not duplicated into the root file system.

Neither of these implied denylists was documented, which surprised users
(see #32651). Document them, and explain how to work around the
mount-point exclusion by adding an explicit CopyFiles= entry for the
directory in question.

Fixes #32651
2026-08-04 10:28:59 +09:00
Frantisek Sumsal 36a9875c1d sysusers: gracefully handle existing group in /etc/gshadow
systemd-sysusers currently skips entries for groups that already exists.
However, if a group exists only in /etc/gshadow and not in /etc/group,
systemd-sysusers panics:

~# groupdel sgx
~# systemd-sysusers; echo $?
Creating group 'sgx' with GID 106.
0
~# systemd-sysusers; echo $?
0
~# sed -i '/sgx/d' /etc/group
~# systemd-sysusers; echo $?
Creating group 'sgx' with GID 106.
/etc/gshadow: Group "sgx" already exists.
1

To fix this, let's mirror the logic from the user path
(write_temporary_shadow()) where we simply drop the user from the "todo"
queue if it already exists in /etc/shadow instead of throwing an error.
2026-08-04 08:17:04 +09:00
Yu Watanabe f4cb4596a3 core/bpf: avoid redundant BPF program loading (#43234)
Replaces #43211 and #43213.
2026-08-04 08:10:00 +09:00
dongshengyuan 05ea7e87b6 resolvectl: support JSON output for openpgp and tlsa
The openpgp and tlsa verbs rejected --json= even though they
already determine the RR type they query. Allow JSON output for
these shortcut commands.

Accept matching explicit --type= values as well, but reject
mismatched types so openpgp only queries OPENPGPKEY records and
tlsa only queries TLSA records.

Refuse unauthenticated key records in JSON format so scripts do
not accidentally consume cryptographic DNS data that would only
produce a warning in human-readable output.

Fixes #43245
2026-08-04 08:08:33 +09:00
Shivank Sharma 1652be7df8 docs: fix typo in man/sd-device.xml
Fix spelling of "managed" in man/sd-device.xml.
2026-08-03 16:26:07 +01:00