1
0
mirror of https://github.com/systemd/systemd synced 2025-09-30 09:14:46 +02:00

Compare commits

...

48 Commits

Author SHA1 Message Date
Lennart Poettering
01131684ac tmpfiles: explicitly say we need /proc/ to run
I don't think it's realistic to operate without /proc/. Hence, let's
make this explicit.

If one day someone finds a way to do what we need without /proc/ we can
certainly drop this check again, but for now I think it's a lot
friendlier to users to make this explicitly early on instead continuing
to run and then not do what we need to do, oftentimes failing in cryptic
ways.

After all, invoking the tool without /proc/ is not an error that was
specific to some of the lines we process, but it's systematic error that
will show its ugly face in many codepaths down the line.

Fixes: #14745
2021-02-10 21:50:37 +01:00
Yu Watanabe
23c32ff830 network: use SD_BUS_METHOD_WITH_ARGS() macro 2021-02-10 21:34:47 +01:00
Lennart Poettering
f5ec78e503 core: improve log message when unit deactivates cleanly
Whenever a unit deactivates sucessfully we so far generated a message
"unit xyz: succeeded". This is a bit confusing, since various unit types
cannot really "succeed", e.g. a device unit can't really "suceed", not
can a swap unit. In particular in the latter case people would probably
assume that a swap unit that "suceeded" would actually mean a swap was
active now, but the opposite is actually true.

Let's improve this by saying "Deactivated successfully", which hopefully
clears this up.

(I thought about saying "terminated" or "completed" or "finished" or so
instead, but that too doesn#t make sense if you think about unit types
like swaps or devices.)
2021-02-10 21:26:35 +01:00
Lennart Poettering
ee1680cb52
Merge pull request #18440 from bluca/portable_upgrade
portable: add 'reattach' verb and DBUS interface
2021-02-10 21:26:14 +01:00
Adrian Vovk
4368c60c39 tmpfiles: v/q/Q: Add env var to skip check for rootfs in subvolume 2021-02-10 21:10:28 +01:00
Luca Boccassi
e26fe5f911 portable: add 'reattach' verb and DBUS interface
Add 'reattach' verb to portablectl, and corresponding DBUS interface
to systemd-portabled.
Takes the same parameters as 'attach', but it will do a 'detach' (and
it will refuse to proceed if it cannot be done) first, matching on
the unversioned prefix of the new image. Eg:

portablectl reattach /tmp/foo_2.raw

will cause foo_1.raw to be detached, and foo_2.raw to be attached.

The key difference with a manual 'detach old' plus 'attach new' is that
the running units are not disturbed until after the attach completed,
and if --now is passed they are then restarted.
A 'detach' is not allowed normally if the units are running.

By using a restart-after-deploy method, 'reattach' allows for minimal
interruption of service and also for features that only work on restart
(eg: file descriptor store) to work as intended.

The DBUS interface returns two lists: first the removals from the detach
that were not immediately re-added in the attach, so that the caller
can stop the relevant units, and then the list of additions that are
either new or updates, so that the caller can restart/enable the
relevant units. portablectl already implements this with the existing
--now/--enable switches.
2021-02-10 19:07:36 +00:00
Luca Boccassi
9e4079d411 portable: allow Detach to match images with different version suffixes 2021-02-10 19:07:27 +00:00
Luca Boccassi
8b535f3aac test: setup var/tmp in the test image as well 2021-02-10 18:54:12 +00:00
Luca Boccassi
e763342091 test: add empty /etc/resolv.conf in test image
Portable services have a BindPath pointing to it, so it needs to
be available in the image
2021-02-10 18:54:12 +00:00
Luca Boccassi
9785c44dd8 test-50-dissect: move minimal image setup to common setup function
So that it can be re-used for other tests by simply setting
TEST_INSTALL_VERITY_MINIMAL=1 in test.sh, without having to
replicate the setup commands.
2021-02-10 18:54:12 +00:00
Zbigniew Jędrzejewski-Szmek
46a906f414
Merge pull request #18542 from yuwata/bash-completion-update
bash-completion: add missing options
2021-02-10 19:31:11 +01:00
Yu Watanabe
01e3d04ee6
Merge pull request #18536 from poettering/uid-refs-simplify
dynamic uid/gid reference handling simplifications
2021-02-11 03:18:15 +09:00
Yu Watanabe
fa7924db0b
Merge pull request #11484 from keszybz/udevadm-error-logs
Use real return codes in _from_string() functions
2021-02-11 03:17:47 +09:00
Yu Watanabe
aba1c9c85b bash-completion: loginctl: add -P option 2021-02-11 02:51:00 +09:00
Yu Watanabe
e56aa17084 bash-completion: coredumpctl: add --json and -n options 2021-02-11 02:50:54 +09:00
Frantisek Sumsal
2de908aead test: count call instructions as well
Binaries on the latest Arch Linux use `call` instructions instead of
`callq`, which breaks the ASan detection and eventually the image
building process (due to insufficient space).
2021-02-10 20:20:31 +03:00
Weblate (bot)
2c7bd14280
Translations update from Weblate (#18537)
Co-authored-by: Göran Uddeborg <goeran@uddeborg.se>
2021-02-11 00:55:41 +09:00
Frantisek Sumsal
58bc1735fe ci: build on Fedora ELN as well
ELN builds with a slightly different content set and RHEL-like options,
which should, theoretically, help a bit with RHEL stuff.
2021-02-10 16:34:22 +01:00
Yu Watanabe
9a67c080b0
Merge pull request #18506 from keszybz/fuzz-systemctl-parse-argv
Fuzzer for systemctl argline parsing
2021-02-11 00:29:22 +09:00
Lennart Poettering
bbe05f94f1
Merge pull request #18521 from poettering/coredumpctl-table
coredumpctl improvements (mostly about table formatting)
2021-02-10 15:58:56 +01:00
Lennart Poettering
2571aafbd8 core: fix manager_ref_gid() parameter name in header
It should match what we do for manager_ref_uid() and in the .c file.
2021-02-10 15:48:39 +01:00
Lennart Poettering
010becd90a manager: simplify uid-ref/gid-ref a code a bit
Let's drop unused function arguments, and needless double pointers where
we can.

no actual change in behaviour, just simplifications

(I tried to track down #14026 without success, and this came out of it)
2021-02-10 15:48:35 +01:00
Zbigniew Jędrzejewski-Szmek
23ece765cc test-string-util: add missing comma
Coverity CID#1446368.
2021-02-10 14:47:00 +01:00
Zbigniew Jędrzejewski-Szmek
419076978c resolved: rework a few functions to return early on error
The implementation is a bit ugly because we set the output variable
twice. But we were already doing this on error, so this is not
significantly worse. Doing this allows us to avoid goto's, and the
compiler should be able to figure this out and only set once.
2021-02-10 14:47:00 +01:00
Zbigniew Jędrzejewski-Szmek
c706a52ac5 machinectl: write arg_* only after verifying the value 2021-02-10 14:47:00 +01:00
Zbigniew Jędrzejewski-Szmek
7211c853c2 tree-wide: propagate error code from _from_string() functions
Now that we know we have something useful, no need to make an answer up.
2021-02-10 14:46:59 +01:00
Zbigniew Jędrzejewski-Szmek
751db3b4cd Return -EINVAL from _from_string() functions
We'd return -1 (-EPERM), even though we have a general rule to use real errno
values. The particular case that caught my attention was:

$ sudo udevadm control -l asdf
Failed to parse log priority 'asdf': Operation not permitted

... but "git grep 'r =.*_from_string' src/" return 110 hits. Confusingly, some
of the _from_string functions already return a proper errno value, so not all
of those are broken, but probably quite a few.
2021-02-10 14:46:59 +01:00
Zbigniew Jędrzejewski-Szmek
2d93c20e5f tree-wide: use -EINVAL for enum invalid values
As suggested in https://github.com/systemd/systemd/pull/11484#issuecomment-775288617.

This does not touch anything exposed in src/systemd. Changing the defines there
would be a compatibility break.

Note that tests are broken after this commit. They will be fixed in the next one.
2021-02-10 14:46:59 +01:00
Zbigniew Jędrzejewski-Szmek
71c163c9fa udev: make sure UdevBuiltinCommand is properly converted 2021-02-10 14:46:59 +01:00
Zbigniew Jędrzejewski-Szmek
38d1e12063 sd-bus: drop some bitfields in sd_bus_slot
A hole was/is present after the booleans, so changing them to be one byte each
doesn't change the structure size (122 bits on amd64). If we add more stuff
later, it might make sense to turn some of those into bitfields again. For now,
let's take the easy route. EINVAL fits into type now.

Code size it minimally reduced:
-rwxrwxr-x 1 zbyszek zbyszek 4109792 Feb 10 14:00 build/libsystemd.so.0.30.0
-rwxrwxr-x 1 zbyszek zbyszek 4109712 Feb 10 14:01 build/libsystemd.so.0.30.0
2021-02-10 14:46:59 +01:00
Zbigniew Jędrzejewski-Szmek
399f74c79d sd-netlink: pahole optimization of sd_netlink_slot
By rearranging the fields, we can avoid one of the holes (on amd64).
By adding more space for .type, -EINVAL can be used as a value later on.
The structure is reduced from 96 to 88 bytes (on amd64).

Text size is also smaller:
-rwxrwxr-x 1 zbyszek zbyszek 4109832 Feb  9 19:50 build/libsystemd.so.0.30.0
-rwxrwxr-x 1 zbyszek zbyszek 4109792 Feb  9 19:51 build/libsystemd.so.0.30.0
2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
4d24463211 shared/json: make JsonVariant.type field wider
pahole shows that this doesn't make a difference, but we can fit -EINVAL
into .type without warnings.
2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
755c6d5923 sd-event: drop one bitfield from sd_event_source
pahole analysis confirms that the structure size does not change (there
was/is a hole after the sequence of bitfields anyway).
2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
ec08f27069 core: drop bitfields in Manager object
Every bitfield may make the object a little smaller, but requires additional
code when accessing the field. So it only makes sense in objects that are
created in many many copies. The Manager is pretty much a singleton.

-rwxrwxr-x 1 zbyszek zbyszek 4443840 Feb  9 16:14 build/systemd
-rwxrwxr-x 1 zbyszek zbyszek 4442552 Feb  9 16:42 build/systemd

We save 1288 bytes of code by "wasting" a few bytes on storage. (The speed
advantages are probably more important, but harder to measure…)
2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
61b315de9b Add comma in structured initialization in a few places
It just looks nicer…
2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
170d40260b core: do not initialize variable which is unconditionally set below 2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
3c3cd61e75 test-tables: make the assert more readable
Doing it all in one line and with negation in front seemed like a good
idea at some point, but I think it is vastly easier to understand when
it is split out a bit.
2021-02-10 14:43:10 +01:00
Zbigniew Jędrzejewski-Szmek
b357fe57b2 test-tables: fix warning about NULL used in printf
With the simplified asserts, newer gcc is able to (correctly) figure
out that NULL was being passed.
2021-02-10 14:43:10 +01:00
Lennart Poettering
4016281c4f coredumpctl: include coredump size in output
This improves the output of the "list" and "info" verbs and adds
coredump size information to the output.

For doing that a common helper function is added that analyzes the
coredump file on disk.
2021-02-10 12:22:21 +01:00
Lennart Poettering
bbd86b72f1 man: document new coredumpctl features 2021-02-10 12:22:03 +01:00
Lennart Poettering
0689cfdb83 coredumpctl: modernize table output
Let's use our table formatter for generating the coredump table. Bring
support up to our current standards, with a bit of color, JSON output
and so on.

Also adds supports for setting a max for the number of lines to
generate. (with the new -n switch)

The existing -1 switch now becomes a synonym for "-n 1 --reverse"

Fixes: #3271
2021-02-10 12:21:59 +01:00
Lennart Poettering
56909de015 format-table: when generating json, synthesize "null" for invalid ifindex
This matches what we do for other cell types that have an invalid value.
2021-02-10 12:21:56 +01:00
Lennart Poettering
a7273eaf32 format-table: make UID/GID/PID fields first class citizens + add signal cell type
This way we can display invalid UIDs/GIDs/PIDs as n/a while still
storing them as is.

Also, let's add a new cell type for unix signal, that is stored as
integer, but displayed as signal name string.
2021-02-10 12:21:17 +01:00
Zbigniew Jędrzejewski-Szmek
40a49f127e systemctl: remove comment about --failed being deprecated
Follow-up for bef19548a2430909019d7cff095b8600c796c3ef.
2021-02-09 14:14:16 +01:00
Zbigniew Jędrzejewski-Szmek
5fd8782328 fuzz-systemctl-parse-argv: a new fuzzer
Does what the name suggests. Obviously inspired by sudoers, but note that
our tools are not supposed to be installed suid, so there is no privilege
boundary to cross here.
2021-02-09 14:11:42 +01:00
Zbigniew Jędrzejewski-Szmek
5bb920ce27 xdg-autostart-generator: sort header includes 2021-02-08 12:17:29 +01:00
Zbigniew Jędrzejewski-Szmek
ea71b4604b systemctl: move telinit execcing out of parse_argv()
With this change, parse_argv() does parsing, without any real actions.
Fully untested ;)
2021-02-08 12:17:24 +01:00
Zbigniew Jędrzejewski-Szmek
54d04cd1e7 core: drop references to Upstart
The last release of Upstart was July 2014 [1], and there have been no new
commits to the repo. We should move on too.
[1] https://lists.ubuntu.com/archives/upstart-devel/2014-July/003313.html

The only real support was in the code that looked for $PREVLEVEL.
https://codesearch.debian.net/search?q=PREVLEVEL&literal=1&perpkg=1 shows this
string in our own code (or the copy in elogind), our own man pages, and init
scripts for two packages (brltty, salt), which shouldn't be used with systemd.
(And both *check* for PREVLEVEL, and don't set it. So most likely nothing at
all sets it.)
2021-02-07 17:02:56 +01:00
214 changed files with 1689 additions and 728 deletions

View File

@ -43,3 +43,5 @@ jobs:
- fedora-rawhide-aarch64 - fedora-rawhide-aarch64
- fedora-rawhide-i386 - fedora-rawhide-i386
- fedora-rawhide-x86_64 - fedora-rawhide-x86_64
- fedora-eln-aarch64
- fedora-eln-x86_64

View File

@ -279,3 +279,9 @@ systemd-sysext:
specify API file systems such as `/proc/` or `/sys/` here, or hierarchies specify API file systems such as `/proc/` or `/sys/` here, or hierarchies
that have them as submounts. In particular, do not specify the root directory that have them as submounts. In particular, do not specify the root directory
`/` here. `/` here.
systemd-tmpfiles:
* `SYSTEMD_TMPFILES_FORCE_SUBVOL` - if unset, v/q/Q lines will create subvolumes only if the
OS itself is installed into a subvolume. If set to 1 (or another true value), these lines will always create
subvolumes (if the backing filesystem supports them). If set to 0, these lines will always create directories.

View File

@ -154,20 +154,22 @@
<xi:include href="standard-options.xml" xpointer="help" /> <xi:include href="standard-options.xml" xpointer="help" />
<xi:include href="standard-options.xml" xpointer="version" /> <xi:include href="standard-options.xml" xpointer="version" />
<varlistentry>
<term><option>--no-legend</option></term>
<listitem><para>Do not print column headers.</para></listitem>
</varlistentry>
<xi:include href="standard-options.xml" xpointer="no-pager" /> <xi:include href="standard-options.xml" xpointer="no-pager" />
<xi:include href="standard-options.xml" xpointer="no-legend" />
<xi:include href="standard-options.xml" xpointer="json" />
<varlistentry> <varlistentry>
<term><option>-1</option></term> <term><option>-1</option></term>
<listitem><para>Show information of a single core dump only, instead of listing <listitem><para>Show information of the most recent core dump only, instead of listing all known core
all known core dumps.</para></listitem> dumps. (Equivalent to <option>--reverse -n 1</option></para></listitem>
</varlistentry>
<varlistentry>
<term><option>-n</option> <replaceable>INT</replaceable></term>
<listitem><para>Show at most the specified number of entries. The specified parameter must be an
integer greater or equal to 1.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View File

@ -155,6 +155,20 @@
to be used in case the unit names do not match the image name as described in the <command>attach</command>.</para> to be used in case the unit names do not match the image name as described in the <command>attach</command>.</para>
</varlistentry> </varlistentry>
<varlistentry>
<term><command>reattach</command> <replaceable>IMAGE</replaceable> [<replaceable>PREFIX…</replaceable>]</term>
<listitem><para>Detaches an existing portable service image from the host, and immediately attaches it again.
This is useful in case the image was replaced. Running units are not stopped during the process. Partial matching,
to allow for different versions in the image name, is allowed: only the part before the first <literal>_</literal>
character has to match. If the new image doesn't exist, the existing one will not be detached. The parameters
follow the same syntax as the <command>attach</command> command.</para></listitem>
<para>If <option>--now</option> and/or <option>--enable</option> are passed, the portable service(s) are
immediately stopped if removed, started and/or enabled if added, or restarted if updated. Prefixes are also
accepted, in the same way as described in the <command>attach</command> case.</para>
</varlistentry>
<varlistentry> <varlistentry>
<term><command>inspect</command> <replaceable>IMAGE</replaceable> [<replaceable>PREFIX…</replaceable>]</term> <term><command>inspect</command> <replaceable>IMAGE</replaceable> [<replaceable>PREFIX…</replaceable>]</term>
@ -328,7 +342,8 @@
<varlistentry> <varlistentry>
<term><option>--now</option></term> <term><option>--now</option></term>
<listitem><para>Immediately start/stop the portable service after attaching/before detaching.</para></listitem> <listitem><para>Immediately start/stop/restart the portable service after attaching/before
detaching/after upgrading.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View File

@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: systemd master\n" "Project-Id-Version: systemd master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-08 17:48+0100\n" "POT-Creation-Date: 2021-01-08 17:48+0100\n"
"PO-Revision-Date: 2021-02-05 20:40+0000\n" "PO-Revision-Date: 2021-02-10 15:40+0000\n"
"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n" "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <https://translate.fedoraproject.org/projects/systemd/" "Language-Team: Swedish <https://translate.fedoraproject.org/projects/systemd/"
"master/sv/>\n" "master/sv/>\n"
@ -532,7 +532,7 @@ msgstr "Autentisering krävs för att ställa in ”orsaken” för omstart i k
#: src/login/org.freedesktop.login1.policy:363 #: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface" msgid "Indicate to the firmware to boot to setup interface"
msgstr "" msgstr ""
"Indikera till den fasta programvaran att starta upp i " "Indikera till den fasta programvaran att starta upp till "
"inställningsgränssnittet" "inställningsgränssnittet"
#: src/login/org.freedesktop.login1.policy:364 #: src/login/org.freedesktop.login1.policy:364
@ -540,12 +540,12 @@ msgid ""
"Authentication is required to indicate to the firmware to boot to setup " "Authentication is required to indicate to the firmware to boot to setup "
"interface." "interface."
msgstr "" msgstr ""
"Autentisering krävs för att indikera till firmware att starta upp till " "Autentisering krävs för att indikera till den fasta programvaran att starta "
"inställningsgränssnitt." "upp till inställningsgränssnitt."
#: src/login/org.freedesktop.login1.policy:374 #: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu" msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "Indikera till den startprogrammet att starta upp i uppstartsladdmenyn" msgstr "Indikera till startprogrammet att starta upp i uppstartsladdmenyn"
#: src/login/org.freedesktop.login1.policy:375 #: src/login/org.freedesktop.login1.policy:375
msgid "" msgid ""
@ -899,7 +899,7 @@ msgstr "Autentisering krävs för att stoppa \"$(unit)\"."
#: src/core/dbus-unit.c:361 #: src/core/dbus-unit.c:361
msgid "Authentication is required to reload '$(unit)'." msgid "Authentication is required to reload '$(unit)'."
msgstr "Autentisering krävs för att läsa om tillståndet för \"$(unit)\"." msgstr "Autentisering krävs för att läsa om \"$(unit)\"."
#: src/core/dbus-unit.c:362 src/core/dbus-unit.c:363 #: src/core/dbus-unit.c:362 src/core/dbus-unit.c:363
msgid "Authentication is required to restart '$(unit)'." msgid "Authentication is required to restart '$(unit)'."

View File

@ -40,7 +40,7 @@ _coredumpctl() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
local OPTS='-h --help --version --no-pager --no-legend -o --output -F --field -1 local OPTS='-h --help --version --no-pager --no-legend -o --output -F --field -1
-r --reverse -S --since -U --until -D --directory -q --quiet --debugger -r --reverse -S --since -U --until -D --directory -q --quiet --debugger
-A --debugger-arguments' -A --debugger-arguments --json -n'
local -A VERBS=( local -A VERBS=(
[LIST]='list info' [LIST]='list info'
@ -58,6 +58,8 @@ _coredumpctl() {
compopt -o filenames compopt -o filenames
elif __contains_word "$prev" '--field -F'; then elif __contains_word "$prev" '--field -F'; then
comps=$( compgen -W '${__journal_fields[*]}' -- "$cur" ) comps=$( compgen -W '${__journal_fields[*]}' -- "$cur" )
elif __contains_word "$prev" '--json'; then
comps=$( compgen -W 'pretty short off' -- "$cur" )
elif [[ $cur = -* ]]; then elif [[ $cur = -* ]]; then
comps=${OPTS} comps=${OPTS}
elif __contains_word "$prev" ${VERBS[*]} && elif __contains_word "$prev" ${VERBS[*]} &&

View File

@ -43,7 +43,7 @@ _loginctl () {
[STANDALONE]='--all -a --help -h --no-pager --version [STANDALONE]='--all -a --help -h --no-pager --version
--no-legend --no-ask-password -l --full --value' --no-legend --no-ask-password -l --full --value'
[ARG]='--host -H --kill-who --property -p --signal -s -M --machine [ARG]='--host -H --kill-who --property -p --signal -s -M --machine
-n --lines -o --output' -n --lines -o --output -P'
) )
if __contains_word "$prev" ${OPTS[ARG]}; then if __contains_word "$prev" ${OPTS[ARG]}; then
@ -61,7 +61,7 @@ _loginctl () {
--machine|-M) --machine|-M)
comps=$( __get_machines ) comps=$( __get_machines )
;; ;;
--property|-p) --property|-p|-P)
comps='' comps=''
;; ;;
--output|-o) --output|-o)

