Commit Graph
91287 Commits
Author SHA1 Message Date
Zbigniew Jędrzejewski-Szmek 044ebd7e54 executor: convert to VERB_COMMAND and add --introspect-cli
The help is looked up by explicit name: in the multicall configuration
the systemd and systemd-executor commands share one binary.
2026-08-26 12:15:35 +02:00
Zbigniew Jędrzejewski-Szmek 65510d4cba services: convert to VERB_COMMAND and add --introspect-cli
This converts systemd-homed, -hostnamed, -importd, -localed, -logind,
-machined, -networkd, -portebled, -resolved, -sysupdated, -timedated,
and -timesyncd.

The service name and description move from service_parse_argv() arguments
into a COMMAND() description that each daemon now defines. The
service_parse_argv() macro captures the calling binary's verb section,
where that COMMAND is found, while the options are still defined and
parsed in libshared, in the new "service" option namespace that each
COMMAND references. (The named namespace makes sure that options defined
by other translation units in libshared can never leak into the
services' parsers.)

The supported features are declared via option group filtering: each
COMMAND lists "Options" plus "Bus introspection" and/or "Runtime scope".
Unsupported options are now rejected by the parser as unknown options
(and are not shown in --help), replacing the runtime "This service does
not support …" errors.

The help output changes slightly: the "Bus introspection" and "Runtime
scope" option groups now get their own headings, and some descriptions
were reworded to the imperative form used elsewhere.
2026-08-26 12:15:25 +02:00
Zbigniew Jędrzejewski-Szmek ed595e6b67 basic/argv-util: drop unused code 2026-08-26 12:15:16 +02:00
Zbigniew Jędrzejewski-Szmek 9d2178b4a8 integritysetup: mark as public in meson
This means that the program is tested for --help and --version,
but doesn't mean that it's more or less supported.
2026-08-26 12:15:06 +02:00
Zbigniew Jędrzejewski-Szmek 477d08b3a9 integritysetup: convert to VERB_COMMAND and add --introspect-cli
Standard parse_argv() func is added. --version is now accepted
(previously only the help forms were recognized, via argv_looks_like_help()).

The synopsis changes from "systemd-integritysetup COMMAND ..." to the
standard "systemd-integritysetup [OPTION…] COMMAND …", and the help output
gains an Options section. "help" as the first argument keeps working via
the hidden common help verb.

Previously, we'd just print help and exit with success if no arguments
were given. This seems unexpected and wrong. The program now prints the
usual error message:
  Command verb required (one of attach, detach, help).
2026-08-26 12:15:06 +02:00
Zbigniew Jędrzejewski-Szmek 3694241e3f shared/verbs: add helper to call command_print_help_full with name only
I didn't do this previously because I thought that there wouldn't
be too many callers. But it turns out that there're quite a few.
2026-08-26 12:14:50 +02:00
Zbigniew Jędrzejewski-Szmek f976133dbf mount: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added.

Options are now in two groups: "Common options" and Mount options". In
--help, for systemd-mount, both groups are shown. For systemd-umount, only
the first. This changes the behaviour a bit: previously, both groups were
shown together as one list. I think the new behaviour is actually a bit
better, because it makes it easier for the user to figure out that the
commands share common options and one of the commands has its private
second group. But if people think that the previous behaviour should
be restored, we could add a display options to squish the groups back
together.

--help now goes through the pager, like other commands with --no-pager.
2026-08-25 09:36:33 +02:00
Zbigniew Jędrzejewski-Szmek 5f45122e75 shared/verbs: allow commands to filter option groups
So far, option groups were only used for display: when parsing options,
the group markers were ignored and all options within a namespace were
considered as potential matches. The group was reported in introspection
data and used as section seperator in help display. To allow a single
option namespace to be used for two commands, pipe through a nulstr with
option group names to look at when parsing options. The field is set in
the Command description and used in various option-handling contexts:
- when parsing and looking for an option, do not consider the entries
  that are in the group that is not listed in the nulstr,
- when listing options in help or introspection, skip over unlisted
  groups.

The verbs_find_verb and verbs_find_command helpers are adjusted to have
a consistent interface.
2026-08-25 09:33:59 +02:00
Zbigniew Jędrzejewski-Szmek dfe557dc7c sysext: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. --help now goes through the pager, like other
commands with --no-pager.

Also, previously, -h/--help/--version were listed in the "Commands"
section. This was cute, but recreating this in the new scheme would
be complicated. Also, it seems unnecessary. --help/--version and some
other commands terminate the program in all binaries, so they could
be considered "commands" in all cases. But we printed them together
with verbs only in a few cases. So I think it's fine to move them
back to the "Options" section. This makes the description of options
much more consistent between different programs.
2026-08-25 09:33:58 +02:00
Zbigniew Jędrzejewski-Szmek b62d32c7b5 shared/verbs: add concept of "shared verbs"
This allows commands like systemd-sysext + systemd-confext to be handled
without duplicating entries in the verbs table. The basic idea is to have
the following layout in the SYSTEMD_VERBS section:

  VERB_COMMAND_MARKER → "systemd-sysext", .flags = COMMAND_VERBS_SHARED
  VERB_COMMAND_MARKER → "systemd-confext", .flags = COMMAND_VERBS_SHARED
  VERB("status"),
  VERB("merge"),
  ...

And then in places where we want to work on the verbs, we skip over the
verb entries with VERB_COMMAND_MARKER and COMMAND_VERBS_SHARED flag set.
2026-08-25 09:33:53 +02:00
Zbigniew Jędrzejewski-Szmek 2b4c6dda9d kernel-install: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The note about invocation as 'installkernel' is
kept as the footer. Verb and option column widths are kept separate, since
the verb table is very wide. --help now goes through the pager, like other
commands with --no-pager.

A separate COMMAND block is included for installkernel, but it is only
used for introspection data.
2026-08-25 09:33:52 +02:00
Zbigniew Jędrzejewski-Szmek 2364f0d7c8 systemctl: describe the halt/poweroff/reboot/shutdown compat commands
The custom halt_help() and shutdown_help() are replaced by COMMAND()
descriptions (one per command name, halt/poweroff/reboot sharing the
"halt" option namespace), and --introspect-cli is added to both parsers.
halt/poweroff/reboot now each reference their own man page name.
2026-08-25 09:33:51 +02:00
Zbigniew Jędrzejewski-Szmek 4cf46d47a2 shared/verbs: allow commands to specify footer highlighting
In practice I think this will ever only be used with ansi_highlight_red(),
but it's cleaner to add this generic extension rather than e.g. a boolean
highlight_footer_red.

The options is passed through via command_print_help_full(), not through
the COMMAND structure, which means that commands with 'help' verb are not
covered by this. The red footer highligting is used for legacy commands,
which don't have verbs, so I think this is OK. Making it generic and
covering 'help' verbs would require more refactoring, and I think it
doesn't make sense to add it until it's actually needed.
2026-08-24 13:46:21 +02:00
Zbigniew Jędrzejewski-Szmek 16d0cbf04b systemctl: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The generic help-verb check in the test is
filtered out, since systemctl's "help" verb shows unit manuals and fails
without arguments.
2026-08-24 13:45:11 +02:00
Zbigniew Jędrzejewski-Szmek 1cf40c9c72 shared/verbs: stop requiring an explicit program name
Almost all programs are simple and have only a single command. When
printing options, let's just use the first COMMAND block found by default.
This means we can drop the explicit program-name argument and reduce
copy&paste boilerplate.
2026-08-24 13:45:07 +02:00
Stephanie Wilde-Hobbs ac80a8f4f3 hwdb: label Lenovo ThinkPad X1 Tablet Gen 3 trackpoint as pointing stick
The trackpoint of the ThinkPad X1 Tablet Gen 3 detachable keyboard (USB
17EF:60B5) lives in the same HID interface as the touchpad, which is
bound to hid-multitouch. The kernel never sets INPUT_PROP_POINTING_STICK
for it, so input_id classifies the trackpoint as a plain mouse.

Mark it as a pointing stick so libinput applies trackpoint acceleration
instead of the mouse acceleration profile.

The interface also exposes a second mouse node without a middle button;
the modal match keys on the button set (k110,111,112) to select only the
trackpoint node and leave the touchpad and the other mouse node
untouched.
2026-08-20 04:53:28 +09:00
Andrew Dunn 8e3d6dc535 crypto-util: zero-pad ECC point coordinates to curve width
ecc_pkey_to_curve_x_y() marshalled the affine point coordinates with
BN_num_bytes() + BN_bn2bin(), which produce the minimal big-endian
encoding and strip any leading zero bytes. The affine coordinates are
elements of the curve's underlying field, though, and consumers expect
them at the fixed field width.

About 1 in 256 keys per coordinate has a most significant zero byte on
the curves whose field width is a whole number of bytes, and about 1 in 2
on P-521, where only the low bit of the leading byte is ever set. The
coordinate then comes out one or more bytes short of the field width. When
that happens tpm2_tpm2b_public_from_openssl_pkey() builds a TPM2B_PUBLIC
whose unique.ecc.x or .y is undersized. The TPM 2.0 reference
implementation requires each coordinate size to equal the key size in
bytes, so TPM2_LoadExternal() rejects the public area with TPM_RC_KEY.
The name a TPM derives for the object also stops matching the name
systemd computes in software, because the name hashes the marshalled
public area.

For a signed PCR policy the key is only round-tripped through the TPM at
unlock time, so an enrolled key with a leading-zero coordinate is
accepted by systemd-cryptenroll and systemd-measure and only fails when
the volume is first unlocked, with:

    Esys_LoadExternal() Esys Finish ErrorCode (0x000002dc)
    Failed to unseal secret using TPM2: State not recoverable

Derive the curve's field width from the EC group degree and zero-pad both
coordinates to it with BN_bn2binpad(). Padding a full-width coordinate is
a no-op, so only keys that a reference-conformant TPM rejects today change
their marshalling; no enrollment that currently unlocks changes behavior.
Every caller of this converter inherits the fix, including the
systemd-creds public-key binding.

Because the width now comes from the group rather than from the BIGNUM
being written, BN_bn2binpad() can fail where BN_bn2bin() could not, so
both calls return -EIO rather than asserting. It reports that through its
return value without touching the OpenSSL error queue, so these use
log_debug_errno() rather than log_openssl_errors(). EC_GROUP_get_degree
is file-local, matching the other libcrypto symbols used only here.

The tests pin the full expected coordinates for a P-384 key and a P-521
key that each have a leading zero byte. test-tpm2 gains a case pinning
the TPM object name for the P-384 key, because the name is derived from
the marshalled public area and this change alters it for exactly those
keys a reference-conformant TPM rejects today.
2026-08-20 04:06:04 +09:00
r-vdp dc4108c43c network: re-solicit RAs when the link MAC changes
A MAC change can mean the link joined another network, e.g. on an
active-backup bond failover with FailOverMACPolicy=active. NDisc only
solicits when it starts, so IPv6 sat stale until the next unsolicited
RA. Restart NDisc to solicit immediately.
2026-08-20 04:05:12 +09:00
Stephanie Wilde-Hobbs fc08ae472c hwdb: mark Lenovo ThinkPad X1 Tablet Gen 3 touchpad as internal
Similar to d13c07ecd8 and 373a4020d5, 65-integration.rules sets
ID_INPUT_TOUCHPAD_INTEGRATION=external, and libinput skips
disable-while-typing (DWT) for the device.

The touchpad is integrated into a detachable keyboard which isn't usable
on other devices so it should be marked as internal. This enables palm
detection and DWT.
2026-08-20 04:04:16 +09:00
Yu Watanabe e67956f31c Another batch of conversions to COMMAND and additions of --introspect-cli (#43436)
This is another batch of straightforward conversions. I wanted to do
udevadm here too, but it requires some design work.
2026-08-20 01:41:53 +09:00
Yu Watanabe d971596a02 verbs: fix typo
Found by Fossies.

Follow-up for 7ea090f41b.
2026-08-19 22:58:22 +09:00
Yu Watanabe 6e652b53c6 man: expand documentation for systemd-sysctl --verify
Follow-up for 0b9ac2e675.
2026-08-19 11:01:40 +02:00
Zbigniew Jędrzejewski-Szmek ebd9040b30 Fix memleak and double free in varlink methods (#43431) 2026-08-19 10:58:40 +02:00
Zbigniew Jędrzejewski-Szmek 963b2323ef report-sign-tsm: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The abstract is now wrapped automatically.
2026-08-19 08:21:30 +02:00
Zbigniew Jędrzejewski-Szmek 8d8cf2cf1a report-sign-plain: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added.
2026-08-19 08:21:30 +02:00
Zbigniew Jędrzejewski-Szmek 578e5c1b38 report-files: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 8f42146976 report-cgroup: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The referenced systemd-report-cgroup(8) man
page does not exist, so the reference is dropped.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 45966bcf8e report-basic: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The abstract gets a trailing period. There is
no man page for this helper, so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek c226b876c0 pull: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. There is no man page for this internal helper,
so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 9832927a08 import-fs: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. There is no man page for this internal helper,
so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 3e61b718a5 import: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. There is no man page for this internal helper,
so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 3a45066bce export: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. There is no man page for this internal helper,
so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek df618014a5 udev/scsi_id: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The abstract is changed to the imperative.
There is no man page for this udev helper, so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 9cd507ed5b udev/v4l_id: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The abstract is changed to the imperative.
There is no man page for this udev helper, so none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 7038981d86 udev/mtd_probe: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. There is no man page for this udev helper, so
none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek 5b745242c5 udev/fido_id: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. There is no man page for this udev helper, so
none is referenced.
2026-08-19 08:21:29 +02:00
Zbigniew Jędrzejewski-Szmek c90fafdd04 udev/dmi_memory_id: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The help output had no abstract, so one is
added. There is no man page for this udev helper, so none is referenced.
2026-08-18 23:04:06 +02:00
Zbigniew Jędrzejewski-Szmek cc139a73b8 udev/cdrom_id: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The help output had no abstract, so one is
added. There is no man page for this udev helper, so none is referenced.
2026-08-18 23:04:06 +02:00
Zbigniew Jędrzejewski-Szmek 43c9d274e9 udev/ata_id: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The help output had no abstract, so one is
added. There is no man page for this udev helper, so none is referenced.
2026-08-18 23:04:06 +02:00
Zbigniew Jędrzejewski-Szmek c62bfac025 udev/iocost: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The tool has no man page of its own, so
iocost.conf(5), which describes it, is referenced. The test now also looks
for commands in /usr/lib/udev, where the udev helpers are installed.
2026-08-18 23:04:06 +02:00
Yu Watanabe 4430adbd76 sysinstall: refuse multiple requests
Otherwise, that triggers memory leak and double free.
2026-08-19 03:45:14 +09:00
Yu Watanabe 515121f7b3 resolve: refuse multiple requests
Otherwise, that triggers memory leak and double free.
2026-08-19 03:45:11 +09:00
Yu Watanabe b52f89e53b repart: refuse multiple requests with subscribe mode
Otherwise, that triggers memory leak and double free.
2026-08-19 03:29:26 +09:00
Yu Watanabe 112e4fe00a mute-console: refuse multiple requests per connection
Otherwise, that triggers memory leak and multiple free on the same
object.
2026-08-19 03:29:26 +09:00
Yu Watanabe 54253d2a9c journalctl: do not accept multiple requests to get journal entries with following mode
Otherwise, the previously attached FollowState object will be leaked,
and the latest object will be freed multiple times.
2026-08-19 03:29:26 +09:00
Yu Watanabe c2806a8c1d journal: do not accept multiple requests to sync journal per varlink connection
Otherwise, previously allocated SyncReq object will be leaked,
and the latest SyncReq object will be freed multiple times.
2026-08-19 03:29:26 +09:00
Yu Watanabe 0566d7aa35 journal: coding style fix 2026-08-19 03:29:26 +09:00
Yu Watanabe a7ba64356a journal: update comments
The Manager object was renamed from Server.
Maybe we forget to update these comments at that time.
2026-08-19 03:29:17 +09:00
dongshengyuan 3e55065ccf resolvectl: merge JSON error fields
Follow-up for: 32b3aabfe7
2026-08-19 02:31:39 +09:00
Daan De Meyer 57c4a1ea32 vmspawn: terminate the child processes before removing the runtime directory
The runtime directory holds what the helpers we fork off need: swtpm's socket
and, unless --tpm-state= points elsewhere, its state, the virtiofsd sockets,
the varlink control socket, and the QEMU config file. runtime_dir was declared
after the CLEANUP_ARRAY() that terminates those helpers, and cleanup handlers
run in reverse declaration order, so the directory was removed while all of
them were still running. That produces spurious errors from the helpers, and
anything they create while rm_rf() walks the tree can make the final rmdir fail
and leave the runtime directory behind.

Declare runtime_dir before the CLEANUP_ARRAY() instead, so the helpers are sent
SIGTERM and reaped first and the directory only goes away once nothing writes
to it anymore.

While at it, drop the rm_rf_physical_and_freep() destructors from the SSH key
paths. They are only ever assigned paths below the runtime directory, whose
removal takes them along, so those destructors never had an effect.
2026-08-19 02:30:42 +09:00