View File

@ -40,7 +40,7 @@ _portablectl() {
local -A VERBS=( local -A VERBS=(
[STANDALONE]='list' [STANDALONE]='list'
[IMAGE]='attach detach inspect is-attached set-limit' [IMAGE]='attach detach reattach inspect is-attached set-limit'
[IMAGES]='remove' [IMAGES]='remove'
[IMAGE_WITH_BOOL]='read-only' [IMAGE_WITH_BOOL]='read-only'
) )

View File

@ -1574,7 +1574,7 @@ static int dump_exit_status(int argc, char *argv[], void *userdata) {
status = exit_status_from_string(argv[i]); status = exit_status_from_string(argv[i]);
if (status < 0) if (status < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid exit status \"%s\".", argv[i]); return log_error_errno(status, "Invalid exit status \"%s\".", argv[i]);
assert(status >= 0 && (size_t) status < ELEMENTSOF(exit_status_mappings)); assert(status >= 0 && (size_t) status < ELEMENTSOF(exit_status_mappings));
r = table_add_many(table, r = table_add_many(table,

View File

@ -45,7 +45,7 @@ enum {
ARCHITECTURE_ARC, ARCHITECTURE_ARC,
ARCHITECTURE_ARC_BE, ARCHITECTURE_ARC_BE,
_ARCHITECTURE_MAX, _ARCHITECTURE_MAX,
_ARCHITECTURE_INVALID = -1 _ARCHITECTURE_INVALID = -EINVAL,
}; };
int uname_architecture(void); int uname_architecture(void);

View File

@ -32,7 +32,7 @@ typedef enum CGroupController {
CGROUP_CONTROLLER_BPF_DEVICES, CGROUP_CONTROLLER_BPF_DEVICES,
_CGROUP_CONTROLLER_MAX, _CGROUP_CONTROLLER_MAX,
_CGROUP_CONTROLLER_INVALID = -1, _CGROUP_CONTROLLER_INVALID = -EINVAL,
} CGroupController; } CGroupController;
#define CGROUP_CONTROLLER_TO_MASK(c) (1U << (c)) #define CGROUP_CONTROLLER_TO_MASK(c) (1U << (c))
@ -97,7 +97,7 @@ typedef enum CGroupIOLimitType {
CGROUP_IO_WIOPS_MAX, CGROUP_IO_WIOPS_MAX,
_CGROUP_IO_LIMIT_TYPE_MAX, _CGROUP_IO_LIMIT_TYPE_MAX,
_CGROUP_IO_LIMIT_TYPE_INVALID = -1 _CGROUP_IO_LIMIT_TYPE_INVALID = -EINVAL,
} CGroupIOLimitType; } CGroupIOLimitType;
extern const uint64_t cgroup_io_limit_defaults[_CGROUP_IO_LIMIT_TYPE_MAX]; extern const uint64_t cgroup_io_limit_defaults[_CGROUP_IO_LIMIT_TYPE_MAX];
@ -283,7 +283,7 @@ typedef enum ManagedOOMMode {
MANAGED_OOM_AUTO, MANAGED_OOM_AUTO,
MANAGED_OOM_KILL, MANAGED_OOM_KILL,
_MANAGED_OOM_MODE_MAX, _MANAGED_OOM_MODE_MAX,
_MANAGED_OOM_MODE_INVALID = -1, _MANAGED_OOM_MODE_INVALID = -EINVAL,
} ManagedOOMMode; } ManagedOOMMode;
const char* managed_oom_mode_to_string(ManagedOOMMode m) _const_; const char* managed_oom_mode_to_string(ManagedOOMMode m) _const_;

View File

@ -26,7 +26,7 @@ typedef enum LocaleVariable {
VARIABLE_LC_MEASUREMENT, VARIABLE_LC_MEASUREMENT,
VARIABLE_LC_IDENTIFICATION, VARIABLE_LC_IDENTIFICATION,
_VARIABLE_LC_MAX, _VARIABLE_LC_MAX,
_VARIABLE_LC_INVALID = -1 _VARIABLE_LC_INVALID = -EINVAL,
} LocaleVariable; } LocaleVariable;
int get_locales(char ***l); int get_locales(char ***l);

View File

@ -1085,7 +1085,7 @@ int log_set_target_from_string(const char *e) {
t = log_target_from_string(e); t = log_target_from_string(e);
if (t < 0) if (t < 0)
return -EINVAL; return t;
log_set_target(t); log_set_target(t);
return 0; return 0;
@ -1096,7 +1096,7 @@ int log_set_max_level_from_string(const char *e) {
t = log_level_from_string(e); t = log_level_from_string(e);
if (t < 0) if (t < 0)
return -EINVAL; return t;
log_set_max_level(t); log_set_max_level(t);
return 0; return 0;

View File

@ -23,7 +23,7 @@ typedef enum LogTarget{
LOG_TARGET_AUTO, /* console if stderr is not journal, JOURNAL_OR_KMSG otherwise */ LOG_TARGET_AUTO, /* console if stderr is not journal, JOURNAL_OR_KMSG otherwise */
LOG_TARGET_NULL, LOG_TARGET_NULL,
_LOG_TARGET_MAX, _LOG_TARGET_MAX,
_LOG_TARGET_INVALID = -1 _LOG_TARGET_INVALID = -EINVAL,
} LogTarget; } LogTarget;
/* Note to readers: << and >> have lower precedence than & and | */ /* Note to readers: << and >> have lower precedence than & and | */

View File

@ -24,7 +24,7 @@ typedef enum SmackAttr {
SMACK_ATTR_IPIN, SMACK_ATTR_IPIN,
SMACK_ATTR_IPOUT, SMACK_ATTR_IPOUT,
_SMACK_ATTR_MAX, _SMACK_ATTR_MAX,
_SMACK_ATTR_INVALID = -1, _SMACK_ATTR_INVALID = -EINVAL,
} SmackAttr; } SmackAttr;
bool mac_smack_use(void); bool mac_smack_use(void);

View File

@ -63,7 +63,7 @@ typedef enum SocketAddressBindIPv6Only {
SOCKET_ADDRESS_BOTH, SOCKET_ADDRESS_BOTH,
SOCKET_ADDRESS_IPV6_ONLY, SOCKET_ADDRESS_IPV6_ONLY,
_SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX, _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
_SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -1 _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -EINVAL,
} SocketAddressBindIPv6Only; } SocketAddressBindIPv6Only;
#define socket_address_family(a) ((a)->sockaddr.sa.sa_family) #define socket_address_family(a) ((a)->sockaddr.sa.sa_family)

View File

@ -5,11 +5,11 @@
ssize_t string_table_lookup(const char * const *table, size_t len, const char *key) { ssize_t string_table_lookup(const char * const *table, size_t len, const char *key) {
if (!key) if (!key)
return -1; return -EINVAL;
for (size_t i = 0; i < len; ++i) for (size_t i = 0; i < len; ++i)
if (streq_ptr(table[i], key)) if (streq_ptr(table[i], key))
return (ssize_t) i; return (ssize_t) i;
return -1; return -EINVAL;
} }

View File

@ -29,7 +29,7 @@ ssize_t string_table_lookup(const char * const *table, size_t len, const char *k
#define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING_WITH_BOOLEAN(name,type,yes,scope) \ #define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING_WITH_BOOLEAN(name,type,yes,scope) \
scope type name##_from_string(const char *s) { \ scope type name##_from_string(const char *s) { \
if (!s) \ if (!s) \
return -1; \ return -EINVAL; \
int b = parse_boolean(s); \ int b = parse_boolean(s); \
if (b == 0) \ if (b == 0) \
return (type) 0; \ return (type) 0; \
@ -60,14 +60,16 @@ ssize_t string_table_lookup(const char * const *table, size_t len, const char *k
unsigned u = 0; \ unsigned u = 0; \
type i; \ type i; \
if (!s) \ if (!s) \
return (type) -1; \ return -EINVAL; \
i = (type) string_table_lookup(name##_table, ELEMENTSOF(name##_table), s); \ i = (type) string_table_lookup(name##_table, ELEMENTSOF(name##_table), s); \
if (i >= 0) \ if (i >= 0) \
return i; \ return i; \
if (safe_atou(s, &u) >= 0 && u <= max) \ if (safe_atou(s, &u) < 0) \
return -EINVAL; \
if (u > max) \
return -EINVAL; \
return (type) u; \ return (type) u; \
return (type) -1; \ }
} \
#define _DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \ #define _DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \
_DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope) \ _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope) \

View File

@ -111,7 +111,7 @@ typedef enum ColorMode {
/* Only 256 colors. */ /* Only 256 colors. */
COLOR_256 = 256, COLOR_256 = 256,
_COLOR_INVALID = -1, _COLOR_INVALID = -EINVAL,
} ColorMode; } ColorMode;
int acquire_terminal(const char *name, AcquireTerminalFlags flags, usec_t timeout); int acquire_terminal(const char *name, AcquireTerminalFlags flags, usec_t timeout);

View File

@ -35,7 +35,7 @@ typedef enum TimestampStyle {
TIMESTAMP_UTC, TIMESTAMP_UTC,
TIMESTAMP_US_UTC, TIMESTAMP_US_UTC,
_TIMESTAMP_STYLE_MAX, _TIMESTAMP_STYLE_MAX,
_TIMESTAMP_STYLE_INVALID = -1, _TIMESTAMP_STYLE_INVALID = -EINVAL,
} TimestampStyle; } TimestampStyle;
#define USEC_INFINITY ((usec_t) UINT64_MAX) #define USEC_INFINITY ((usec_t) UINT64_MAX)

View File

@ -22,7 +22,7 @@ typedef enum UnitType {
UNIT_SLICE, UNIT_SLICE,
UNIT_SCOPE, UNIT_SCOPE,
_UNIT_TYPE_MAX, _UNIT_TYPE_MAX,
_UNIT_TYPE_INVALID = -1 _UNIT_TYPE_INVALID = -EINVAL,
} UnitType; } UnitType;
typedef enum UnitLoadState { typedef enum UnitLoadState {
@ -34,7 +34,7 @@ typedef enum UnitLoadState {
UNIT_MERGED, UNIT_MERGED,
UNIT_MASKED, UNIT_MASKED,
_UNIT_LOAD_STATE_MAX, _UNIT_LOAD_STATE_MAX,
_UNIT_LOAD_STATE_INVALID = -1 _UNIT_LOAD_STATE_INVALID = -EINVAL,
} UnitLoadState; } UnitLoadState;
typedef enum UnitActiveState { typedef enum UnitActiveState {
@ -46,7 +46,7 @@ typedef enum UnitActiveState {
UNIT_DEACTIVATING, UNIT_DEACTIVATING,
UNIT_MAINTENANCE, UNIT_MAINTENANCE,
_UNIT_ACTIVE_STATE_MAX, _UNIT_ACTIVE_STATE_MAX,
_UNIT_ACTIVE_STATE_INVALID = -1 _UNIT_ACTIVE_STATE_INVALID = -EINVAL,
} UnitActiveState; } UnitActiveState;
typedef enum FreezerState { typedef enum FreezerState {
@ -55,7 +55,7 @@ typedef enum FreezerState {
FREEZER_FROZEN, FREEZER_FROZEN,
FREEZER_THAWING, FREEZER_THAWING,
_FREEZER_STATE_MAX, _FREEZER_STATE_MAX,
_FREEZER_STATE_INVALID = -1 _FREEZER_STATE_INVALID = -EINVAL,
} FreezerState; } FreezerState;
typedef enum AutomountState { typedef enum AutomountState {
@ -64,7 +64,7 @@ typedef enum AutomountState {
AUTOMOUNT_RUNNING, AUTOMOUNT_RUNNING,
AUTOMOUNT_FAILED, AUTOMOUNT_FAILED,
_AUTOMOUNT_STATE_MAX, _AUTOMOUNT_STATE_MAX,
_AUTOMOUNT_STATE_INVALID = -1 _AUTOMOUNT_STATE_INVALID = -EINVAL,
} AutomountState; } AutomountState;
/* We simply watch devices, we cannot plug/unplug them. That /* We simply watch devices, we cannot plug/unplug them. That
@ -74,7 +74,7 @@ typedef enum DeviceState {
DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */ DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
DEVICE_PLUGGED, /* announced by udev */ DEVICE_PLUGGED, /* announced by udev */
_DEVICE_STATE_MAX, _DEVICE_STATE_MAX,
_DEVICE_STATE_INVALID = -1 _DEVICE_STATE_INVALID = -EINVAL,
} DeviceState; } DeviceState;
typedef enum MountState { typedef enum MountState {
@ -91,7 +91,7 @@ typedef enum MountState {
MOUNT_FAILED, MOUNT_FAILED,
MOUNT_CLEANING, MOUNT_CLEANING,
_MOUNT_STATE_MAX, _MOUNT_STATE_MAX,
_MOUNT_STATE_INVALID = -1 _MOUNT_STATE_INVALID = -EINVAL,
} MountState; } MountState;
typedef enum PathState { typedef enum PathState {
@ -100,7 +100,7 @@ typedef enum PathState {
PATH_RUNNING, PATH_RUNNING,
PATH_FAILED, PATH_FAILED,
_PATH_STATE_MAX, _PATH_STATE_MAX,
_PATH_STATE_INVALID = -1 _PATH_STATE_INVALID = -EINVAL,
} PathState; } PathState;
typedef enum ScopeState { typedef enum ScopeState {
@ -111,7 +111,7 @@ typedef enum ScopeState {
SCOPE_STOP_SIGKILL, SCOPE_STOP_SIGKILL,
SCOPE_FAILED, SCOPE_FAILED,
_SCOPE_STATE_MAX, _SCOPE_STATE_MAX,
_SCOPE_STATE_INVALID = -1 _SCOPE_STATE_INVALID = -EINVAL,
} ScopeState; } ScopeState;
typedef enum ServiceState { typedef enum ServiceState {
@ -135,14 +135,14 @@ typedef enum ServiceState {
SERVICE_AUTO_RESTART, SERVICE_AUTO_RESTART,
SERVICE_CLEANING, SERVICE_CLEANING,
_SERVICE_STATE_MAX, _SERVICE_STATE_MAX,
_SERVICE_STATE_INVALID = -1 _SERVICE_STATE_INVALID = -EINVAL,
} ServiceState; } ServiceState;
typedef enum SliceState { typedef enum SliceState {
SLICE_DEAD, SLICE_DEAD,
SLICE_ACTIVE, SLICE_ACTIVE,
_SLICE_STATE_MAX, _SLICE_STATE_MAX,
_SLICE_STATE_INVALID = -1 _SLICE_STATE_INVALID = -EINVAL,
} SliceState; } SliceState;
typedef enum SocketState { typedef enum SocketState {
@ -161,7 +161,7 @@ typedef enum SocketState {
SOCKET_FAILED, SOCKET_FAILED,
SOCKET_CLEANING, SOCKET_CLEANING,
_SOCKET_STATE_MAX, _SOCKET_STATE_MAX,
_SOCKET_STATE_INVALID = -1 _SOCKET_STATE_INVALID = -EINVAL,
} SocketState; } SocketState;
typedef enum SwapState { typedef enum SwapState {
@ -175,14 +175,14 @@ typedef enum SwapState {
SWAP_FAILED, SWAP_FAILED,
SWAP_CLEANING, SWAP_CLEANING,
_SWAP_STATE_MAX, _SWAP_STATE_MAX,
_SWAP_STATE_INVALID = -1 _SWAP_STATE_INVALID = -EINVAL,
} SwapState; } SwapState;
typedef enum TargetState { typedef enum TargetState {
TARGET_DEAD, TARGET_DEAD,
TARGET_ACTIVE, TARGET_ACTIVE,
_TARGET_STATE_MAX, _TARGET_STATE_MAX,
_TARGET_STATE_INVALID = -1 _TARGET_STATE_INVALID = -EINVAL,
} TargetState; } TargetState;
typedef enum TimerState { typedef enum TimerState {
@ -192,7 +192,7 @@ typedef enum TimerState {
TIMER_ELAPSED, TIMER_ELAPSED,
TIMER_FAILED, TIMER_FAILED,
_TIMER_STATE_MAX, _TIMER_STATE_MAX,
_TIMER_STATE_INVALID = -1 _TIMER_STATE_INVALID = -EINVAL,
} TimerState; } TimerState;
typedef enum UnitDependency { typedef enum UnitDependency {
@ -237,7 +237,7 @@ typedef enum UnitDependency {
UNIT_REFERENCED_BY, UNIT_REFERENCED_BY,
_UNIT_DEPENDENCY_MAX, _UNIT_DEPENDENCY_MAX,
_UNIT_DEPENDENCY_INVALID = -1 _UNIT_DEPENDENCY_INVALID = -EINVAL,
} UnitDependency; } UnitDependency;
typedef enum NotifyAccess { typedef enum NotifyAccess {
@ -246,7 +246,7 @@ typedef enum NotifyAccess {
NOTIFY_MAIN, NOTIFY_MAIN,
NOTIFY_EXEC, NOTIFY_EXEC,
_NOTIFY_ACCESS_MAX, _NOTIFY_ACCESS_MAX,
_NOTIFY_ACCESS_INVALID = -1 _NOTIFY_ACCESS_INVALID = -EINVAL,
} NotifyAccess; } NotifyAccess;
char *unit_dbus_path_from_name(const char *name); char *unit_dbus_path_from_name(const char *name);

View File

@ -26,7 +26,7 @@ enum UnitFileState {
UNIT_FILE_TRANSIENT, UNIT_FILE_TRANSIENT,
UNIT_FILE_BAD, UNIT_FILE_BAD,
_UNIT_FILE_STATE_MAX, _UNIT_FILE_STATE_MAX,
_UNIT_FILE_STATE_INVALID = -1 _UNIT_FILE_STATE_INVALID = -EINVAL,
}; };
enum UnitFileScope { enum UnitFileScope {
@ -34,7 +34,7 @@ enum UnitFileScope {
UNIT_FILE_GLOBAL, UNIT_FILE_GLOBAL,
UNIT_FILE_USER, UNIT_FILE_USER,
_UNIT_FILE_SCOPE_MAX, _UNIT_FILE_SCOPE_MAX,
_UNIT_FILE_SCOPE_INVALID = -1 _UNIT_FILE_SCOPE_INVALID = -EINVAL,
}; };
bool unit_type_may_alias(UnitType type) _const_; bool unit_type_may_alias(UnitType type) _const_;

View File

@ -252,7 +252,7 @@ int unit_name_build(const char *prefix, const char *instance, const char *suffix
type = unit_type_from_string(suffix + 1); type = unit_type_from_string(suffix + 1);
if (type < 0) if (type < 0)
return -EINVAL; return type;
return unit_name_build_from_type(prefix, instance, type, ret); return unit_name_build_from_type(prefix, instance, type, ret);
} }

View File

@ -13,7 +13,7 @@ typedef enum UnitNameFlags {
UNIT_NAME_TEMPLATE = 1 << 1, /* Allow foo@.service */ UNIT_NAME_TEMPLATE = 1 << 1, /* Allow foo@.service */
UNIT_NAME_INSTANCE = 1 << 2, /* Allow foo@bar.service */ UNIT_NAME_INSTANCE = 1 << 2, /* Allow foo@bar.service */
UNIT_NAME_ANY = UNIT_NAME_PLAIN|UNIT_NAME_TEMPLATE|UNIT_NAME_INSTANCE, UNIT_NAME_ANY = UNIT_NAME_PLAIN|UNIT_NAME_TEMPLATE|UNIT_NAME_INSTANCE,
_UNIT_NAME_INVALID = -1, _UNIT_NAME_INVALID = -EINVAL,
} UnitNameFlags; } UnitNameFlags;
bool unit_name_is_valid(const char *n, UnitNameFlags flags) _pure_; bool unit_name_is_valid(const char *n, UnitNameFlags flags) _pure_;

View File

@ -41,7 +41,7 @@ enum {
VIRTUALIZATION_CONTAINER_LAST = VIRTUALIZATION_CONTAINER_OTHER, VIRTUALIZATION_CONTAINER_LAST = VIRTUALIZATION_CONTAINER_OTHER,
_VIRTUALIZATION_MAX, _VIRTUALIZATION_MAX,
_VIRTUALIZATION_INVALID = -1 _VIRTUALIZATION_INVALID = -EINVAL,
}; };
static inline bool VIRTUALIZATION_IS_VM(int x) { static inline bool VIRTUALIZATION_IS_VM(int x) {

View File

@ -2,13 +2,14 @@
#pragma once #pragma once
#include <efi.h> #include <efi.h>
#include <errno.h>
typedef enum RandomSeedMode { typedef enum RandomSeedMode {
RANDOM_SEED_OFF, RANDOM_SEED_OFF,
RANDOM_SEED_WITH_SYSTEM_TOKEN, RANDOM_SEED_WITH_SYSTEM_TOKEN,
RANDOM_SEED_ALWAYS, RANDOM_SEED_ALWAYS,
_RANDOM_SEED_MODE_MAX, _RANDOM_SEED_MODE_MAX,
_RANDOM_SEED_MODE_INVALID = -1, _RANDOM_SEED_MODE_INVALID = -EINVAL,
} RandomSeedMode; } RandomSeedMode;
EFI_STATUS process_random_seed(EFI_FILE *root_dir, RandomSeedMode mode); EFI_STATUS process_random_seed(EFI_FILE *root_dir, RandomSeedMode mode);

View File

@ -12,7 +12,7 @@ typedef enum AutomountResult {
AUTOMOUNT_FAILURE_START_LIMIT_HIT, AUTOMOUNT_FAILURE_START_LIMIT_HIT,
AUTOMOUNT_FAILURE_MOUNT_START_LIMIT_HIT, AUTOMOUNT_FAILURE_MOUNT_START_LIMIT_HIT,
_AUTOMOUNT_RESULT_MAX, _AUTOMOUNT_RESULT_MAX,
_AUTOMOUNT_RESULT_INVALID = -1 _AUTOMOUNT_RESULT_INVALID = -EINVAL,
} AutomountResult; } AutomountResult;
struct Automount { struct Automount {

View File

@ -44,7 +44,7 @@ typedef enum CGroupDevicePolicy {
CGROUP_DEVICE_POLICY_STRICT, CGROUP_DEVICE_POLICY_STRICT,
_CGROUP_DEVICE_POLICY_MAX, _CGROUP_DEVICE_POLICY_MAX,
_CGROUP_DEVICE_POLICY_INVALID = -1 _CGROUP_DEVICE_POLICY_INVALID = -EINVAL,
} CGroupDevicePolicy; } CGroupDevicePolicy;
typedef enum FreezerAction { typedef enum FreezerAction {
@ -52,7 +52,7 @@ typedef enum FreezerAction {
FREEZER_THAW, FREEZER_THAW,
_FREEZER_ACTION_MAX, _FREEZER_ACTION_MAX,
_FREEZER_ACTION_INVALID = -1, _FREEZER_ACTION_INVALID = -EINVAL,
} FreezerAction; } FreezerAction;
struct CGroupDeviceAllow { struct CGroupDeviceAllow {
@ -173,7 +173,7 @@ typedef enum CGroupIPAccountingMetric {
CGROUP_IP_EGRESS_BYTES, CGROUP_IP_EGRESS_BYTES,
CGROUP_IP_EGRESS_PACKETS, CGROUP_IP_EGRESS_PACKETS,
_CGROUP_IP_ACCOUNTING_METRIC_MAX, _CGROUP_IP_ACCOUNTING_METRIC_MAX,
_CGROUP_IP_ACCOUNTING_METRIC_INVALID = -1, _CGROUP_IP_ACCOUNTING_METRIC_INVALID = -EINVAL,
} CGroupIPAccountingMetric; } CGroupIPAccountingMetric;
/* Used when querying IO accounting data */ /* Used when querying IO accounting data */
@ -183,7 +183,7 @@ typedef enum CGroupIOAccountingMetric {
CGROUP_IO_READ_OPERATIONS, CGROUP_IO_READ_OPERATIONS,
CGROUP_IO_WRITE_OPERATIONS, CGROUP_IO_WRITE_OPERATIONS,
_CGROUP_IO_ACCOUNTING_METRIC_MAX, _CGROUP_IO_ACCOUNTING_METRIC_MAX,
_CGROUP_IO_ACCOUNTING_METRIC_INVALID = -1, _CGROUP_IO_ACCOUNTING_METRIC_INVALID = -EINVAL,
} CGroupIOAccountingMetric; } CGroupIOAccountingMetric;
typedef struct Unit Unit; typedef struct Unit Unit;

View File

@ -1452,7 +1452,7 @@ int bus_cgroup_set_property(
p = cgroup_device_policy_from_string(policy); p = cgroup_device_policy_from_string(policy);
if (p < 0) if (p < 0)
return -EINVAL; return p;
if (!UNIT_WRITE_FLAGS_NOOP(flags)) { if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
c->device_policy = p; c->device_policy = p;

View File

@ -338,7 +338,7 @@ static int bus_timer_set_transient_property(
b = timer_base_from_string(name); b = timer_base_from_string(name);
if (b < 0) if (b < 0)
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown timer base"); return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown timer base %s", name);
r = sd_bus_message_read(message, "t", &usec); r = sd_bus_message_read(message, "t", &usec);
if (r < 0) if (r < 0)

View File

@ -1982,7 +1982,7 @@ static int bus_unit_set_transient_property(
UnitWriteFlags flags, UnitWriteFlags flags,
sd_bus_error *error) { sd_bus_error *error) {
UnitDependency d = _UNIT_DEPENDENCY_INVALID; UnitDependency d;
int r; int r;
assert(u); assert(u);

View File

@ -1,6 +1,8 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once #pragma once
#include <errno.h>
typedef enum EmergencyAction { typedef enum EmergencyAction {
EMERGENCY_ACTION_NONE, EMERGENCY_ACTION_NONE,
EMERGENCY_ACTION_REBOOT, EMERGENCY_ACTION_REBOOT,
@ -13,7 +15,7 @@ typedef enum EmergencyAction {
_EMERGENCY_ACTION_FIRST_USER_ACTION = EMERGENCY_ACTION_EXIT, _EMERGENCY_ACTION_FIRST_USER_ACTION = EMERGENCY_ACTION_EXIT,
EMERGENCY_ACTION_EXIT_FORCE, EMERGENCY_ACTION_EXIT_FORCE,
_EMERGENCY_ACTION_MAX, _EMERGENCY_ACTION_MAX,
_EMERGENCY_ACTION_INVALID = -1 _EMERGENCY_ACTION_INVALID = -EINVAL,
} EmergencyAction; } EmergencyAction;
typedef enum EmergencyActionFlags { typedef enum EmergencyActionFlags {

View File

@ -33,7 +33,7 @@ typedef enum ExecUtmpMode {
EXEC_UTMP_LOGIN, EXEC_UTMP_LOGIN,
EXEC_UTMP_USER, EXEC_UTMP_USER,
_EXEC_UTMP_MODE_MAX, _EXEC_UTMP_MODE_MAX,
_EXEC_UTMP_MODE_INVALID = -1 _EXEC_UTMP_MODE_INVALID = -EINVAL,
} ExecUtmpMode; } ExecUtmpMode;
typedef enum ExecInput { typedef enum ExecInput {
@ -46,7 +46,7 @@ typedef enum ExecInput {
EXEC_INPUT_DATA, EXEC_INPUT_DATA,
EXEC_INPUT_FILE, EXEC_INPUT_FILE,
_EXEC_INPUT_MAX, _EXEC_INPUT_MAX,
_EXEC_INPUT_INVALID = -1 _EXEC_INPUT_INVALID = -EINVAL,
} ExecInput; } ExecInput;
typedef enum ExecOutput { typedef enum ExecOutput {
@ -63,7 +63,7 @@ typedef enum ExecOutput {
EXEC_OUTPUT_FILE_APPEND, EXEC_OUTPUT_FILE_APPEND,
EXEC_OUTPUT_FILE_TRUNCATE, EXEC_OUTPUT_FILE_TRUNCATE,
_EXEC_OUTPUT_MAX, _EXEC_OUTPUT_MAX,
_EXEC_OUTPUT_INVALID = -1 _EXEC_OUTPUT_INVALID = -EINVAL,
} ExecOutput; } ExecOutput;
typedef enum ExecPreserveMode { typedef enum ExecPreserveMode {
@ -71,7 +71,7 @@ typedef enum ExecPreserveMode {
EXEC_PRESERVE_YES, EXEC_PRESERVE_YES,
EXEC_PRESERVE_RESTART, EXEC_PRESERVE_RESTART,
_EXEC_PRESERVE_MODE_MAX, _EXEC_PRESERVE_MODE_MAX,
_EXEC_PRESERVE_MODE_INVALID = -1 _EXEC_PRESERVE_MODE_INVALID = -EINVAL,
} ExecPreserveMode; } ExecPreserveMode;
typedef enum ExecKeyringMode { typedef enum ExecKeyringMode {
@ -79,7 +79,7 @@ typedef enum ExecKeyringMode {
EXEC_KEYRING_PRIVATE, EXEC_KEYRING_PRIVATE,
EXEC_KEYRING_SHARED, EXEC_KEYRING_SHARED,
_EXEC_KEYRING_MODE_MAX, _EXEC_KEYRING_MODE_MAX,
_EXEC_KEYRING_MODE_INVALID = -1, _EXEC_KEYRING_MODE_INVALID = -EINVAL,
} ExecKeyringMode; } ExecKeyringMode;
/* Contains start and exit information about an executed command. */ /* Contains start and exit information about an executed command. */
@ -126,7 +126,7 @@ typedef enum ExecDirectoryType {
EXEC_DIRECTORY_LOGS, EXEC_DIRECTORY_LOGS,
EXEC_DIRECTORY_CONFIGURATION, EXEC_DIRECTORY_CONFIGURATION,
_EXEC_DIRECTORY_TYPE_MAX, _EXEC_DIRECTORY_TYPE_MAX,
_EXEC_DIRECTORY_TYPE_INVALID = -1, _EXEC_DIRECTORY_TYPE_INVALID = -EINVAL,
} ExecDirectoryType; } ExecDirectoryType;
typedef struct ExecDirectory { typedef struct ExecDirectory {
@ -144,7 +144,7 @@ typedef enum ExecCleanMask {
EXEC_CLEAN_CONFIGURATION = 1U << EXEC_DIRECTORY_CONFIGURATION, EXEC_CLEAN_CONFIGURATION = 1U << EXEC_DIRECTORY_CONFIGURATION,
EXEC_CLEAN_NONE = 0, EXEC_CLEAN_NONE = 0,
EXEC_CLEAN_ALL = (1U << _EXEC_DIRECTORY_TYPE_MAX) - 1, EXEC_CLEAN_ALL = (1U << _EXEC_DIRECTORY_TYPE_MAX) - 1,
_EXEC_CLEAN_MASK_INVALID = -1, _EXEC_CLEAN_MASK_INVALID = -EINVAL,
} ExecCleanMask; } ExecCleanMask;
/* A credential configured with SetCredential= */ /* A credential configured with SetCredential= */

View File

@ -57,14 +57,14 @@ enum JobType {
JOB_RELOAD_OR_START, /* if running, reload, otherwise start */ JOB_RELOAD_OR_START, /* if running, reload, otherwise start */
_JOB_TYPE_MAX, _JOB_TYPE_MAX,
_JOB_TYPE_INVALID = -1 _JOB_TYPE_INVALID = -EINVAL,
}; };
enum JobState { enum JobState {
JOB_WAITING, JOB_WAITING,
JOB_RUNNING, JOB_RUNNING,
_JOB_STATE_MAX, _JOB_STATE_MAX,
_JOB_STATE_INVALID = -1 _JOB_STATE_INVALID = -EINVAL,
}; };
enum JobMode { enum JobMode {
@ -77,7 +77,7 @@ enum JobMode {
JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */ JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
JOB_TRIGGERING, /* Adds TRIGGERED_BY dependencies to the same transaction */ JOB_TRIGGERING, /* Adds TRIGGERED_BY dependencies to the same transaction */
_JOB_MODE_MAX, _JOB_MODE_MAX,
_JOB_MODE_INVALID = -1 _JOB_MODE_INVALID = -EINVAL,
}; };
enum JobResult { enum JobResult {
@ -93,7 +93,7 @@ enum JobResult {
JOB_COLLECTED, /* Job was garbage collected, since nothing needed it anymore */ JOB_COLLECTED, /* Job was garbage collected, since nothing needed it anymore */
JOB_ONCE, /* Unit was started before, and hence can't be started again */ JOB_ONCE, /* Unit was started before, and hence can't be started again */
_JOB_RESULT_MAX, _JOB_RESULT_MAX,
_JOB_RESULT_INVALID = -1 _JOB_RESULT_INVALID = -EINVAL,
}; };
#include "unit.h" #include "unit.h"

View File

@ -15,7 +15,7 @@ typedef enum KillMode {
KILL_MIXED, KILL_MIXED,
KILL_NONE, KILL_NONE,
_KILL_MODE_MAX, _KILL_MODE_MAX,
_KILL_MODE_INVALID = -1 _KILL_MODE_INVALID = -EINVAL,
} KillMode; } KillMode;
struct KillContext { struct KillContext {
@ -37,7 +37,7 @@ typedef enum KillWho {
KILL_CONTROL_FAIL, KILL_CONTROL_FAIL,
KILL_ALL_FAIL, KILL_ALL_FAIL,
_KILL_WHO_MAX, _KILL_WHO_MAX,
_KILL_WHO_INVALID = -1 _KILL_WHO_INVALID = -EINVAL,
} KillWho; } KillWho;
void kill_context_init(KillContext *c); void kill_context_init(KillContext *c);

View File

@ -510,7 +510,7 @@ static int manager_setup_signals(Manager *m) {
SIGCHLD, /* Child died */ SIGCHLD, /* Child died */
SIGTERM, /* Reexecute daemon */ SIGTERM, /* Reexecute daemon */
SIGHUP, /* Reload configuration */ SIGHUP, /* Reload configuration */
SIGUSR1, /* systemd/upstart: reconnect to D-Bus */ SIGUSR1, /* systemd: reconnect to D-Bus */
SIGUSR2, /* systemd: dump status */ SIGUSR2, /* systemd: dump status */
SIGINT, /* Kernel sends us this on control-alt-del */ SIGINT, /* Kernel sends us this on control-alt-del */
SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */ SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
@ -3180,22 +3180,19 @@ static bool manager_timestamp_shall_serialize(ManagerTimestamp t) {
#define DESTROY_IPC_FLAG (UINT32_C(1) << 31) #define DESTROY_IPC_FLAG (UINT32_C(1) << 31)
static void manager_serialize_uid_refs_internal( static void manager_serialize_uid_refs_internal(
Manager *m,
FILE *f, FILE *f,
Hashmap **uid_refs, Hashmap *uid_refs,
const char *field_name) { const char *field_name) {
void *p, *k; void *p, *k;
assert(m);
assert(f); assert(f);
assert(uid_refs);
assert(field_name); assert(field_name);
/* Serialize the UID reference table. Or actually, just the IPC destruction flag of it, as /* Serialize the UID reference table. Or actually, just the IPC destruction flag of it, as
* the actual counter of it is better rebuild after a reload/reexec. */ * the actual counter of it is better rebuild after a reload/reexec. */
HASHMAP_FOREACH_KEY(p, k, *uid_refs) { HASHMAP_FOREACH_KEY(p, k, uid_refs) {
uint32_t c; uint32_t c;
uid_t uid; uid_t uid;
@ -3210,11 +3207,11 @@ static void manager_serialize_uid_refs_internal(
} }
static void manager_serialize_uid_refs(Manager *m, FILE *f) { static void manager_serialize_uid_refs(Manager *m, FILE *f) {
manager_serialize_uid_refs_internal(m, f, &m->uid_refs, "destroy-ipc-uid"); manager_serialize_uid_refs_internal(f, m->uid_refs, "destroy-ipc-uid");
} }
static void manager_serialize_gid_refs(Manager *m, FILE *f) { static void manager_serialize_gid_refs(Manager *m, FILE *f) {
manager_serialize_uid_refs_internal(m, f, &m->gid_refs, "destroy-ipc-gid"); manager_serialize_uid_refs_internal(f, m->gid_refs, "destroy-ipc-gid");
} }
int manager_serialize( int manager_serialize(
@ -3474,7 +3471,6 @@ void manager_retry_runtime_watchdog(Manager *m) {
} }
static void manager_deserialize_uid_refs_one_internal( static void manager_deserialize_uid_refs_one_internal(
Manager *m,
Hashmap** uid_refs, Hashmap** uid_refs,
const char *value) { const char *value) {
@ -3482,18 +3478,16 @@ static void manager_deserialize_uid_refs_one_internal(
uint32_t c; uint32_t c;
int r; int r;
assert(m);
assert(uid_refs); assert(uid_refs);
assert(value); assert(value);
r = parse_uid(value, &uid); r = parse_uid(value, &uid);
if (r < 0 || uid == 0) { if (r < 0 || uid == 0) {
log_debug("Unable to parse UID reference serialization: " UID_FMT, uid); log_debug("Unable to parse UID/GID reference serialization: " UID_FMT, uid);
return; return;
} }
r = hashmap_ensure_allocated(uid_refs, &trivial_hash_ops); if (hashmap_ensure_allocated(uid_refs, &trivial_hash_ops) < 0) {
if (r < 0) {
log_oom(); log_oom();
return; return;
} }
@ -3506,17 +3500,17 @@ static void manager_deserialize_uid_refs_one_internal(
r = hashmap_replace(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c)); r = hashmap_replace(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c));
if (r < 0) { if (r < 0) {
log_debug_errno(r, "Failed to add UID reference entry: %m"); log_debug_errno(r, "Failed to add UID/GID reference entry: %m");
return; return;
} }
} }
static void manager_deserialize_uid_refs_one(Manager *m, const char *value) { static void manager_deserialize_uid_refs_one(Manager *m, const char *value) {
manager_deserialize_uid_refs_one_internal(m, &m->uid_refs, value); manager_deserialize_uid_refs_one_internal(&m->uid_refs, value);
} }
static void manager_deserialize_gid_refs_one(Manager *m, const char *value) { static void manager_deserialize_gid_refs_one(Manager *m, const char *value) {
manager_deserialize_uid_refs_one_internal(m, &m->gid_refs, value); manager_deserialize_uid_refs_one_internal(&m->gid_refs, value);
} }
int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
@ -4590,16 +4584,13 @@ ManagerState manager_state(Manager *m) {
} }
static void manager_unref_uid_internal( static void manager_unref_uid_internal(
Manager *m, Hashmap *uid_refs,
Hashmap **uid_refs,
uid_t uid, uid_t uid,
bool destroy_now, bool destroy_now,
int (*_clean_ipc)(uid_t uid)) { int (*_clean_ipc)(uid_t uid)) {
uint32_t c, n; uint32_t c, n;
assert(m);
assert(uid_refs);
assert(uid_is_valid(uid)); assert(uid_is_valid(uid));
assert(_clean_ipc); assert(_clean_ipc);
@ -4617,14 +4608,14 @@ static void manager_unref_uid_internal(
if (uid == 0) /* We don't keep track of root, and will never destroy it */ if (uid == 0) /* We don't keep track of root, and will never destroy it */
return; return;
c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid))); c = PTR_TO_UINT32(hashmap_get(uid_refs, UID_TO_PTR(uid)));
n = c & ~DESTROY_IPC_FLAG; n = c & ~DESTROY_IPC_FLAG;
assert(n > 0); assert(n > 0);
n--; n--;
if (destroy_now && n == 0) { if (destroy_now && n == 0) {
hashmap_remove(*uid_refs, UID_TO_PTR(uid)); hashmap_remove(uid_refs, UID_TO_PTR(uid));
if (c & DESTROY_IPC_FLAG) { if (c & DESTROY_IPC_FLAG) {
log_debug("%s " UID_FMT " is no longer referenced, cleaning up its IPC.", log_debug("%s " UID_FMT " is no longer referenced, cleaning up its IPC.",
@ -4634,20 +4625,19 @@ static void manager_unref_uid_internal(
} }
} else { } else {
c = n | (c & DESTROY_IPC_FLAG); c = n | (c & DESTROY_IPC_FLAG);
assert_se(hashmap_update(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c)) >= 0); assert_se(hashmap_update(uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c)) >= 0);
} }
} }
void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now) { void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now) {
manager_unref_uid_internal(m, &m->uid_refs, uid, destroy_now, clean_ipc_by_uid); manager_unref_uid_internal(m->uid_refs, uid, destroy_now, clean_ipc_by_uid);
} }
void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now) { void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now) {
manager_unref_uid_internal(m, &m->gid_refs, (uid_t) gid, destroy_now, clean_ipc_by_gid); manager_unref_uid_internal(m->gid_refs, (uid_t) gid, destroy_now, clean_ipc_by_gid);
} }
static int manager_ref_uid_internal( static int manager_ref_uid_internal(
Manager *m,
Hashmap **uid_refs, Hashmap **uid_refs,
uid_t uid, uid_t uid,
bool clean_ipc) { bool clean_ipc) {
@ -4655,7 +4645,6 @@ static int manager_ref_uid_internal(
uint32_t c, n; uint32_t c, n;
int r; int r;
assert(m);
assert(uid_refs); assert(uid_refs);
assert(uid_is_valid(uid)); assert(uid_is_valid(uid));
@ -4686,25 +4675,22 @@ static int manager_ref_uid_internal(
} }
int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc) { int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc) {
return manager_ref_uid_internal(m, &m->uid_refs, uid, clean_ipc); return manager_ref_uid_internal(&m->uid_refs, uid, clean_ipc);
} }
int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc) { int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc) {
return manager_ref_uid_internal(m, &m->gid_refs, (uid_t) gid, clean_ipc); return manager_ref_uid_internal(&m->gid_refs, (uid_t) gid, clean_ipc);
} }
static void manager_vacuum_uid_refs_internal( static void manager_vacuum_uid_refs_internal(
Manager *m, Hashmap *uid_refs,
Hashmap **uid_refs,
int (*_clean_ipc)(uid_t uid)) { int (*_clean_ipc)(uid_t uid)) {
void *p, *k; void *p, *k;
assert(m);
assert(uid_refs);
assert(_clean_ipc); assert(_clean_ipc);
HASHMAP_FOREACH_KEY(p, k, *uid_refs) { HASHMAP_FOREACH_KEY(p, k, uid_refs) {
uint32_t c, n; uint32_t c, n;
uid_t uid; uid_t uid;
@ -4722,16 +4708,16 @@ static void manager_vacuum_uid_refs_internal(
(void) _clean_ipc(uid); (void) _clean_ipc(uid);
} }
assert_se(hashmap_remove(*uid_refs, k) == p); assert_se(hashmap_remove(uid_refs, k) == p);
} }
} }
static void manager_vacuum_uid_refs(Manager *m) { static void manager_vacuum_uid_refs(Manager *m) {
manager_vacuum_uid_refs_internal(m, &m->uid_refs, clean_ipc_by_uid); manager_vacuum_uid_refs_internal(m->uid_refs, clean_ipc_by_uid);
} }
static void manager_vacuum_gid_refs(Manager *m) { static void manager_vacuum_gid_refs(Manager *m) {
manager_vacuum_uid_refs_internal(m, &m->gid_refs, clean_ipc_by_gid); manager_vacuum_uid_refs_internal(m->gid_refs, clean_ipc_by_gid);
} }
static void manager_vacuum(Manager *m) { static void manager_vacuum(Manager *m) {

View File

@ -36,7 +36,7 @@ typedef enum ManagerState {
MANAGER_MAINTENANCE, MANAGER_MAINTENANCE,
MANAGER_STOPPING, MANAGER_STOPPING,
_MANAGER_STATE_MAX, _MANAGER_STATE_MAX,
_MANAGER_STATE_INVALID = -1 _MANAGER_STATE_INVALID = -EINVAL,
} ManagerState; } ManagerState;
typedef enum ManagerObjective { typedef enum ManagerObjective {
@ -50,7 +50,7 @@ typedef enum ManagerObjective {
MANAGER_KEXEC, MANAGER_KEXEC,
MANAGER_SWITCH_ROOT, MANAGER_SWITCH_ROOT,
_MANAGER_OBJECTIVE_MAX, _MANAGER_OBJECTIVE_MAX,
_MANAGER_OBJECTIVE_INVALID = -1 _MANAGER_OBJECTIVE_INVALID = -EINVAL,
} ManagerObjective; } ManagerObjective;
typedef enum StatusType { typedef enum StatusType {
@ -65,7 +65,7 @@ typedef enum OOMPolicy {
OOM_STOP, /* The kernel kills the process it wants to kill, and we stop the unit */ OOM_STOP, /* The kernel kills the process it wants to kill, and we stop the unit */
OOM_KILL, /* The kernel kills the process it wants to kill, and all others in the unit, and we stop the unit */ OOM_KILL, /* The kernel kills the process it wants to kill, and all others in the unit, and we stop the unit */
_OOM_POLICY_MAX, _OOM_POLICY_MAX,
_OOM_POLICY_INVALID = -1 _OOM_POLICY_INVALID = -EINVAL,
} OOMPolicy; } OOMPolicy;
/* Notes: /* Notes:
@ -111,7 +111,7 @@ typedef enum ManagerTimestamp {
MANAGER_TIMESTAMP_INITRD_UNITS_LOAD_START, MANAGER_TIMESTAMP_INITRD_UNITS_LOAD_START,
MANAGER_TIMESTAMP_INITRD_UNITS_LOAD_FINISH, MANAGER_TIMESTAMP_INITRD_UNITS_LOAD_FINISH,
_MANAGER_TIMESTAMP_MAX, _MANAGER_TIMESTAMP_MAX,
_MANAGER_TIMESTAMP_INVALID = -1, _MANAGER_TIMESTAMP_INVALID = -EINVAL,
} ManagerTimestamp; } ManagerTimestamp;
typedef enum WatchdogType { typedef enum WatchdogType {
@ -311,25 +311,25 @@ struct Manager {
/* The stat() data the last time we saw /etc/localtime */ /* The stat() data the last time we saw /etc/localtime */
usec_t etc_localtime_mtime; usec_t etc_localtime_mtime;
bool etc_localtime_accessible:1; bool etc_localtime_accessible;
ManagerObjective objective:5; ManagerObjective objective;
/* Flags */ /* Flags */
bool dispatching_load_queue:1; bool dispatching_load_queue;
bool taint_usr:1; bool taint_usr;
/* Have we already sent out the READY=1 notification? */ /* Have we already sent out the READY=1 notification? */
bool ready_sent:1; bool ready_sent;
/* Have we already printed the taint line if necessary? */ /* Have we already printed the taint line if necessary? */
bool taint_logged:1; bool taint_logged;
/* Have we ever changed the "kernel.pid_max" sysctl? */ /* Have we ever changed the "kernel.pid_max" sysctl? */
bool sysctl_pid_max_changed:1; bool sysctl_pid_max_changed;
ManagerTestRunFlags test_run_flags:8; ManagerTestRunFlags test_run_flags;
/* If non-zero, exit with the following value when the systemd /* If non-zero, exit with the following value when the systemd
* process terminate. Useful for containers: systemd-nspawn could get * process terminate. Useful for containers: systemd-nspawn could get
@ -366,8 +366,8 @@ struct Manager {
int original_log_level; int original_log_level;
LogTarget original_log_target; LogTarget original_log_target;
bool log_level_overridden:1; bool log_level_overridden;
bool log_target_overridden:1; bool log_target_overridden;
struct rlimit *rlimit[_RLIMIT_MAX]; struct rlimit *rlimit[_RLIMIT_MAX];
@ -537,7 +537,7 @@ void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc); int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now); void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
int manager_ref_gid(Manager *m, gid_t gid, bool destroy_now); int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc);
char *manager_taint_string(Manager *m); char *manager_taint_string(Manager *m);

View File

@ -12,7 +12,7 @@ typedef enum MountExecCommand {
MOUNT_EXEC_UNMOUNT, MOUNT_EXEC_UNMOUNT,
MOUNT_EXEC_REMOUNT, MOUNT_EXEC_REMOUNT,
_MOUNT_EXEC_COMMAND_MAX, _MOUNT_EXEC_COMMAND_MAX,
_MOUNT_EXEC_COMMAND_INVALID = -1 _MOUNT_EXEC_COMMAND_INVALID = -EINVAL,
} MountExecCommand; } MountExecCommand;
typedef enum MountResult { typedef enum MountResult {
@ -25,7 +25,7 @@ typedef enum MountResult {
MOUNT_FAILURE_START_LIMIT_HIT, MOUNT_FAILURE_START_LIMIT_HIT,
MOUNT_FAILURE_PROTOCOL, MOUNT_FAILURE_PROTOCOL,
_MOUNT_RESULT_MAX, _MOUNT_RESULT_MAX,
_MOUNT_RESULT_INVALID = -1 _MOUNT_RESULT_INVALID = -EINVAL,
} MountResult; } MountResult;
typedef struct MountParameters { typedef struct MountParameters {

View File

@ -23,7 +23,7 @@ typedef enum ProtectHome {
PROTECT_HOME_READ_ONLY, PROTECT_HOME_READ_ONLY,
PROTECT_HOME_TMPFS, PROTECT_HOME_TMPFS,
_PROTECT_HOME_MAX, _PROTECT_HOME_MAX,
_PROTECT_HOME_INVALID = -1 _PROTECT_HOME_INVALID = -EINVAL,
} ProtectHome; } ProtectHome;
typedef enum NamespaceType { typedef enum NamespaceType {
@ -35,7 +35,7 @@ typedef enum NamespaceType {
NAMESPACE_PID, NAMESPACE_PID,
NAMESPACE_NET, NAMESPACE_NET,
_NAMESPACE_TYPE_MAX, _NAMESPACE_TYPE_MAX,
_NAMESPACE_TYPE_INVALID = -1, _NAMESPACE_TYPE_INVALID = -EINVAL,
} NamespaceType; } NamespaceType;
typedef enum ProtectSystem { typedef enum ProtectSystem {
@ -44,7 +44,7 @@ typedef enum ProtectSystem {
PROTECT_SYSTEM_FULL, PROTECT_SYSTEM_FULL,
PROTECT_SYSTEM_STRICT, PROTECT_SYSTEM_STRICT,
_PROTECT_SYSTEM_MAX, _PROTECT_SYSTEM_MAX,
_PROTECT_SYSTEM_INVALID = -1 _PROTECT_SYSTEM_INVALID = -EINVAL,
} ProtectSystem; } ProtectSystem;
typedef enum ProtectProc { typedef enum ProtectProc {
@ -53,14 +53,14 @@ typedef enum ProtectProc {
PROTECT_PROC_INVISIBLE, /* hidepid=invisible */ PROTECT_PROC_INVISIBLE, /* hidepid=invisible */
PROTECT_PROC_PTRACEABLE, /* hidepid=ptraceable */ PROTECT_PROC_PTRACEABLE, /* hidepid=ptraceable */
_PROTECT_PROC_MAX, _PROTECT_PROC_MAX,
_PROTECT_PROC_INVALID = -1, _PROTECT_PROC_INVALID = -EINVAL,
} ProtectProc; } ProtectProc;
typedef enum ProcSubset { typedef enum ProcSubset {
PROC_SUBSET_ALL, PROC_SUBSET_ALL,
PROC_SUBSET_PID, /* subset=pid */ PROC_SUBSET_PID, /* subset=pid */
_PROC_SUBSET_MAX, _PROC_SUBSET_MAX,
_PROC_SUBSET_INVALID = -1, _PROC_SUBSET_INVALID = -EINVAL,
} ProcSubset; } ProcSubset;
struct NamespaceInfo { struct NamespaceInfo {

View File

@ -13,7 +13,7 @@ typedef enum PathType {
PATH_CHANGED, PATH_CHANGED,
PATH_MODIFIED, PATH_MODIFIED,
_PATH_TYPE_MAX, _PATH_TYPE_MAX,
_PATH_TYPE_INVALID = -1 _PATH_TYPE_INVALID = -EINVAL,
} PathType; } PathType;
typedef struct PathSpec { typedef struct PathSpec {
@ -47,7 +47,7 @@ typedef enum PathResult {
PATH_FAILURE_START_LIMIT_HIT, PATH_FAILURE_START_LIMIT_HIT,
PATH_FAILURE_UNIT_START_LIMIT_HIT, PATH_FAILURE_UNIT_START_LIMIT_HIT,
_PATH_RESULT_MAX, _PATH_RESULT_MAX,
_PATH_RESULT_INVALID = -1 _PATH_RESULT_INVALID = -EINVAL,
} PathResult; } PathResult;
struct Path { struct Path {

View File

@ -12,7 +12,7 @@ typedef enum ScopeResult {
SCOPE_FAILURE_RESOURCES, SCOPE_FAILURE_RESOURCES,
SCOPE_FAILURE_TIMEOUT, SCOPE_FAILURE_TIMEOUT,
_SCOPE_RESULT_MAX, _SCOPE_RESULT_MAX,
_SCOPE_RESULT_INVALID = -1 _SCOPE_RESULT_INVALID = -EINVAL,
} ScopeResult; } ScopeResult;
struct Scope { struct Scope {

View File

@ -2738,7 +2738,7 @@ static int service_deserialize_exec_command(
STATE_EXEC_COMMAND_PATH, STATE_EXEC_COMMAND_PATH,
STATE_EXEC_COMMAND_ARGS, STATE_EXEC_COMMAND_ARGS,
_STATE_EXEC_COMMAND_MAX, _STATE_EXEC_COMMAND_MAX,
_STATE_EXEC_COMMAND_INVALID = -1, _STATE_EXEC_COMMAND_INVALID = -EINVAL,
} state; } state;
assert(s); assert(s);
@ -2762,14 +2762,14 @@ static int service_deserialize_exec_command(
case STATE_EXEC_COMMAND_TYPE: case STATE_EXEC_COMMAND_TYPE:
id = service_exec_command_from_string(arg); id = service_exec_command_from_string(arg);
if (id < 0) if (id < 0)
return -EINVAL; return id;
state = STATE_EXEC_COMMAND_INDEX; state = STATE_EXEC_COMMAND_INDEX;
break; break;
case STATE_EXEC_COMMAND_INDEX: case STATE_EXEC_COMMAND_INDEX:
r = safe_atou(arg, &idx); r = safe_atou(arg, &idx);
if (r < 0) if (r < 0)
return -EINVAL; return r;
state = STATE_EXEC_COMMAND_PATH; state = STATE_EXEC_COMMAND_PATH;
break; break;

View File

@ -20,7 +20,7 @@ typedef enum ServiceRestart {
SERVICE_RESTART_ON_ABORT, SERVICE_RESTART_ON_ABORT,
SERVICE_RESTART_ALWAYS, SERVICE_RESTART_ALWAYS,
_SERVICE_RESTART_MAX, _SERVICE_RESTART_MAX,
_SERVICE_RESTART_INVALID = -1 _SERVICE_RESTART_INVALID = -EINVAL,
} ServiceRestart; } ServiceRestart;
typedef enum ServiceType { typedef enum ServiceType {
@ -32,7 +32,7 @@ typedef enum ServiceType {
SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */ SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
SERVICE_EXEC, /* we fork and wait until we execute exec() (this means our own setup is waited for) */ SERVICE_EXEC, /* we fork and wait until we execute exec() (this means our own setup is waited for) */
_SERVICE_TYPE_MAX, _SERVICE_TYPE_MAX,
_SERVICE_TYPE_INVALID = -1 _SERVICE_TYPE_INVALID = -EINVAL,
} ServiceType; } ServiceType;
typedef enum ServiceExecCommand { typedef enum ServiceExecCommand {
@ -44,7 +44,7 @@ typedef enum ServiceExecCommand {
SERVICE_EXEC_STOP, SERVICE_EXEC_STOP,
SERVICE_EXEC_STOP_POST, SERVICE_EXEC_STOP_POST,
_SERVICE_EXEC_COMMAND_MAX, _SERVICE_EXEC_COMMAND_MAX,
_SERVICE_EXEC_COMMAND_INVALID = -1 _SERVICE_EXEC_COMMAND_INVALID = -EINVAL,
} ServiceExecCommand; } ServiceExecCommand;
typedef enum NotifyState { typedef enum NotifyState {
@ -53,7 +53,7 @@ typedef enum NotifyState {
NOTIFY_RELOADING, NOTIFY_RELOADING,
NOTIFY_STOPPING, NOTIFY_STOPPING,
_NOTIFY_STATE_MAX, _NOTIFY_STATE_MAX,
_NOTIFY_STATE_INVALID = -1 _NOTIFY_STATE_INVALID = -EINVAL,
} NotifyState; } NotifyState;
/* The values of this enum are referenced in man/systemd.exec.xml and src/shared/bus-unit-util.c. /* The values of this enum are referenced in man/systemd.exec.xml and src/shared/bus-unit-util.c.
@ -71,7 +71,7 @@ typedef enum ServiceResult {
SERVICE_FAILURE_OOM_KILL, SERVICE_FAILURE_OOM_KILL,
SERVICE_SKIP_CONDITION, SERVICE_SKIP_CONDITION,
_SERVICE_RESULT_MAX, _SERVICE_RESULT_MAX,
_SERVICE_RESULT_INVALID = -1 _SERVICE_RESULT_INVALID = -EINVAL,
} ServiceResult; } ServiceResult;
typedef enum ServiceTimeoutFailureMode { typedef enum ServiceTimeoutFailureMode {
@ -79,7 +79,7 @@ typedef enum ServiceTimeoutFailureMode {
SERVICE_TIMEOUT_ABORT, SERVICE_TIMEOUT_ABORT,
SERVICE_TIMEOUT_KILL, SERVICE_TIMEOUT_KILL,
_SERVICE_TIMEOUT_FAILURE_MODE_MAX, _SERVICE_TIMEOUT_FAILURE_MODE_MAX,
_SERVICE_TIMEOUT_FAILURE_MODE_INVALID = -1 _SERVICE_TIMEOUT_FAILURE_MODE_INVALID = -EINVAL,
} ServiceTimeoutFailureMode; } ServiceTimeoutFailureMode;
struct ServiceFDStore { struct ServiceFDStore {

View File

@ -14,7 +14,7 @@ typedef enum ShowStatus {
SHOW_STATUS_TEMPORARY, /* enabled temporarily, may flip back to _AUTO */ SHOW_STATUS_TEMPORARY, /* enabled temporarily, may flip back to _AUTO */
SHOW_STATUS_YES, /* printing of status is enabled */ SHOW_STATUS_YES, /* printing of status is enabled */
_SHOW_STATUS_MAX, _SHOW_STATUS_MAX,
_SHOW_STATUS_INVALID = -1, _SHOW_STATUS_INVALID = -EINVAL,
} ShowStatus; } ShowStatus;
typedef enum ShowStatusFlags { typedef enum ShowStatusFlags {
@ -26,7 +26,7 @@ typedef enum StatusUnitFormat {
STATUS_UNIT_FORMAT_NAME, STATUS_UNIT_FORMAT_NAME,
STATUS_UNIT_FORMAT_DESCRIPTION, STATUS_UNIT_FORMAT_DESCRIPTION,
_STATUS_UNIT_FORMAT_MAX, _STATUS_UNIT_FORMAT_MAX,
_STATUS_UNIT_FORMAT_INVALID = -1, _STATUS_UNIT_FORMAT_INVALID = -EINVAL,
} StatusUnitFormat; } StatusUnitFormat;
static inline bool show_status_on(ShowStatus s) { static inline bool show_status_on(ShowStatus s) {

View File

@ -16,7 +16,7 @@ typedef enum SocketExecCommand {
SOCKET_EXEC_STOP_PRE, SOCKET_EXEC_STOP_PRE,
SOCKET_EXEC_STOP_POST, SOCKET_EXEC_STOP_POST,
_SOCKET_EXEC_COMMAND_MAX, _SOCKET_EXEC_COMMAND_MAX,
_SOCKET_EXEC_COMMAND_INVALID = -1 _SOCKET_EXEC_COMMAND_INVALID = -EINVAL,
} SocketExecCommand; } SocketExecCommand;
typedef enum SocketType { typedef enum SocketType {
@ -26,7 +26,7 @@ typedef enum SocketType {
SOCKET_MQUEUE, SOCKET_MQUEUE,
SOCKET_USB_FUNCTION, SOCKET_USB_FUNCTION,
_SOCKET_TYPE_MAX, _SOCKET_TYPE_MAX,
_SOCKET_TYPE_INVALID = -1 _SOCKET_TYPE_INVALID = -EINVAL,
} SocketType; } SocketType;
typedef enum SocketResult { typedef enum SocketResult {
@ -40,7 +40,7 @@ typedef enum SocketResult {
SOCKET_FAILURE_TRIGGER_LIMIT_HIT, SOCKET_FAILURE_TRIGGER_LIMIT_HIT,
SOCKET_FAILURE_SERVICE_START_LIMIT_HIT, SOCKET_FAILURE_SERVICE_START_LIMIT_HIT,
_SOCKET_RESULT_MAX, _SOCKET_RESULT_MAX,
_SOCKET_RESULT_INVALID = -1 _SOCKET_RESULT_INVALID = -EINVAL,
} SocketResult; } SocketResult;
typedef struct SocketPort { typedef struct SocketPort {
@ -63,7 +63,7 @@ typedef enum SocketTimestamping {
SOCKET_TIMESTAMPING_US, /* SO_TIMESTAMP */ SOCKET_TIMESTAMPING_US, /* SO_TIMESTAMP */
SOCKET_TIMESTAMPING_NS, /* SO_TIMESTAMPNS */ SOCKET_TIMESTAMPING_NS, /* SO_TIMESTAMPNS */
_SOCKET_TIMESTAMPING_MAX, _SOCKET_TIMESTAMPING_MAX,
_SOCKET_TIMESTAMPING_INVALID = -1, _SOCKET_TIMESTAMPING_INVALID = -EINVAL,
} SocketTimestamping; } SocketTimestamping;
struct Socket { struct Socket {

View File

@ -14,7 +14,7 @@ typedef enum SwapExecCommand {
SWAP_EXEC_ACTIVATE, SWAP_EXEC_ACTIVATE,
SWAP_EXEC_DEACTIVATE, SWAP_EXEC_DEACTIVATE,
_SWAP_EXEC_COMMAND_MAX, _SWAP_EXEC_COMMAND_MAX,
_SWAP_EXEC_COMMAND_INVALID = -1 _SWAP_EXEC_COMMAND_INVALID = -EINVAL,
} SwapExecCommand; } SwapExecCommand;
typedef enum SwapResult { typedef enum SwapResult {
@ -26,7 +26,7 @@ typedef enum SwapResult {
SWAP_FAILURE_CORE_DUMP, SWAP_FAILURE_CORE_DUMP,
SWAP_FAILURE_START_LIMIT_HIT, SWAP_FAILURE_START_LIMIT_HIT,
_SWAP_RESULT_MAX, _SWAP_RESULT_MAX,
_SWAP_RESULT_INVALID = -1 _SWAP_RESULT_INVALID = -EINVAL,
} SwapResult; } SwapResult;
typedef struct SwapParameters { typedef struct SwapParameters {

View File

@ -14,7 +14,7 @@ typedef enum TimerBase {
TIMER_UNIT_INACTIVE, TIMER_UNIT_INACTIVE,
TIMER_CALENDAR, TIMER_CALENDAR,
_TIMER_BASE_MAX, _TIMER_BASE_MAX,
_TIMER_BASE_INVALID = -1 _TIMER_BASE_INVALID = -EINVAL,
} TimerBase; } TimerBase;
typedef struct TimerValue { typedef struct TimerValue {
@ -33,7 +33,7 @@ typedef enum TimerResult {
TIMER_FAILURE_RESOURCES, TIMER_FAILURE_RESOURCES,
TIMER_FAILURE_START_LIMIT_HIT, TIMER_FAILURE_START_LIMIT_HIT,
_TIMER_RESULT_MAX, _TIMER_RESULT_MAX,
_TIMER_RESULT_INVALID = -1 _TIMER_RESULT_INVALID = -EINVAL,
} TimerResult; } TimerResult;
struct Timer { struct Timer {

View File

@ -6094,7 +6094,7 @@ void unit_log_success(Unit *u) {
"MESSAGE_ID=" SD_MESSAGE_UNIT_SUCCESS_STR, "MESSAGE_ID=" SD_MESSAGE_UNIT_SUCCESS_STR,
LOG_UNIT_ID(u), LOG_UNIT_ID(u),
LOG_UNIT_INVOCATION_ID(u), LOG_UNIT_INVOCATION_ID(u),
LOG_UNIT_MESSAGE(u, "Succeeded.")); LOG_UNIT_MESSAGE(u, "Deactivated successfully."));
} }
void unit_log_failure(Unit *u, const char *result) { void unit_log_failure(Unit *u, const char *result) {

View File

@ -23,14 +23,14 @@ typedef enum KillOperation {
KILL_KILL, KILL_KILL,
KILL_WATCHDOG, KILL_WATCHDOG,
_KILL_OPERATION_MAX, _KILL_OPERATION_MAX,
_KILL_OPERATION_INVALID = -1 _KILL_OPERATION_INVALID = -EINVAL,
} KillOperation; } KillOperation;
typedef enum CollectMode { typedef enum CollectMode {
COLLECT_INACTIVE, COLLECT_INACTIVE,
COLLECT_INACTIVE_OR_FAILED, COLLECT_INACTIVE_OR_FAILED,
_COLLECT_MODE_MAX, _COLLECT_MODE_MAX,
_COLLECT_MODE_INVALID = -1, _COLLECT_MODE_INVALID = -EINVAL,
} CollectMode; } CollectMode;
static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) { static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {

View File

@ -124,7 +124,7 @@ typedef enum CoredumpStorage {
COREDUMP_STORAGE_EXTERNAL, COREDUMP_STORAGE_EXTERNAL,
COREDUMP_STORAGE_JOURNAL, COREDUMP_STORAGE_JOURNAL,
_COREDUMP_STORAGE_MAX, _COREDUMP_STORAGE_MAX,
_COREDUMP_STORAGE_INVALID = -1 _COREDUMP_STORAGE_INVALID = -EINVAL,
} CoredumpStorage; } CoredumpStorage;
static const char* const coredump_storage_table[_COREDUMP_STORAGE_MAX] = { static const char* const coredump_storage_table[_COREDUMP_STORAGE_MAX] = {

View File

@ -16,6 +16,7 @@
#include "compress.h" #include "compress.h"
#include "def.h" #include "def.h"
#include "fd-util.h" #include "fd-util.h"
#include "format-table.h"
#include "fs-util.h" #include "fs-util.h"
#include "glob-util.h" #include "glob-util.h"
#include "journal-internal.h" #include "journal-internal.h"
@ -47,9 +48,10 @@ static const char *arg_debugger = NULL;
static char **arg_debugger_args = NULL; static char **arg_debugger_args = NULL;
static const char *arg_directory = NULL; static const char *arg_directory = NULL;
static char **arg_file = NULL; static char **arg_file = NULL;
static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
static PagerFlags arg_pager_flags = 0; static PagerFlags arg_pager_flags = 0;
static int arg_no_legend = false; static int arg_legend = true;
static int arg_one = false; static size_t arg_rows_max = SIZE_MAX;
static const char* arg_output = NULL; static const char* arg_output = NULL;
static bool arg_reverse = false; static bool arg_reverse = false;
static bool arg_quiet = false; static bool arg_quiet = false;
@ -155,20 +157,23 @@ static int help(void) {
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
printf("%s [OPTIONS...] COMMAND ...\n\n" printf("%1$s [OPTIONS...] COMMAND ...\n\n"
"%sList or retrieve coredumps from the journal.%s\n" "%5$sList or retrieve coredumps from the journal.%6$s\n"
"\nCommands:\n" "\n%3$sCommands:%4$s\n"
" list [MATCHES...] List available coredumps (default)\n" " list [MATCHES...] List available coredumps (default)\n"
" info [MATCHES...] Show detailed information about one or more coredumps\n" " info [MATCHES...] Show detailed information about one or more coredumps\n"
" dump [MATCHES...] Print first matching coredump to stdout\n" " dump [MATCHES...] Print first matching coredump to stdout\n"
" debug [MATCHES...] Start a debugger for the first matching coredump\n" " debug [MATCHES...] Start a debugger for the first matching coredump\n"
"\nOptions:\n" "\n%3$sOptions:%4$s\n"
" -h --help Show this help\n" " -h --help Show this help\n"
" --version Print version string\n" " --version Print version string\n"
" --no-pager Do not pipe output into a pager\n" " --no-pager Do not pipe output into a pager\n"
" --no-legend Do not print the column headers\n" " --no-legend Do not print the column headers\n"
" --json=pretty|short|off\n"
" Generate JSON output\n"
" --debugger=DEBUGGER Use the given debugger\n" " --debugger=DEBUGGER Use the given debugger\n"
" -A --debugger-arguments=ARGS Pass the given arguments to the debugger\n" " -A --debugger-arguments=ARGS Pass the given arguments to the debugger\n"
" -n INT Show maximum number of rows\n"
" -1 Show information about most recent entry only\n" " -1 Show information about most recent entry only\n"
" -S --since=DATE Only print coredumps since the date\n" " -S --since=DATE Only print coredumps since the date\n"
" -U --until=DATE Only print coredumps until the date\n" " -U --until=DATE Only print coredumps until the date\n"
@ -178,11 +183,13 @@ static int help(void) {
" --file=PATH Use journal file\n" " --file=PATH Use journal file\n"
" -D --directory=DIR Use journal files from directory\n\n" " -D --directory=DIR Use journal files from directory\n\n"
" -q --quiet Do not show info messages and privilege warning\n" " -q --quiet Do not show info messages and privilege warning\n"
"\nSee the %s for details.\n", "\nSee the %2$s for details.\n",
program_invocation_short_name, program_invocation_short_name,
ansi_highlight(), link,
ansi_underline(),
ansi_normal(), ansi_normal(),
link); ansi_highlight(),
ansi_normal());
return 0; return 0;
} }
@ -192,6 +199,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_VERSION = 0x100, ARG_VERSION = 0x100,
ARG_NO_PAGER, ARG_NO_PAGER,
ARG_NO_LEGEND, ARG_NO_LEGEND,
ARG_JSON,
ARG_DEBUGGER, ARG_DEBUGGER,
ARG_FILE, ARG_FILE,
}; };
@ -213,13 +221,14 @@ static int parse_argv(int argc, char *argv[]) {
{ "since", required_argument, NULL, 'S' }, { "since", required_argument, NULL, 'S' },
{ "until", required_argument, NULL, 'U' }, { "until", required_argument, NULL, 'U' },
{ "quiet", no_argument, NULL, 'q' }, { "quiet", no_argument, NULL, 'q' },
{ "json", required_argument, NULL, ARG_JSON },
{} {}
}; };
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
while ((c = getopt_long(argc, argv, "hA:o:F:1D:rS:U:q", options, NULL)) >= 0) while ((c = getopt_long(argc, argv, "hA:o:F:1D:rS:U:qn:", options, NULL)) >= 0)
switch(c) { switch(c) {
case 'h': case 'h':
return help(); return help();
@ -232,7 +241,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case ARG_NO_LEGEND: case ARG_NO_LEGEND:
arg_no_legend = true; arg_legend = false;
break; break;
case ARG_DEBUGGER: case ARG_DEBUGGER:
@ -282,9 +291,22 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
case '1': case '1':
arg_one = true; arg_rows_max = 1;
arg_reverse = true;
break; break;
case 'n': {
unsigned n;
r = safe_atou(optarg, &n);
if (r < 0 || n < 1)
return log_error_errno(r < 0 ? r : SYNTHETIC_ERRNO(EINVAL),
"Invalid numeric parameter to -n: %s", optarg);
arg_rows_max = n;
break;
}
case 'D': case 'D':
arg_directory = optarg; arg_directory = optarg;
break; break;
@ -297,6 +319,13 @@ static int parse_argv(int argc, char *argv[]) {
arg_quiet = true; arg_quiet = true;
break; break;
case ARG_JSON:
r = json_parse_cmdline_parameter_and_warn(optarg, &arg_json_format_flags);
if (r <= 0)
return r;
break;
case '?': case '?':
return -EINVAL; return -EINVAL;
@ -376,21 +405,78 @@ static int print_field(FILE* file, sd_journal *j) {
continue; \ continue; \
} }
static int print_list(FILE* file, sd_journal *j, int had_legend) { static void analyze_coredump_file(
const char *path,
const char **ret_state,
const char **ret_color,
uint64_t *ret_size) {
_cleanup_close_ int fd = -1;
struct stat st;
int r;
assert(path);
assert(ret_state);
assert(ret_color);
assert(ret_size);
fd = open(path, O_PATH|O_CLOEXEC);
if (fd < 0) {
if (errno == ENOENT) {
*ret_state = "missing";
*ret_color = ansi_grey();
*ret_size = UINT64_MAX;
return;
}
r = -errno;
} else
r = access_fd(fd, R_OK);
if (ERRNO_IS_PRIVILEGE(r)) {
*ret_state = "inaccessible";
*ret_color = ansi_highlight_yellow();
*ret_size = UINT64_MAX;
return;
}
if (r < 0)
goto error;
if (fstat(fd, &st) < 0)
goto error;
if (!S_ISREG(st.st_mode))
goto error;
*ret_state = "present";
*ret_color = NULL;
*ret_size = st.st_size;
return;
error:
*ret_state = "error";
*ret_color = ansi_highlight_red();
*ret_size = UINT64_MAX;
}
static int print_list(FILE* file, sd_journal *j, Table *t) {
_cleanup_free_ char _cleanup_free_ char
*mid = NULL, *pid = NULL, *uid = NULL, *gid = NULL, *mid = NULL, *pid = NULL, *uid = NULL, *gid = NULL,
*sgnl = NULL, *exe = NULL, *comm = NULL, *cmdline = NULL, *sgnl = NULL, *exe = NULL, *comm = NULL, *cmdline = NULL,
*filename = NULL, *truncated = NULL, *coredump = NULL; *filename = NULL, *truncated = NULL, *coredump = NULL;
const void *d; const void *d;
size_t l; size_t l;
usec_t t; usec_t ts;
char buf[FORMAT_TIMESTAMP_MAX]; int r, signal_as_int = 0;
int r; const char *present = NULL, *color = NULL;
const char *present; uint64_t size = UINT64_MAX;
bool normal_coredump; bool normal_coredump;
uid_t uid_as_int = UID_INVALID;
gid_t gid_as_int = GID_INVALID;
pid_t pid_as_int = 0;
assert(file); assert(file);
assert(j); assert(j);
assert(t);
SD_JOURNAL_FOREACH_DATA(j, d, l) { SD_JOURNAL_FOREACH_DATA(j, d, l) {
RETRIEVE(d, l, "MESSAGE_ID", mid); RETRIEVE(d, l, "MESSAGE_ID", mid);
@ -406,54 +492,46 @@ static int print_list(FILE* file, sd_journal *j, int had_legend) {
RETRIEVE(d, l, "COREDUMP", coredump); RETRIEVE(d, l, "COREDUMP", coredump);
} }
if (!pid && !uid && !gid && !sgnl && !exe && !comm && !cmdline && !filename) { if (!pid && !uid && !gid && !sgnl && !exe && !comm && !cmdline && !filename)
log_warning("Empty coredump log entry"); return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), "Empty coredump log entry");
return -EINVAL;
}
r = sd_journal_get_realtime_usec(j, &t); (void) parse_uid(uid, &uid_as_int);
(void) parse_gid(gid, &gid_as_int);
(void) parse_pid(pid, &pid_as_int);
signal_as_int = signal_from_string(sgnl);
r = sd_journal_get_realtime_usec(j, &ts);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to get realtime timestamp: %m"); return log_error_errno(r, "Failed to get realtime timestamp: %m");
format_timestamp(buf, sizeof(buf), t);
if (!had_legend && !arg_no_legend)
fprintf(file, "%-*s %*s %*s %*s %*s %-*s %s\n",
FORMAT_TIMESTAMP_WIDTH, "TIME",
6, "PID",
5, "UID",
5, "GID",
3, "SIG",
9, "COREFILE",
"EXE");
normal_coredump = streq_ptr(mid, SD_MESSAGE_COREDUMP_STR); normal_coredump = streq_ptr(mid, SD_MESSAGE_COREDUMP_STR);
if (filename) if (filename)
if (access(filename, R_OK) == 0) analyze_coredump_file(filename, &present, &color, &size);
present = "present";
else if (errno == ENOENT)
present = "missing";
else
present = "error";
else if (coredump) else if (coredump)
present = "journal"; present = "journal";
else if (normal_coredump) else if (normal_coredump) {
present = "none"; present = "none";
else color = ansi_grey();
present = "-"; } else
present = NULL;
if (STR_IN_SET(present, "present", "journal") && truncated && parse_boolean(truncated) > 0) if (STRPTR_IN_SET(present, "present", "journal") && truncated && parse_boolean(truncated) > 0)
present = "truncated"; present = "truncated";
fprintf(file, "%-*s %*s %*s %*s %*s %-*s %s\n", r = table_add_many(
FORMAT_TIMESTAMP_WIDTH, buf, t,
6, strna(pid), TABLE_TIMESTAMP, ts,
5, strna(uid), TABLE_PID, pid_as_int,
5, strna(gid), TABLE_UID, uid_as_int,
3, normal_coredump ? strna(sgnl) : "-", TABLE_GID, gid_as_int,
9, present, TABLE_SIGNAL, normal_coredump ? signal_as_int : 0,
strna(exe ?: (comm ?: cmdline))); TABLE_STRING, present,
TABLE_SET_COLOR, color,
TABLE_STRING, exe ?: comm ?: cmdline,
TABLE_SIZE, size);
if (r < 0)
return table_log_add_error(r);
return 0; return 0;
} }
@ -612,24 +690,27 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
fprintf(file, " Hostname: %s\n", hostname); fprintf(file, " Hostname: %s\n", hostname);
if (filename) { if (filename) {
bool inacc, trunc; const char *state = NULL, *color = NULL;
uint64_t size = UINT64_MAX;
char buf[FORMAT_BYTES_MAX];
inacc = access(filename, R_OK) < 0; analyze_coredump_file(filename, &state, &color, &size);
trunc = truncated && parse_boolean(truncated) > 0;
if (inacc || trunc) if (STRPTR_IN_SET(state, "present", "journal") && truncated && parse_boolean(truncated) > 0)
fprintf(file, " Storage: %s%s (%s%s%s)%s\n", state = "truncated";
ansi_highlight_red(),
fprintf(file,
" Storage: %s%s (%s)%s\n",
strempty(color),
filename, filename,
inacc ? "inaccessible" : "", state,
inacc && trunc ? ", " : "",
trunc ? "truncated" : "",
ansi_normal()); ansi_normal());
else
fprintf(file, " Storage: %s\n", filename);
}
else if (coredump) if (size != UINT64_MAX)
fprintf(file,
" Disk Size: %s\n",
format_bytes(buf, sizeof(buf), size));
} else if (coredump)
fprintf(file, " Storage: journal\n"); fprintf(file, " Storage: journal\n");
else else
fprintf(file, " Storage: none\n"); fprintf(file, " Storage: none\n");
@ -659,43 +740,61 @@ static int focus(sd_journal *j) {
return r; return r;
} }
static int print_entry(sd_journal *j, unsigned n_found, bool verb_is_info) { static int print_entry(
sd_journal *j,
size_t n_found,
Table *t) {
assert(j); assert(j);
if (verb_is_info) if (t)
return print_info(stdout, j, n_found); return print_list(stdout, j, t);
else if (arg_field) else if (arg_field)
return print_field(stdout, j); return print_field(stdout, j);
else else
return print_list(stdout, j, n_found); return print_info(stdout, j, n_found > 0);
} }
static int dump_list(int argc, char **argv, void *userdata) { static int dump_list(int argc, char **argv, void *userdata) {
_cleanup_(sd_journal_closep) sd_journal *j = NULL; _cleanup_(sd_journal_closep) sd_journal *j = NULL;
unsigned n_found = 0; _cleanup_(table_unrefp) Table *t = NULL;
size_t n_found = 0;
bool verb_is_info; bool verb_is_info;
int r; int r;
verb_is_info = (argc >= 1 && streq(argv[0], "info")); verb_is_info = argc >= 1 && streq(argv[0], "info");
r = acquire_journal(&j, argv + 1); r = acquire_journal(&j, argv + 1);
if (r < 0) if (r < 0)
return r; return r;
/* The coredumps are likely compressed, and for just listing them we don't need to decompress them,
* so let's pick a fairly low data threshold here */
(void) sd_journal_set_data_threshold(j, 4096);
if (!verb_is_info && !arg_field) {
t = table_new("time", "pid", "uid", "gid", "sig", "corefile", "exe", "size");
if (!t)
return log_oom();
(void) table_set_align_percent(t, TABLE_HEADER_CELL(1), 100);
(void) table_set_align_percent(t, TABLE_HEADER_CELL(2), 100);
(void) table_set_align_percent(t, TABLE_HEADER_CELL(3), 100);
(void) table_set_align_percent(t, TABLE_HEADER_CELL(7), 100);
(void) table_set_empty_string(t, "-");
} else
(void) pager_open(arg_pager_flags); (void) pager_open(arg_pager_flags);
/* The coredumps are likely to compressed, and for just
* listing them we don't need to decompress them, so let's
* pick a fairly low data threshold here */
sd_journal_set_data_threshold(j, 4096);
/* "info" without pattern implies "-1" */ /* "info" without pattern implies "-1" */
if (arg_one || (verb_is_info && argc == 1)) { if ((arg_rows_max == 1 && arg_reverse) || (verb_is_info && argc == 1)) {
r = focus(j); r = focus(j);
if (r < 0) if (r < 0)
return r; return r;
return print_entry(j, 0, verb_is_info); r = print_entry(j, 0, t);
if (r < 0)
return r;
} else { } else {
if (arg_since != USEC_INFINITY && !arg_reverse) if (arg_since != USEC_INFINITY && !arg_reverse)
r = sd_journal_seek_realtime_usec(j, arg_since); r = sd_journal_seek_realtime_usec(j, arg_since);
@ -713,10 +812,8 @@ static int dump_list(int argc, char **argv, void *userdata) {
r = sd_journal_next(j); r = sd_journal_next(j);
else else
r = sd_journal_previous(j); r = sd_journal_previous(j);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to iterate through journal: %m"); return log_error_errno(r, "Failed to iterate through journal: %m");
if (r == 0) if (r == 0)
break; break;
@ -740,9 +837,12 @@ static int dump_list(int argc, char **argv, void *userdata) {
continue; continue;
} }
r = print_entry(j, n_found++, verb_is_info); r = print_entry(j, n_found++, t);
if (r < 0) if (r < 0)
return r; return r;
if (arg_rows_max != SIZE_MAX && n_found >= arg_rows_max)
break;
} }
if (!arg_field && n_found <= 0) { if (!arg_field && n_found <= 0) {
@ -752,6 +852,12 @@ static int dump_list(int argc, char **argv, void *userdata) {
} }
} }
if (t) {
r = table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
if (r < 0)
return r;
}
return 0; return 0;
} }

View File

@ -1,6 +1,8 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once #pragma once
#include <errno.h>
typedef enum EnrollType { typedef enum EnrollType {
ENROLL_PASSWORD, ENROLL_PASSWORD,
ENROLL_RECOVERY, ENROLL_RECOVERY,
@ -8,7 +10,7 @@ typedef enum EnrollType {
ENROLL_FIDO2, ENROLL_FIDO2,
ENROLL_TPM2, ENROLL_TPM2,
_ENROLL_TYPE_MAX, _ENROLL_TYPE_MAX,
_ENROLL_TYPE_INVALID = -1, _ENROLL_TYPE_INVALID = -EINVAL,
} EnrollType; } EnrollType;
typedef enum WipeScope { typedef enum WipeScope {
@ -16,7 +18,7 @@ typedef enum WipeScope {
WIPE_ALL, /* wipe all slots */ WIPE_ALL, /* wipe all slots */
WIPE_EMPTY_PASSPHRASE, /* wipe slots with empty passphrases plus listed slots */ WIPE_EMPTY_PASSPHRASE, /* wipe slots with empty passphrases plus listed slots */
_WIPE_SCOPE_MAX, _WIPE_SCOPE_MAX,
_WIPE_SCOPE_INVALID = -1, _WIPE_SCOPE_INVALID = -EINVAL,
} WipeScope; } WipeScope;
const char* enroll_type_to_string(EnrollType t); const char* enroll_type_to_string(EnrollType t);

View File

@ -82,17 +82,16 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_VERSION: case ARG_VERSION:
return version(); return version();
case ARG_SUFFIX: case ARG_SUFFIX: {
UnitType t = unit_type_from_string(optarg);
if (unit_type_from_string(optarg) < 0) if (t < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(t, "Invalid unit suffix type \"%s\".", optarg);
"Invalid unit suffix type %s.", optarg);
arg_suffix = optarg; arg_suffix = optarg;
break; break;
}
case ARG_TEMPLATE: case ARG_TEMPLATE:
if (!unit_name_is_valid(optarg, UNIT_NAME_TEMPLATE)) if (!unit_name_is_valid(optarg, UNIT_NAME_TEMPLATE))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Template name %s is not valid.", optarg); "Template name %s is not valid.", optarg);

View File

@ -888,7 +888,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
if (value) { if (value) {
m = volatile_mode_from_string(value); m = volatile_mode_from_string(value);
if (m < 0) if (m < 0)
log_warning("Failed to parse systemd.volatile= argument: %s", value); log_warning_errno(m, "Failed to parse systemd.volatile= argument: %s", value);
else else
arg_volatile_mode = m; arg_volatile_mode = m;
} else } else

View File

@ -2393,7 +2393,7 @@ static int parse_argv(int argc, char *argv[]) {
l = rlimit_from_string_harder(field); l = rlimit_from_string_harder(field);
if (l < 0) if (l < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown resource limit type: %s", field); return log_error_errno(l, "Unknown resource limit type: %s", field);
if (isempty(eq + 1)) { if (isempty(eq + 1)) {
/* Remove only the specific rlimit */ /* Remove only the specific rlimit */

View File

@ -37,7 +37,7 @@ typedef enum HomeState {
HOME_AUTHENTICATING_WHILE_ACTIVE, HOME_AUTHENTICATING_WHILE_ACTIVE,
HOME_AUTHENTICATING_FOR_ACQUIRE, /* authenticating because Acquire() was called */ HOME_AUTHENTICATING_FOR_ACQUIRE, /* authenticating because Acquire() was called */
_HOME_STATE_MAX, _HOME_STATE_MAX,
_HOME_STATE_INVALID = -1 _HOME_STATE_INVALID = -EINVAL,
} HomeState; } HomeState;
static inline bool HOME_STATE_IS_ACTIVE(HomeState state) { static inline bool HOME_STATE_IS_ACTIVE(HomeState state) {

View File

@ -14,7 +14,7 @@ typedef enum OperationType {
OPERATION_DEACTIVATE_FORCE, /* enqueued on hard $HOME unplug */ OPERATION_DEACTIVATE_FORCE, /* enqueued on hard $HOME unplug */
OPERATION_IMMEDIATE, /* this is never enqueued, it's just a marker we immediately started executing an operation without enqueuing anything first. */ OPERATION_IMMEDIATE, /* this is never enqueued, it's just a marker we immediately started executing an operation without enqueuing anything first. */
_OPERATION_MAX, _OPERATION_MAX,
_OPERATION_INVALID = -1, _OPERATION_INVALID = -EINVAL,
} OperationType; } OperationType;
/* Encapsulates an operation on one or more home directories. This has two uses: /* Encapsulates an operation on one or more home directories. This has two uses:

View File

@ -14,7 +14,7 @@ typedef enum UserReconcileMode {
USER_RECONCILE_REQUIRE_NEWER, /* host version must be newer than embedded version */ USER_RECONCILE_REQUIRE_NEWER, /* host version must be newer than embedded version */
USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, /* similar, but may also be equal */ USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, /* similar, but may also be equal */
_USER_RECONCILE_MODE_MAX, _USER_RECONCILE_MODE_MAX,
_USER_RECONCILE_MODE_INVALID = -1, _USER_RECONCILE_MODE_INVALID = -EINVAL,
} UserReconcileMode; } UserReconcileMode;
enum { /* return values */ enum { /* return values */

View File

@ -59,7 +59,7 @@ enum {
PROP_OS_CPE_NAME, PROP_OS_CPE_NAME,
PROP_OS_HOME_URL, PROP_OS_HOME_URL,
_PROP_MAX, _PROP_MAX,
_PROP_INVALID = -1, _PROP_INVALID = -EINVAL,
}; };
typedef struct Context { typedef struct Context {

View File

@ -17,7 +17,7 @@ typedef enum ImportCompressType {
IMPORT_COMPRESS_GZIP, IMPORT_COMPRESS_GZIP,
IMPORT_COMPRESS_BZIP2, IMPORT_COMPRESS_BZIP2,
_IMPORT_COMPRESS_TYPE_MAX, _IMPORT_COMPRESS_TYPE_MAX,
_IMPORT_COMPRESS_TYPE_INVALID = -1, _IMPORT_COMPRESS_TYPE_INVALID = -EINVAL,
} ImportCompressType; } ImportCompressType;
typedef struct ImportCompress { typedef struct ImportCompress {

View File

@ -46,7 +46,7 @@ typedef enum TransferType {
TRANSFER_PULL_TAR, TRANSFER_PULL_TAR,
TRANSFER_PULL_RAW, TRANSFER_PULL_RAW,
_TRANSFER_TYPE_MAX, _TRANSFER_TYPE_MAX,
_TRANSFER_TYPE_INVALID = -1, _TRANSFER_TYPE_INVALID = -EINVAL,
} TransferType; } TransferType;
struct Transfer { struct Transfer {

View File

@ -33,7 +33,7 @@ typedef enum VerificationStyle {
VERIFICATION_PER_FILE, /* SuSE-style ".sha256" files with inline gpg signature */ VERIFICATION_PER_FILE, /* SuSE-style ".sha256" files with inline gpg signature */
VERIFICATION_PER_DIRECTORY, /* Ubuntu-style SHA256SUM files with detached SHA256SUM.gpg signatures */ VERIFICATION_PER_DIRECTORY, /* Ubuntu-style SHA256SUM files with detached SHA256SUM.gpg signatures */
_VERIFICATION_STYLE_MAX, _VERIFICATION_STYLE_MAX,
_VERIFICATION_STYLE_INVALID = -1, _VERIFICATION_STYLE_INVALID = -EINVAL,
} VerificationStyle; } VerificationStyle;
int verification_style_from_url(const char *url, VerificationStyle *style); int verification_style_from_url(const char *url, VerificationStyle *style);

View File

@ -22,7 +22,7 @@ typedef enum PullJobState {
PULL_JOB_DONE, PULL_JOB_DONE,
PULL_JOB_FAILED, PULL_JOB_FAILED,
_PULL_JOB_STATE_MAX, _PULL_JOB_STATE_MAX,
_PULL_JOB_STATE_INVALID = -1, _PULL_JOB_STATE_INVALID = -EINVAL,
} PullJobState; } PullJobState;
#define PULL_JOB_IS_COMPLETE(j) (IN_SET((j)->state, PULL_JOB_DONE, PULL_JOB_FAILED)) #define PULL_JOB_IS_COMPLETE(j) (IN_SET((j)->state, PULL_JOB_DONE, PULL_JOB_FAILED))

View File

@ -961,16 +961,14 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_SPLIT_MODE: case ARG_SPLIT_MODE:
arg_split_mode = journal_write_split_mode_from_string(optarg); arg_split_mode = journal_write_split_mode_from_string(optarg);
if (arg_split_mode == _JOURNAL_WRITE_SPLIT_INVALID) if (arg_split_mode == _JOURNAL_WRITE_SPLIT_INVALID)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(arg_split_mode, "Invalid split mode: %s", optarg);
"Invalid split mode: %s", optarg);
break; break;
case ARG_COMPRESS: case ARG_COMPRESS:
if (optarg) { if (optarg) {
r = parse_boolean(optarg); r = parse_boolean(optarg);
if (r < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(r, "Failed to parse --compress= parameter.");
"Failed to parse --compress= parameter.");
arg_compress = !!r; arg_compress = !!r;
} else } else

View File

@ -36,5 +36,5 @@ typedef enum JournalWriteSplitMode {
JOURNAL_WRITE_SPLIT_NONE, JOURNAL_WRITE_SPLIT_NONE,
JOURNAL_WRITE_SPLIT_HOST, JOURNAL_WRITE_SPLIT_HOST,
_JOURNAL_WRITE_SPLIT_MAX, _JOURNAL_WRITE_SPLIT_MAX,
_JOURNAL_WRITE_SPLIT_INVALID = -1 _JOURNAL_WRITE_SPLIT_INVALID = -EINVAL,
} JournalWriteSplitMode; } JournalWriteSplitMode;

View File

@ -413,7 +413,7 @@ static int setup_uploader(Uploader *u, const char *url, const char *state_file)
assert(url); assert(url);
*u = (Uploader) { *u = (Uploader) {
.input = -1 .input = -1,
}; };
host = STARTSWITH_SET(url, "http://", "https://"); host = STARTSWITH_SET(url, "http://", "https://");

View File

@ -565,7 +565,7 @@ static int parse_argv(int argc, char *argv[]) {
arg_output = output_mode_from_string(optarg); arg_output = output_mode_from_string(optarg);
if (arg_output < 0) if (arg_output < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown output format '%s'.", optarg); return log_error_errno(arg_output, "Unknown output format '%s'.", optarg);
if (IN_SET(arg_output, OUTPUT_EXPORT, OUTPUT_JSON, OUTPUT_JSON_PRETTY, OUTPUT_JSON_SSE, OUTPUT_JSON_SEQ, OUTPUT_CAT)) if (IN_SET(arg_output, OUTPUT_EXPORT, OUTPUT_JSON, OUTPUT_JSON_PRETTY, OUTPUT_JSON_SSE, OUTPUT_JSON_SEQ, OUTPUT_CAT))
arg_quiet = true; arg_quiet = true;
@ -835,7 +835,7 @@ static int parse_argv(int argc, char *argv[]) {
to = log_level_from_string(dots + 2); to = log_level_from_string(dots + 2);
if (from < 0 || to < 0) if (from < 0 || to < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(from < 0 ? from : to,
"Failed to parse log level range %s", optarg); "Failed to parse log level range %s", optarg);
arg_priorities = 0; arg_priorities = 0;
@ -853,8 +853,7 @@ static int parse_argv(int argc, char *argv[]) {
p = log_level_from_string(optarg); p = log_level_from_string(optarg);
if (p < 0) if (p < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(p, "Unknown log level %s", optarg);
"Unknown log level %s", optarg);
arg_priorities = 0; arg_priorities = 0;
@ -885,8 +884,7 @@ static int parse_argv(int argc, char *argv[]) {
num = log_facility_unshifted_from_string(fac); num = log_facility_unshifted_from_string(fac);
if (num < 0) if (num < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(num, "Bad --facility= argument \"%s\".", fac);
"Bad --facility= argument \"%s\".", fac);
if (set_ensure_put(&arg_facilities, NULL, INT_TO_PTR(num)) < 0) if (set_ensure_put(&arg_facilities, NULL, INT_TO_PTR(num)) < 0)
return log_oom(); return log_oom();

View File

@ -368,7 +368,7 @@ static int client_context_read_log_level_max(
ll = log_level_from_string(value); ll = log_level_from_string(value);
if (ll < 0) if (ll < 0)
return -EINVAL; return ll;
c->log_level_max = ll; c->log_level_max = ll;
return 0; return 0;

View File

@ -25,7 +25,7 @@ typedef enum Storage {
STORAGE_PERSISTENT, STORAGE_PERSISTENT,
STORAGE_NONE, STORAGE_NONE,
_STORAGE_MAX, _STORAGE_MAX,
_STORAGE_INVALID = -1 _STORAGE_INVALID = -EINVAL,
} Storage; } Storage;
typedef enum SplitMode { typedef enum SplitMode {
@ -33,7 +33,7 @@ typedef enum SplitMode {
SPLIT_LOGIN, /* deprecated */ SPLIT_LOGIN, /* deprecated */
SPLIT_NONE, SPLIT_NONE,
_SPLIT_MAX, _SPLIT_MAX,
_SPLIT_INVALID = -1 _SPLIT_INVALID = -EINVAL,
} SplitMode; } SplitMode;
typedef struct JournalCompressOptions { typedef struct JournalCompressOptions {

View File

@ -60,7 +60,7 @@ typedef enum LineBreak {
LINE_BREAK_EOF, LINE_BREAK_EOF,
LINE_BREAK_PID_CHANGE, LINE_BREAK_PID_CHANGE,
_LINE_BREAK_MAX, _LINE_BREAK_MAX,
_LINE_BREAK_INVALID = -1, _LINE_BREAK_INVALID = -EINVAL,
} LineBreak; } LineBreak;
struct StdoutStream { struct StdoutStream {

View File

@ -46,7 +46,7 @@ typedef enum IPv4ACDState {
IPV4ACD_STATE_ANNOUNCING, IPV4ACD_STATE_ANNOUNCING,
IPV4ACD_STATE_RUNNING, IPV4ACD_STATE_RUNNING,
_IPV4ACD_STATE_MAX, _IPV4ACD_STATE_MAX,
_IPV4ACD_STATE_INVALID = -1 _IPV4ACD_STATE_INVALID = -EINVAL,
} IPv4ACDState; } IPv4ACDState;
struct sd_ipv4acd { struct sd_ipv4acd {

View File

@ -122,22 +122,22 @@ typedef enum BusSlotType {
BUS_NODE_ENUMERATOR, BUS_NODE_ENUMERATOR,
BUS_NODE_VTABLE, BUS_NODE_VTABLE,
BUS_NODE_OBJECT_MANAGER, BUS_NODE_OBJECT_MANAGER,
_BUS_SLOT_INVALID = -1, _BUS_SLOT_INVALID = -EINVAL,
} BusSlotType; } BusSlotType;
struct sd_bus_slot { struct sd_bus_slot {
unsigned n_ref; unsigned n_ref;
BusSlotType type:5; BusSlotType type:8;
/* Slots can be "floating" or not. If they are not floating (the usual case) then they reference the bus object /* Slots can be "floating" or not. If they are not floating (the usual case) then they reference the
* they are associated with. This means the bus object stays allocated at least as long as there is a slot * bus object they are associated with. This means the bus object stays allocated at least as long as
* around associated with it. If it is floating, then the slot's lifecycle is bound to the lifecycle of the * there is a slot around associated with it. If it is floating, then the slot's lifecycle is bound
* bus: it will be disconnected from the bus when the bus is destroyed, and it keeping the slot reffed hence * to the lifecycle of the bus: it will be disconnected from the bus when the bus is destroyed, and
* won't mean the bus stays reffed too. Internally this means the reference direction is reversed: floating * it keeping the slot reffed hence won't mean the bus stays reffed too. Internally this means the
* slots objects are referenced by the bus object, and not vice versa. */ * reference direction is reversed: floating slots objects are referenced by the bus object, and not
bool floating:1; * vice versa. */
bool floating;
bool match_added:1; bool match_added;
sd_bus *bus; sd_bus *bus;
void *userdata; void *userdata;

View File

@ -27,7 +27,7 @@ enum bus_match_node_type {
BUS_MATCH_ARG_HAS, BUS_MATCH_ARG_HAS,
BUS_MATCH_ARG_HAS_LAST = BUS_MATCH_ARG_HAS + 63, BUS_MATCH_ARG_HAS_LAST = BUS_MATCH_ARG_HAS + 63,
_BUS_MATCH_NODE_TYPE_MAX, _BUS_MATCH_NODE_TYPE_MAX,
_BUS_MATCH_NODE_TYPE_INVALID = -1 _BUS_MATCH_NODE_TYPE_INVALID = -EINVAL,
}; };
struct bus_match_node { struct bus_match_node {

View File

@ -15,7 +15,7 @@ static void test_error(void) {
const sd_bus_error temporarily_const_error = { const sd_bus_error temporarily_const_error = {
.name = SD_BUS_ERROR_ACCESS_DENIED, .name = SD_BUS_ERROR_ACCESS_DENIED,
.message = "oh! no", .message = "oh! no",
._need_free = -1 ._need_free = -1,
}; };
assert_se(!sd_bus_error_is_set(&error)); assert_se(!sd_bus_error_is_set(&error));

View File

@ -21,7 +21,7 @@ typedef enum DeviceEnumerationType {
DEVICE_ENUMERATION_TYPE_DEVICES, DEVICE_ENUMERATION_TYPE_DEVICES,
DEVICE_ENUMERATION_TYPE_SUBSYSTEMS, DEVICE_ENUMERATION_TYPE_SUBSYSTEMS,
_DEVICE_ENUMERATION_TYPE_MAX, _DEVICE_ENUMERATION_TYPE_MAX,
_DEVICE_ENUMERATION_TYPE_INVALID = -1, _DEVICE_ENUMERATION_TYPE_INVALID = -EINVAL,
} DeviceEnumerationType; } DeviceEnumerationType;
struct sd_device_enumerator { struct sd_device_enumerator {

View File

@ -1,6 +1,8 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once #pragma once
#include <errno.h>
#include "sd-device.h" #include "sd-device.h"
typedef enum MonitorNetlinkGroup { typedef enum MonitorNetlinkGroup {
@ -8,7 +10,7 @@ typedef enum MonitorNetlinkGroup {
MONITOR_GROUP_KERNEL, MONITOR_GROUP_KERNEL,
MONITOR_GROUP_UDEV, MONITOR_GROUP_UDEV,
_MONITOR_NETLINK_GROUP_MAX, _MONITOR_NETLINK_GROUP_MAX,
_MONITOR_NETLINK_GROUP_INVALID = -1, _MONITOR_NETLINK_GROUP_INVALID = -EINVAL,
} MonitorNetlinkGroup; } MonitorNetlinkGroup;
int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group, int fd); int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group, int fd);

View File

@ -204,7 +204,7 @@ static int device_set_action(sd_device *device, const char *action) {
a = device_action_from_string(action); a = device_action_from_string(action);
if (a < 0) if (a < 0)
return -EINVAL; return a;
r = device_add_property_internal(device, "ACTION", action); r = device_add_property_internal(device, "ACTION", action);
if (r < 0) if (r < 0)

View File

@ -20,7 +20,7 @@ typedef enum DeviceAction {
DEVICE_ACTION_BIND, DEVICE_ACTION_BIND,
DEVICE_ACTION_UNBIND, DEVICE_ACTION_UNBIND,
_DEVICE_ACTION_MAX, _DEVICE_ACTION_MAX,
_DEVICE_ACTION_INVALID = -1, _DEVICE_ACTION_INVALID = -EINVAL,
} DeviceAction; } DeviceAction;
int device_new_from_nulstr(sd_device **ret, uint8_t *nulstr, size_t len); int device_new_from_nulstr(sd_device **ret, uint8_t *nulstr, size_t len);

View File

@ -28,7 +28,7 @@ typedef enum EventSourceType {
SOURCE_WATCHDOG, SOURCE_WATCHDOG,
SOURCE_INOTIFY, SOURCE_INOTIFY,
_SOURCE_EVENT_SOURCE_TYPE_MAX, _SOURCE_EVENT_SOURCE_TYPE_MAX,
_SOURCE_EVENT_SOURCE_TYPE_INVALID = -1 _SOURCE_EVENT_SOURCE_TYPE_INVALID = -EINVAL,
} EventSourceType; } EventSourceType;
/* All objects we use in epoll events start with this value, so that /* All objects we use in epoll events start with this value, so that
@ -40,7 +40,7 @@ typedef enum WakeupType {
WAKEUP_SIGNAL_DATA, WAKEUP_SIGNAL_DATA,
WAKEUP_INOTIFY_DATA, WAKEUP_INOTIFY_DATA,
_WAKEUP_TYPE_MAX, _WAKEUP_TYPE_MAX,
_WAKEUP_TYPE_INVALID = -1, _WAKEUP_TYPE_INVALID = -EINVAL,
} WakeupType; } WakeupType;
struct inode_data; struct inode_data;
@ -56,7 +56,7 @@ struct sd_event_source {
char *description; char *description;
EventSourceType type:5; EventSourceType type;
signed int enabled:3; signed int enabled:3;
bool pending:1; bool pending:1;
bool dispatching:1; bool dispatching:1;

View File

@ -33,17 +33,17 @@ struct match_callback {
typedef enum NetlinkSlotType { typedef enum NetlinkSlotType {
NETLINK_REPLY_CALLBACK, NETLINK_REPLY_CALLBACK,
NETLINK_MATCH_CALLBACK, NETLINK_MATCH_CALLBACK,
_NETLINK_SLOT_INVALID = -1, _NETLINK_SLOT_INVALID = -EINVAL,
} NetlinkSlotType; } NetlinkSlotType;
struct sd_netlink_slot { struct sd_netlink_slot {
unsigned n_ref; unsigned n_ref;
NetlinkSlotType type:8;
bool floating;
sd_netlink *netlink; sd_netlink *netlink;
void *userdata; void *userdata;
sd_netlink_destroy_t destroy_callback; sd_netlink_destroy_t destroy_callback;
NetlinkSlotType type:2;
bool floating:1;
char *description; char *description;
LIST_FIELDS(sd_netlink_slot, slots); LIST_FIELDS(sd_netlink_slot, slots);

View File

@ -93,7 +93,7 @@ typedef enum NLUnionLinkInfoData {
NL_UNION_LINK_INFO_DATA_IFB, NL_UNION_LINK_INFO_DATA_IFB,
NL_UNION_LINK_INFO_DATA_BAREUDP, NL_UNION_LINK_INFO_DATA_BAREUDP,
_NL_UNION_LINK_INFO_DATA_MAX, _NL_UNION_LINK_INFO_DATA_MAX,
_NL_UNION_LINK_INFO_DATA_INVALID = -1 _NL_UNION_LINK_INFO_DATA_INVALID = -EINVAL,
} NLUnionLinkInfoData; } NLUnionLinkInfoData;
const char *nl_union_link_info_data_to_string(NLUnionLinkInfoData p) _const_; const char *nl_union_link_info_data_to_string(NLUnionLinkInfoData p) _const_;
@ -115,7 +115,7 @@ typedef enum NLUnionTCAOptionData {
NL_UNION_TCA_OPTION_DATA_SFB, NL_UNION_TCA_OPTION_DATA_SFB,
NL_UNION_TCA_OPTION_DATA_TBF, NL_UNION_TCA_OPTION_DATA_TBF,
_NL_UNION_TCA_OPTION_DATA_MAX, _NL_UNION_TCA_OPTION_DATA_MAX,
_NL_UNION_TCA_OPTION_DATA_INVALID = -1, _NL_UNION_TCA_OPTION_DATA_INVALID = -EINVAL,
} NLUnionTCAOptionData; } NLUnionTCAOptionData;
const char *nl_union_tca_option_data_to_string(NLUnionTCAOptionData p) _const_; const char *nl_union_tca_option_data_to_string(NLUnionTCAOptionData p) _const_;
@ -131,7 +131,7 @@ typedef enum NLUnionNFTExprData {
NL_UNION_NFT_EXPR_DATA_META, NL_UNION_NFT_EXPR_DATA_META,
NL_UNION_NFT_EXPR_DATA_NAT, NL_UNION_NFT_EXPR_DATA_NAT,
_NL_UNION_NFT_EXPR_DATA_MAX, _NL_UNION_NFT_EXPR_DATA_MAX,
_NL_UNION_NFT_EXPR_DATA_INVALID = -1, _NL_UNION_NFT_EXPR_DATA_INVALID = -EINVAL,
} NLUnionNFTExprData; } NLUnionNFTExprData;
const char *nl_union_nft_expr_data_to_string(NLUnionNFTExprData p) _const_; const char *nl_union_nft_expr_data_to_string(NLUnionNFTExprData p) _const_;

View File

@ -22,7 +22,7 @@ typedef enum LinkOperationalState {
LINK_OPERSTATE_ENSLAVED, LINK_OPERSTATE_ENSLAVED,
LINK_OPERSTATE_ROUTABLE, LINK_OPERSTATE_ROUTABLE,
_LINK_OPERSTATE_MAX, _LINK_OPERSTATE_MAX,
_LINK_OPERSTATE_INVALID = -1 _LINK_OPERSTATE_INVALID = -EINVAL,
} LinkOperationalState; } LinkOperationalState;
typedef enum LinkCarrierState { typedef enum LinkCarrierState {
@ -33,7 +33,7 @@ typedef enum LinkCarrierState {
LINK_CARRIER_STATE_CARRIER = LINK_OPERSTATE_CARRIER, LINK_CARRIER_STATE_CARRIER = LINK_OPERSTATE_CARRIER,
LINK_CARRIER_STATE_ENSLAVED = LINK_OPERSTATE_ENSLAVED, LINK_CARRIER_STATE_ENSLAVED = LINK_OPERSTATE_ENSLAVED,
_LINK_CARRIER_STATE_MAX, _LINK_CARRIER_STATE_MAX,
_LINK_CARRIER_STATE_INVALID = -1 _LINK_CARRIER_STATE_INVALID = -EINVAL,
} LinkCarrierState; } LinkCarrierState;
typedef enum LinkAddressState { typedef enum LinkAddressState {
@ -41,7 +41,7 @@ typedef enum LinkAddressState {
LINK_ADDRESS_STATE_DEGRADED, LINK_ADDRESS_STATE_DEGRADED,
LINK_ADDRESS_STATE_ROUTABLE, LINK_ADDRESS_STATE_ROUTABLE,
_LINK_ADDRESS_STATE_MAX, _LINK_ADDRESS_STATE_MAX,
_LINK_ADDRESS_STATE_INVALID = -1 _LINK_ADDRESS_STATE_INVALID = -EINVAL,
} LinkAddressState; } LinkAddressState;
const char* link_operstate_to_string(LinkOperationalState s) _const_; const char* link_operstate_to_string(LinkOperationalState s) _const_;

View File

@ -1371,8 +1371,7 @@ static int parse_argv(int argc, char *argv[]) {
arg_output = output_mode_from_string(optarg); arg_output = output_mode_from_string(optarg);
if (arg_output < 0) if (arg_output < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(arg_output, "Unknown output '%s'.", optarg);
"Unknown output '%s'.", optarg);
if (OUTPUT_MODE_IS_JSON(arg_output)) if (OUTPUT_MODE_IS_JSON(arg_output))
arg_legend = false; arg_legend = false;
@ -1403,8 +1402,7 @@ static int parse_argv(int argc, char *argv[]) {
arg_signal = signal_from_string(optarg); arg_signal = signal_from_string(optarg);
if (arg_signal < 0) if (arg_signal < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(arg_signal, "Failed to parse signal string %s.", optarg);
"Failed to parse signal string %s.", optarg);
break; break;
case 'H': case 'H':

View File

@ -15,7 +15,7 @@ typedef enum HandleAction {
HANDLE_SUSPEND_THEN_HIBERNATE, HANDLE_SUSPEND_THEN_HIBERNATE,
HANDLE_LOCK, HANDLE_LOCK,
_HANDLE_ACTION_MAX, _HANDLE_ACTION_MAX,
_HANDLE_ACTION_INVALID = -1 _HANDLE_ACTION_INVALID = -EINVAL,
} HandleAction; } HandleAction;
#include "logind-inhibit.h" #include "logind-inhibit.h"

View File

@ -13,14 +13,14 @@ typedef enum InhibitWhat {
INHIBIT_HANDLE_LID_SWITCH = 1 << 6, INHIBIT_HANDLE_LID_SWITCH = 1 << 6,
INHIBIT_HANDLE_REBOOT_KEY = 1 << 7, INHIBIT_HANDLE_REBOOT_KEY = 1 << 7,
_INHIBIT_WHAT_MAX = 1 << 8, _INHIBIT_WHAT_MAX = 1 << 8,
_INHIBIT_WHAT_INVALID = -1 _INHIBIT_WHAT_INVALID = -EINVAL,
} InhibitWhat; } InhibitWhat;
typedef enum InhibitMode { typedef enum InhibitMode {
INHIBIT_BLOCK, INHIBIT_BLOCK,
INHIBIT_DELAY, INHIBIT_DELAY,
_INHIBIT_MODE_MAX, _INHIBIT_MODE_MAX,
_INHIBIT_MODE_INVALID = -1 _INHIBIT_MODE_INVALID = -EINVAL,
} InhibitMode; } InhibitMode;
#include "logind.h" #include "logind.h"

View File

@ -15,7 +15,7 @@ typedef enum SessionState {
SESSION_ACTIVE, /* Logged in and in the fg */ SESSION_ACTIVE, /* Logged in and in the fg */
SESSION_CLOSING, /* Logged out, but scope is still there */ SESSION_CLOSING, /* Logged out, but scope is still there */
_SESSION_STATE_MAX, _SESSION_STATE_MAX,
_SESSION_STATE_INVALID = -1 _SESSION_STATE_INVALID = -EINVAL,
} SessionState; } SessionState;
typedef enum SessionClass { typedef enum SessionClass {
@ -24,7 +24,7 @@ typedef enum SessionClass {
SESSION_LOCK_SCREEN, SESSION_LOCK_SCREEN,
SESSION_BACKGROUND, SESSION_BACKGROUND,
_SESSION_CLASS_MAX, _SESSION_CLASS_MAX,
_SESSION_CLASS_INVALID = -1 _SESSION_CLASS_INVALID = -EINVAL,
} SessionClass; } SessionClass;
typedef enum SessionType { typedef enum SessionType {
@ -35,7 +35,7 @@ typedef enum SessionType {
SESSION_MIR, SESSION_MIR,
SESSION_WEB, SESSION_WEB,
_SESSION_TYPE_MAX, _SESSION_TYPE_MAX,
_SESSION_TYPE_INVALID = -1 _SESSION_TYPE_INVALID = -EINVAL,
} SessionType; } SessionType;
#define SESSION_TYPE_IS_GRAPHICAL(type) IN_SET(type, SESSION_X11, SESSION_WAYLAND, SESSION_MIR) #define SESSION_TYPE_IS_GRAPHICAL(type) IN_SET(type, SESSION_X11, SESSION_WAYLAND, SESSION_MIR)
@ -44,7 +44,7 @@ enum KillWho {
KILL_LEADER, KILL_LEADER,
KILL_ALL, KILL_ALL,
_KILL_WHO_MAX, _KILL_WHO_MAX,
_KILL_WHO_INVALID = -1 _KILL_WHO_INVALID = -EINVAL,
}; };
typedef enum TTYValidity { typedef enum TTYValidity {
@ -52,7 +52,7 @@ typedef enum TTYValidity {
TTY_FROM_UTMP, TTY_FROM_UTMP,
TTY_UTMP_INCONSISTENT, /* may happen on ssh sessions with multiplexed TTYs */ TTY_UTMP_INCONSISTENT, /* may happen on ssh sessions with multiplexed TTYs */
_TTY_VALIDITY_MAX, _TTY_VALIDITY_MAX,
_TTY_VALIDITY_INVALID = -1, _TTY_VALIDITY_INVALID = -EINVAL,
} TTYValidity; } TTYValidity;
struct Session { struct Session {

View File

@ -16,7 +16,7 @@ typedef enum UserState {
USER_ACTIVE, /* User logged in and has a session in the fg */ USER_ACTIVE, /* User logged in and has a session in the fg */
USER_CLOSING, /* User logged out, but processes still remain and lingering is not enabled */ USER_CLOSING, /* User logged out, but processes still remain and lingering is not enabled */
_USER_STATE_MAX, _USER_STATE_MAX,
_USER_STATE_INVALID = -1 _USER_STATE_INVALID = -EINVAL,
} UserState; } UserState;
struct User { struct User {

View File

@ -14,7 +14,7 @@ typedef enum MachineState {
MACHINE_RUNNING, /* Machine is running */ MACHINE_RUNNING, /* Machine is running */
MACHINE_CLOSING, /* Machine is terminating */ MACHINE_CLOSING, /* Machine is terminating */
_MACHINE_STATE_MAX, _MACHINE_STATE_MAX,
_MACHINE_STATE_INVALID = -1 _MACHINE_STATE_INVALID = -EINVAL,
} MachineState; } MachineState;
typedef enum MachineClass { typedef enum MachineClass {
@ -22,14 +22,14 @@ typedef enum MachineClass {
MACHINE_VM, MACHINE_VM,
MACHINE_HOST, MACHINE_HOST,
_MACHINE_CLASS_MAX, _MACHINE_CLASS_MAX,
_MACHINE_CLASS_INVALID = -1 _MACHINE_CLASS_INVALID = -EINVAL,
} MachineClass; } MachineClass;
enum KillWho { enum KillWho {
KILL_LEADER, KILL_LEADER,
KILL_ALL, KILL_ALL,
_KILL_WHO_MAX, _KILL_WHO_MAX,
_KILL_WHO_INVALID = -1 _KILL_WHO_INVALID = -EINVAL,
}; };
struct Machine { struct Machine {

View File

@ -2693,10 +2693,10 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} }
arg_output = output_mode_from_string(optarg); r = output_mode_from_string(optarg);
if (arg_output < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(r, "Unknown output '%s'.", optarg);
"Unknown output '%s'.", optarg); arg_output = r;
if (OUTPUT_MODE_IS_JSON(arg_output)) if (OUTPUT_MODE_IS_JSON(arg_output))
arg_legend = false; arg_legend = false;
@ -2720,10 +2720,10 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} }
arg_signal = signal_from_string(optarg); r = signal_from_string(optarg);
if (arg_signal < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(r, "Failed to parse signal string %s.", optarg);
"Failed to parse signal string %s.", optarg); arg_signal = r;
break; break;
case ARG_NO_ASK_PASSWORD: case ARG_NO_ASK_PASSWORD:
@ -2758,10 +2758,10 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} }
arg_verify = import_verify_from_string(optarg); r = import_verify_from_string(optarg);
if (arg_verify < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(r, "Failed to parse --verify= setting: %s", optarg);
"Failed to parse --verify= setting: %s", optarg); arg_verify = r;
break; break;
case ARG_FORCE: case ARG_FORCE:

View File

@ -313,7 +313,7 @@ static int network_set_dhcp_type(Context *context, const char *ifname, const cha
t = dracut_dhcp_type_from_string(dhcp_type); t = dracut_dhcp_type_from_string(dhcp_type);
if (t < 0) if (t < 0)
return -EINVAL; return t;
network = network_get(context, ifname); network = network_get(context, ifname);
if (!network) { if (!network) {

View File

@ -19,7 +19,7 @@ typedef enum DHCPType {
DHCP_TYPE_EITHER6, DHCP_TYPE_EITHER6,
DHCP_TYPE_IBFT, DHCP_TYPE_IBFT,
_DHCP_TYPE_MAX, _DHCP_TYPE_MAX,
_DHCP_TYPE_INVALID = -1, _DHCP_TYPE_INVALID = -EINVAL,
} DHCPType; } DHCPType;
typedef struct Address Address; typedef struct Address Address;

View File

@ -15,7 +15,7 @@ typedef enum BareUDPProtocol {
BARE_UDP_PROTOCOL_MPLS_UC = ETH_P_MPLS_UC, BARE_UDP_PROTOCOL_MPLS_UC = ETH_P_MPLS_UC,
BARE_UDP_PROTOCOL_MPLS_MC = ETH_P_MPLS_MC, BARE_UDP_PROTOCOL_MPLS_MC = ETH_P_MPLS_MC,
_BARE_UDP_PROTOCOL_MAX, _BARE_UDP_PROTOCOL_MAX,
_BARE_UDP_PROTOCOL_INVALID = -1 _BARE_UDP_PROTOCOL_INVALID = -EINVAL,
} BareUDPProtocol; } BareUDPProtocol;
struct BareUDP { struct BareUDP {

View File

@ -35,7 +35,7 @@ typedef enum MulticastRouter {
MULTICAST_ROUTER_PERMANENT = MDB_RTR_TYPE_PERM, MULTICAST_ROUTER_PERMANENT = MDB_RTR_TYPE_PERM,
MULTICAST_ROUTER_TEMPORARY = MDB_RTR_TYPE_TEMP, MULTICAST_ROUTER_TEMPORARY = MDB_RTR_TYPE_TEMP,
_MULTICAST_ROUTER_MAX, _MULTICAST_ROUTER_MAX,
_MULTICAST_ROUTER_INVALID = -1, _MULTICAST_ROUTER_INVALID = -EINVAL,
} MulticastRouter; } MulticastRouter;
DEFINE_NETDEV_CAST(BRIDGE, Bridge); DEFINE_NETDEV_CAST(BRIDGE, Bridge);

View File

@ -12,7 +12,7 @@ typedef enum FooOverUDPEncapType {
NETDEV_FOO_OVER_UDP_ENCAP_DIRECT = FOU_ENCAP_DIRECT, NETDEV_FOO_OVER_UDP_ENCAP_DIRECT = FOU_ENCAP_DIRECT,
NETDEV_FOO_OVER_UDP_ENCAP_GUE = FOU_ENCAP_GUE, NETDEV_FOO_OVER_UDP_ENCAP_GUE = FOU_ENCAP_GUE,
_NETDEV_FOO_OVER_UDP_ENCAP_MAX, _NETDEV_FOO_OVER_UDP_ENCAP_MAX,
_NETDEV_FOO_OVER_UDP_ENCAP_INVALID = -1, _NETDEV_FOO_OVER_UDP_ENCAP_INVALID = -EINVAL,
} FooOverUDPEncapType; } FooOverUDPEncapType;
typedef struct FouTunnel { typedef struct FouTunnel {

View File

@ -14,7 +14,7 @@ typedef enum GeneveDF {
NETDEV_GENEVE_DF_YES = GENEVE_DF_SET, NETDEV_GENEVE_DF_YES = GENEVE_DF_SET,
NETDEV_GENEVE_DF_INHERIT = GENEVE_DF_INHERIT, NETDEV_GENEVE_DF_INHERIT = GENEVE_DF_INHERIT,
_NETDEV_GENEVE_DF_MAX, _NETDEV_GENEVE_DF_MAX,
_NETDEV_GENEVE_DF_INVALID = -1 _NETDEV_GENEVE_DF_INVALID = -EINVAL,
} GeneveDF; } GeneveDF;
struct Geneve { struct Geneve {

View File

@ -12,14 +12,14 @@ typedef enum L2tpL2specType {
NETDEV_L2TP_L2SPECTYPE_NONE = L2TP_L2SPECTYPE_NONE, NETDEV_L2TP_L2SPECTYPE_NONE = L2TP_L2SPECTYPE_NONE,
NETDEV_L2TP_L2SPECTYPE_DEFAULT = L2TP_L2SPECTYPE_DEFAULT, NETDEV_L2TP_L2SPECTYPE_DEFAULT = L2TP_L2SPECTYPE_DEFAULT,
_NETDEV_L2TP_L2SPECTYPE_MAX, _NETDEV_L2TP_L2SPECTYPE_MAX,
_NETDEV_L2TP_L2SPECTYPE_INVALID = -1, _NETDEV_L2TP_L2SPECTYPE_INVALID = -EINVAL,
} L2tpL2specType; } L2tpL2specType;
typedef enum L2tpEncapType { typedef enum L2tpEncapType {
NETDEV_L2TP_ENCAPTYPE_UDP = L2TP_ENCAPTYPE_UDP, NETDEV_L2TP_ENCAPTYPE_UDP = L2TP_ENCAPTYPE_UDP,
NETDEV_L2TP_ENCAPTYPE_IP = L2TP_ENCAPTYPE_IP, NETDEV_L2TP_ENCAPTYPE_IP = L2TP_ENCAPTYPE_IP,
_NETDEV_L2TP_ENCAPTYPE_MAX, _NETDEV_L2TP_ENCAPTYPE_MAX,
_NETDEV_L2TP_ENCAPTYPE_INVALID = -1, _NETDEV_L2TP_ENCAPTYPE_INVALID = -EINVAL,
} L2tpEncapType; } L2tpEncapType;
typedef enum L2tpLocalAddressType { typedef enum L2tpLocalAddressType {
@ -27,7 +27,7 @@ typedef enum L2tpLocalAddressType {
NETDEV_L2TP_LOCAL_ADDRESS_STATIC, NETDEV_L2TP_LOCAL_ADDRESS_STATIC,
NETDEV_L2TP_LOCAL_ADDRESS_DYNAMIC, NETDEV_L2TP_LOCAL_ADDRESS_DYNAMIC,
_NETDEV_L2TP_LOCAL_ADDRESS_MAX, _NETDEV_L2TP_LOCAL_ADDRESS_MAX,
_NETDEV_L2TP_LOCAL_ADDRESS_INVALID = -1, _NETDEV_L2TP_LOCAL_ADDRESS_INVALID = -EINVAL,
} L2tpLocalAddressType; } L2tpLocalAddressType;
typedef struct L2tpTunnel L2tpTunnel; typedef struct L2tpTunnel L2tpTunnel;

View File

@ -85,7 +85,7 @@ typedef enum NetDevKind {
NETDEV_KIND_BAREUDP, NETDEV_KIND_BAREUDP,
_NETDEV_KIND_MAX, _NETDEV_KIND_MAX,
_NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */ _NETDEV_KIND_TUNNEL, /* Used by config_parse_stacked_netdev() */
_NETDEV_KIND_INVALID = -1 _NETDEV_KIND_INVALID = -EINVAL,
} NetDevKind; } NetDevKind;
typedef enum NetDevState { typedef enum NetDevState {
@ -95,7 +95,7 @@ typedef enum NetDevState {
NETDEV_STATE_READY, NETDEV_STATE_READY,
NETDEV_STATE_LINGER, NETDEV_STATE_LINGER,
_NETDEV_STATE_MAX, _NETDEV_STATE_MAX,
_NETDEV_STATE_INVALID = -1, _NETDEV_STATE_INVALID = -EINVAL,
} NetDevState; } NetDevState;
typedef enum NetDevCreateType { typedef enum NetDevCreateType {
@ -104,7 +104,7 @@ typedef enum NetDevCreateType {
NETDEV_CREATE_STACKED, NETDEV_CREATE_STACKED,
NETDEV_CREATE_AFTER_CONFIGURED, NETDEV_CREATE_AFTER_CONFIGURED,
_NETDEV_CREATE_MAX, _NETDEV_CREATE_MAX,
_NETDEV_CREATE_INVALID = -1, _NETDEV_CREATE_INVALID = -EINVAL,
} NetDevCreateType; } NetDevCreateType;
typedef struct Manager Manager; typedef struct Manager Manager;

View File

@ -12,13 +12,13 @@ typedef enum Ip6TnlMode {
NETDEV_IP6_TNL_MODE_IPIP6, NETDEV_IP6_TNL_MODE_IPIP6,
NETDEV_IP6_TNL_MODE_ANYIP6, NETDEV_IP6_TNL_MODE_ANYIP6,
_NETDEV_IP6_TNL_MODE_MAX, _NETDEV_IP6_TNL_MODE_MAX,
_NETDEV_IP6_TNL_MODE_INVALID = -1, _NETDEV_IP6_TNL_MODE_INVALID = -EINVAL,
} Ip6TnlMode; } Ip6TnlMode;
typedef enum IPv6FlowLabel { typedef enum IPv6FlowLabel {
NETDEV_IPV6_FLOWLABEL_INHERIT = 0xFFFFF + 1, NETDEV_IPV6_FLOWLABEL_INHERIT = 0xFFFFF + 1,
_NETDEV_IPV6_FLOWLABEL_MAX, _NETDEV_IPV6_FLOWLABEL_MAX,
_NETDEV_IPV6_FLOWLABEL_INVALID = -1, _NETDEV_IPV6_FLOWLABEL_INVALID = -EINVAL,
} IPv6FlowLabel; } IPv6FlowLabel;
typedef struct Tunnel { typedef struct Tunnel {

View File

@ -16,7 +16,7 @@ typedef enum VxLanDF {
NETDEV_VXLAN_DF_YES = VXLAN_DF_SET, NETDEV_VXLAN_DF_YES = VXLAN_DF_SET,
NETDEV_VXLAN_DF_INHERIT = VXLAN_DF_INHERIT, NETDEV_VXLAN_DF_INHERIT = VXLAN_DF_INHERIT,
_NETDEV_VXLAN_DF_MAX, _NETDEV_VXLAN_DF_MAX,
_NETDEV_VXLAN_DF_INVALID = -1 _NETDEV_VXLAN_DF_INVALID = -EINVAL,
} VxLanDF; } VxLanDF;
struct VxLan { struct VxLan {

View File

@ -1754,7 +1754,6 @@ int config_parse_duplicate_address_detection(
Network *network = userdata; Network *network = userdata;
_cleanup_(address_free_or_set_invalidp) Address *n = NULL; _cleanup_(address_free_or_set_invalidp) Address *n = NULL;
AddressFamily a;
int r; int r;
assert(filename); assert(filename);
@ -1783,14 +1782,14 @@ int config_parse_duplicate_address_detection(
return 0; return 0;
} }
a = duplicate_address_detection_address_family_from_string(rvalue); AddressFamily a = duplicate_address_detection_address_family_from_string(rvalue);
if (a < 0) { if (a < 0) {
log_syntax(unit, LOG_WARNING, filename, line, SYNTHETIC_ERRNO(EINVAL), log_syntax(unit, LOG_WARNING, filename, line, a,
"Failed to parse %s=, ignoring: %s", lvalue, rvalue); "Failed to parse %s=, ignoring: %s", lvalue, rvalue);
return 0; return 0;
} }
n->duplicate_address_detection = a; n->duplicate_address_detection = a;
TAKE_PTR(n); TAKE_PTR(n);
return 0; return 0;
} }

Some files were not shown because too many files have changed in this diff Show More