mirror of
https://github.com/systemd/systemd
synced 2025-10-09 05:34:45 +02:00
Compare commits
No commits in common. "a2123bf9d482f8d7f8679802fa9e5386d15cfde4" and "0ae2ac9759ebc3f94ce8d91884437363b9e8b504" have entirely different histories.
a2123bf9d4
...
0ae2ac9759
2
.github/workflows/cifuzz.yml
vendored
2
.github/workflows/cifuzz.yml
vendored
@ -68,7 +68,7 @@ jobs:
|
||||
path: ./out/artifacts
|
||||
- name: Upload Sarif
|
||||
if: always() && steps.build.outcome == 'success'
|
||||
uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b
|
||||
uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f
|
||||
with:
|
||||
# Path to SARIF file relative to the root of the repository
|
||||
sarif_file: cifuzz-sarif/results.sarif
|
||||
|
6
.github/workflows/codeql.yml
vendored
6
.github/workflows/codeql.yml
vendored
@ -45,7 +45,7 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b
|
||||
uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
config-file: ./.github/codeql-config.yml
|
||||
@ -53,7 +53,7 @@ jobs:
|
||||
- run: sudo -E .github/workflows/unit_tests.sh SETUP
|
||||
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@181d5eefc20863364f96762470ba6f862bdef56b
|
||||
uses: github/codeql-action/autobuild@ff0a06e83cb2de871e5a09832bc6a81e7276941f
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b
|
||||
uses: github/codeql-action/analyze@ff0a06e83cb2de871e5a09832bc6a81e7276941f
|
||||
|
6
NEWS
6
NEWS
@ -871,7 +871,7 @@ CHANGES WITH 258 in spe:
|
||||
* userdbctl gained a new switch --from-file=. If used the tool will not
|
||||
look up a user or group record from the system's user database but
|
||||
instead read it from the specified JSON file, and then present it in
|
||||
the usual, human-readable fashion.
|
||||
the usual, human readable fashion.
|
||||
|
||||
* systemd-homed gained D-Bus API calls for listing, adding, removing and
|
||||
showing use record signing keys.
|
||||
@ -8016,7 +8016,7 @@ CHANGES WITH 248:
|
||||
|
||||
* systemd-hostnamed now exports the "HardwareVendor" and
|
||||
"HardwareModel" D-Bus properties, which are supposed to contain a
|
||||
pair of cleaned up, human-readable strings describing the system's
|
||||
pair of cleaned up, human readable strings describing the system's
|
||||
vendor and model. It's typically sourced from the firmware's DMI
|
||||
tables, but may be augmented from a new hwdb database. hostnamectl
|
||||
shows this in the status output.
|
||||
@ -15502,7 +15502,7 @@ CHANGES WITH 220:
|
||||
journal-nocow.conf tmpfiles file.
|
||||
|
||||
* systemd-journald will now translate audit message types to
|
||||
human-readable identifiers when writing them to the
|
||||
human readable identifiers when writing them to the
|
||||
journal. This should improve readability of audit messages.
|
||||
|
||||
* The LUKS logic gained support for the offset= and skip=
|
||||
|
@ -51,7 +51,7 @@ The text format of the .catalog files is as follows:
|
||||
|
||||
* Simple, UTF-8 text files, with usual line breaks at 76 chars.
|
||||
URLs and suchlike where line-breaks are undesirable may use longer lines.
|
||||
As catalog files need to be usable on text consoles it is essential that the 76 char line break rule is otherwise followed for human-readable text.
|
||||
As catalog files need to be usable on text consoles it is essential that the 76 char line break rule is otherwise followed for human readable text.
|
||||
* Lines starting with `#` are ignored, and may be used for comments.
|
||||
|
||||
* The files consist of a series of entries.
|
||||
@ -63,7 +63,7 @@ The text format of the .catalog files is as follows:
|
||||
Some header fields may appear more than once per entry.
|
||||
The following header fields are currently known (but additional fields may be added later):
|
||||
|
||||
* Subject: A short, one-line human-readable description of the message
|
||||
* Subject: A short, one-line human readable description of the message
|
||||
* Defined-By: Who defined this message.
|
||||
|
||||
Usually a package name or suchlike
|
||||
@ -71,7 +71,7 @@ The text format of the .catalog files is as follows:
|
||||
This can be a web URL or a telephone number in the tel:// namespace
|
||||
* Documentation: URIs for further user, administrator or developer documentation on the log entry. URIs should be listed in order of relevance, the most relevant documentation first.
|
||||
* An empty line
|
||||
* The actual catalog entry payload, as human-readable prose.
|
||||
* The actual catalog entry payload, as human readable prose.
|
||||
Multiple paragraphs may be separated by empty lines.
|
||||
The prose should first describe the message and when it occurs, possibly followed by recommendations how to deal with the message and (if it is an error message) correct the problem at hand.
|
||||
This message text should be readable by users and administrators.
|
||||
|
@ -18,7 +18,7 @@ The stable interfaces are:
|
||||
* **The command line interface** of `systemd`, `systemctl`, `loginctl`, `journalctl`, and all other command line utilities installed in `$PATH` and documented in a man page.
|
||||
We will make sure that scripts invoking these commands will continue to work with future versions of systemd.
|
||||
Note however that the output generated by these commands is generally not included in the promise, unless it is documented in the man page.
|
||||
Example: the output of `systemctl status` is not stable, but that of `systemctl show` is, because the former is intended to be human-readable and the latter computer readable, and this is documented in the man page.
|
||||
Example: the output of `systemctl status` is not stable, but that of `systemctl show` is, because the former is intended to be human readable and the latter computer readable, and this is documented in the man page.
|
||||
|
||||
* **The protocol spoken on the socket referred to by `$NOTIFY_SOCKET`**, as documented in
|
||||
[sd_notify(3)](https://www.freedesktop.org/software/systemd/man/sd_notify.html). Note that, although using
|
||||
|
@ -52,7 +52,7 @@
|
||||
matching specified characteristics. If no command is
|
||||
specified, this is the implied default.</para>
|
||||
|
||||
<para>The output is designed to be human-readable and contains a table with the following
|
||||
<para>The output is designed to be human readable and contains a table with the following
|
||||
columns:</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
|
@ -138,7 +138,7 @@
|
||||
<literal>short</literal> or <literal>off</literal>. If <literal>pretty</literal> human-friendly
|
||||
whitespace and newlines are inserted in the output to make the JSON data more readable. If
|
||||
<literal>short</literal> all superfluous whitespace is suppressed. If <literal>off</literal> (the
|
||||
default) the user information is not shown in JSON format but in a friendly human-readable formatting
|
||||
default) the user information is not shown in JSON format but in a friendly human readable formatting
|
||||
instead. The <option>-j</option> option picks <literal>pretty</literal> when run interactively and
|
||||
<literal>short</literal> otherwise.</para>
|
||||
|
||||
|
@ -743,8 +743,8 @@ node /org/freedesktop/login1 {
|
||||
<literal>handle-suspend-key</literal>, <literal>handle-hibernate-key</literal>,
|
||||
<literal>handle-lid-switch</literal>, separated by colons, for inhibiting poweroff/reboot,
|
||||
suspend/hibernate, the automatic idle logic, or hardware key handling. <varname>who</varname> should be
|
||||
a short human-readable string identifying the application taking the lock. <varname>why</varname>
|
||||
should be a short human-readable string identifying the reason why the lock is taken. Finally,
|
||||
a short human readable string identifying the application taking the lock. <varname>why</varname>
|
||||
should be a short human readable string identifying the reason why the lock is taken. Finally,
|
||||
<varname>mode</varname> is either <literal>block</literal> or <literal>delay</literal> which encodes
|
||||
whether the inhibit shall be consider mandatory or whether it should just delay the operation to a
|
||||
certain maximum time, while the <literal>block-weak</literal> and variants will create an inhibitor
|
||||
|
@ -1370,7 +1370,7 @@ node /org/freedesktop/systemd1 {
|
||||
<itemizedlist>
|
||||
<listitem><para>The primary unit name as string</para></listitem>
|
||||
|
||||
<listitem><para>The human-readable description string</para></listitem>
|
||||
<listitem><para>The human readable description string</para></listitem>
|
||||
|
||||
<listitem><para>The load state (i.e. whether the unit file has been loaded
|
||||
successfully)</para></listitem>
|
||||
@ -2518,7 +2518,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
||||
the dependencies and their inverse dependencies (where this applies) as configured in the unit file or
|
||||
determined automatically.</para>
|
||||
|
||||
<para><varname>Description</varname> contains the human-readable description string for the
|
||||
<para><varname>Description</varname> contains the human readable description string for the
|
||||
unit.</para>
|
||||
|
||||
<para><varname>SourcePath</varname> contains the path to a configuration file this unit is
|
||||
@ -2638,7 +2638,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
||||
|
||||
<para><varname>LoadError</varname> contains a pair of strings. If the unit failed to load (as encoded
|
||||
in <varname>LoadState</varname>, see above), then this will include a D-Bus error pair consisting of
|
||||
the error ID and an explanatory human-readable string of what happened. If it loaded successfully, this
|
||||
the error ID and an explanatory human readable string of what happened. If it loaded successfully, this
|
||||
will be a pair of empty strings.</para>
|
||||
|
||||
<para><varname>Transient</varname> contains a boolean that indicates whether the unit was created as a
|
||||
|
@ -455,7 +455,7 @@
|
||||
produces the OS. This field is optional.</para>
|
||||
|
||||
<para>This name is intended to be exposed in "About this system" UIs or software update UIs when
|
||||
needed to distinguish the OS vendor from the OS itself. It is intended to be human-readable.</para>
|
||||
needed to distinguish the OS vendor from the OS itself. It is intended to be human readable.</para>
|
||||
|
||||
<para>Examples: <literal>VENDOR_NAME="Fedora Project"</literal> for Fedora Linux,
|
||||
<literal>VENDOR_NAME="Canonical"</literal> for Ubuntu.</para>
|
||||
|
@ -76,7 +76,7 @@
|
||||
example an error name such as
|
||||
<literal>org.freedesktop.DBus.Error.NotSupported</literal> or the equivalent
|
||||
symbolic <constant>SD_BUS_ERROR_NOT_SUPPORTED</constant>), and the
|
||||
<parameter>message</parameter> field is set as the human-readable error message
|
||||
<parameter>message</parameter> field is set as the human readable error message
|
||||
string if present. The error <parameter>e</parameter> must have the
|
||||
<parameter>name</parameter> field set, see
|
||||
<citerefentry><refentrytitle>sd_bus_error_is_set</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
|
||||
|
@ -161,7 +161,7 @@
|
||||
<varlistentry>
|
||||
<term><option>--status=</option></term>
|
||||
|
||||
<listitem><para>Send a free-form human-readable status string for the daemon to the service
|
||||
<listitem><para>Send a free-form human readable status string for the daemon to the service
|
||||
manager. This option takes the status string as argument. This is equivalent to
|
||||
<command>systemd-notify STATUS=…</command>. For details about the semantics of this option see
|
||||
<citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>. This
|
||||
|
@ -374,7 +374,7 @@
|
||||
similar format as <literal>.osrel</literal> (i.e. an environment-variable-assignment-block-like list of
|
||||
newline separated strings). Currently two fields are defined: <literal>ID=</literal> is supposed to carry
|
||||
a short identifying string that identifies the profile
|
||||
(e.g. <literal>ID=factory-reset</literal>). <literal>TITLE=</literal> should contain a human-readable
|
||||
(e.g. <literal>ID=factory-reset</literal>). <literal>TITLE=</literal> should contain a human readable
|
||||
string that may appear in the boot menu entry for this profile (e.g. <literal>TITLE='Factory Reset this
|
||||
Device'</literal>).</para>
|
||||
</refsect1>
|
||||
|
@ -597,21 +597,19 @@
|
||||
<variablelist class='unit-directives'>
|
||||
<varlistentry>
|
||||
<term><varname>Description=</varname></term>
|
||||
<listitem><para>A brief, meaningful, human-readable text identifying the unit. This may be used by
|
||||
<command>systemd</command> (and suitable UIs) as a user-visible label for the unit, so this string
|
||||
should identify the unit rather than just describe it, despite the name. This string also should not
|
||||
just repeat the unit name. <literal>Apache HTTP Server</literal> or <literal>Postfix Mail
|
||||
Server</literal> are good examples. Bad examples are <literal>high-performance lightweight HTTP
|
||||
server</literal> (too generic) or <literal>Apache</literal> (meaningless for people who do not know
|
||||
the Apache HTTP server project, duplicates the unit name). <command>systemd</command> may use this
|
||||
string as a noun in status messages (<literal>Starting
|
||||
<replaceable>Description</replaceable>...</literal>, <literal>Started
|
||||
<replaceable>Description</replaceable>.</literal>, <literal>Reached target
|
||||
<replaceable>Description</replaceable>.</literal>, <literal>Failed to start
|
||||
<replaceable>Description</replaceable>.</literal>), so it should be capitalized, and should not be a
|
||||
full sentence, or a phrase with a verb conjugated in the present continuous, or end in a full
|
||||
stop. Bad examples include <literal>exiting the container</literal>, <literal>updating the database
|
||||
once per day.</literal>, or <literal>OpenSSH server second instance daemon</literal>.</para>
|
||||
<listitem><para>A short human readable title of the unit. This may be used by
|
||||
<command>systemd</command> (and other UIs) as a user-visible label for the unit, so this string
|
||||
should identify the unit rather than describe it, despite the name. This string also should not just
|
||||
repeat the unit name. <literal>Apache2 Web Server</literal> is a good example. Bad examples are
|
||||
<literal>high-performance lightweight HTTP server</literal> (too generic) or
|
||||
<literal>Apache2</literal> (meaningless for people who do not know Apache, duplicates the unit
|
||||
name). <command>systemd</command> may use this string as a noun in status messages (<literal>Starting
|
||||
<replaceable>description</replaceable>...</literal>, <literal>Started
|
||||
<replaceable>description</replaceable>.</literal>, <literal>Reached target
|
||||
<replaceable>description</replaceable>.</literal>, <literal>Failed to start
|
||||
<replaceable>description</replaceable>.</literal>), so it should be capitalized, and should not be a
|
||||
full sentence, or a phrase with a continuous verb. Bad examples include <literal>exiting the
|
||||
container</literal> or <literal>updating the database once per day.</literal>.</para>
|
||||
|
||||
<xi:include href="version-info.xml" xpointer="v201"/>
|
||||
</listitem>
|
||||
@ -2565,7 +2563,7 @@ ExecStart=/usr/sbin/foo-daemon
|
||||
the following contents:</para>
|
||||
|
||||
<programlisting>[Unit]
|
||||
Description=Some HTTP Server
|
||||
Description=Some HTTP server
|
||||
After=remote-fs.target sqldb.service
|
||||
Requires=sqldb.service
|
||||
AssertPathExists=/srv/webserver
|
||||
@ -2597,7 +2595,7 @@ WantedBy=multi-user.target</programlisting>
|
||||
change the chosen settings:</para>
|
||||
|
||||
<programlisting>[Unit]
|
||||
Description=Some HTTP Server
|
||||
Description=Some HTTP server
|
||||
After=remote-fs.target sqldb.service <emphasis>memcached.service</emphasis>
|
||||
Requires=sqldb.service <emphasis>memcached.service</emphasis>
|
||||
AssertPathExists=<emphasis>/srv/www</emphasis>
|
||||
@ -2655,7 +2653,7 @@ PrivateTmp=yes</programlisting>
|
||||
<filename index='false'>/etc/systemd/system/failure-handler@.service</filename>:</para>
|
||||
|
||||
<programlisting>[Unit]
|
||||
Description=My Failure Handler For %i
|
||||
Description=My failure handler for %i
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
|
@ -71,7 +71,7 @@
|
||||
<varlistentry>
|
||||
<term><varname>Description=</varname></term>
|
||||
|
||||
<listitem><para>A short human-readable description of this feature.
|
||||
<listitem><para>A short human readable description of this feature.
|
||||
This may be used as a label for this feature, so the string should meaningfully identify the feature
|
||||
among the features available in <filename>sysupdate.d/</filename>.</para>
|
||||
|
||||
|
@ -61,7 +61,7 @@
|
||||
<literal>friendly</literal>, <literal>table</literal> or <literal>json</literal>. If
|
||||
<literal>classic</literal>, an output very close to the format of <filename>/etc/passwd</filename> or
|
||||
<filename>/etc/group</filename> is generated. If <literal>friendly</literal>, a more comprehensive and
|
||||
user friendly, human-readable output is generated. If <literal>table</literal>, a minimal, tabular
|
||||
user friendly, human readable output is generated. If <literal>table</literal>, a minimal, tabular
|
||||
output is generated. If <literal>json</literal>, a JSON formatted output is generated. Defaults to
|
||||
<literal>friendly</literal> if a user/group is specified on the command line,
|
||||
<literal>table</literal> otherwise.</para>
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
|
@ -100,9 +100,9 @@ typedef struct BootEntry {
|
||||
char16_t *id; /* The unique identifier for this entry (typically the filename of the file defining the entry, possibly suffixed with a profile id) */
|
||||
char16_t *id_without_profile; /* same, but without any profile id suffixed */
|
||||
char16_t *title_show; /* The string to actually display (this is made unique before showing) */
|
||||
char16_t *title; /* The raw (human-readable) title string of the entry (not necessarily unique) */
|
||||
char16_t *title; /* The raw (human readable) title string of the entry (not necessarily unique) */
|
||||
char16_t *sort_key; /* The string to use as primary sort key, usually ID= from os-release, possibly suffixed */
|
||||
char16_t *version; /* The raw (human-readable) version string of the entry */
|
||||
char16_t *version; /* The raw (human readable) version string of the entry */
|
||||
char16_t *machine_id;
|
||||
EFI_HANDLE *device;
|
||||
LoaderType type;
|
||||
|
@ -1,7 +1,6 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <getopt.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "sd-varlink.h"
|
||||
|
||||
|
@ -2393,7 +2393,7 @@ static int unit_log_resources(Unit *u) {
|
||||
return log_oom();
|
||||
|
||||
/* Invoked whenever a unit enters failed or dead state. Logs information about consumed resources if resource
|
||||
* accounting was enabled for a unit. It does this in two ways: a friendly human-readable string with reduced
|
||||
* accounting was enabled for a unit. It does this in two ways: a friendly human readable string with reduced
|
||||
* information and the complete data in structured fields. */
|
||||
|
||||
(void) unit_get_cpu_usage(u, &cpu_nsec);
|
||||
|
@ -17,8 +17,8 @@ bool bootspec_pick_name_version_sort_key(
|
||||
|
||||
const sd_char *good_name, *good_version, *good_sort_key;
|
||||
|
||||
/* Find the best human-readable title, version string and sort key for a boot entry (using the
|
||||
* os-release(5) fields). Precise is preferred over vague, and human-readable over machine
|
||||
/* Find the best human readable title, version string and sort key for a boot entry (using the
|
||||
* os-release(5) fields). Precise is preferred over vague, and human readable over machine
|
||||
* readable. Thus:
|
||||
*
|
||||
* 1. First priority gets the PRETTY_NAME field, which is the primary string intended for display,
|
||||
@ -28,7 +28,7 @@ bool bootspec_pick_name_version_sort_key(
|
||||
* 2. Otherwise we go for IMAGE_ID and IMAGE_VERSION (thus we show details about the image,
|
||||
* i.e. specific combination of packages and configuration), if that concept applies.
|
||||
*
|
||||
* 3. Otherwise we go for NAME and VERSION (i.e. human-readable OS name and version)
|
||||
* 3. Otherwise we go for NAME and VERSION (i.e. human readable OS name and version)
|
||||
*
|
||||
* 4. Otherwise we go for ID and VERSION_ID (i.e. machine readable OS name and version)
|
||||
*
|
||||
|
@ -2,7 +2,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "compress.h"
|
||||
#include "forward.h"
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "bitfield.h"
|
||||
|
@ -5,7 +5,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "sd-bus.h"
|
||||
|
@ -19,7 +19,7 @@ typedef enum AskPasswordFlags {
|
||||
|
||||
/* Encapsulates the mostly static fields of a password query */
|
||||
typedef struct AskPasswordRequest {
|
||||
const char *message; /* The human-readable password prompt when asking interactively */
|
||||
const char *message; /* The human readable password prompt when asking interactively */
|
||||
const char *keyring; /* kernel keyring key name (key of "user" type) */
|
||||
const char *icon; /* freedesktop icon spec name */
|
||||
const char *id; /* some identifier used for this prompt for the "ask-password" protocol */
|
||||
|
@ -76,17 +76,6 @@ static int warn_deprecated(_unused_ sd_bus_message *m, const char *field, const
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int parse_log_error(int error, const char *field, const char *eq) {
|
||||
if (error == -ENOMEM)
|
||||
return log_oom();
|
||||
if (error != 0) /* Allow SYNTHETIC_ERRNO to be used, i.e. positive values. */
|
||||
return log_error_errno(error, "Failed to parse %s= value '%s': %m", field, eq);
|
||||
|
||||
/* We don't log the error value for cases where we have a general "syntax error". */
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Invalid syntax for %s= value: '%s'", field, eq);
|
||||
}
|
||||
|
||||
#define DEFINE_BUS_APPEND_PARSE_PTR(bus_type, cast_type, type, parse_func) \
|
||||
static int bus_append_##parse_func( \
|
||||
sd_bus_message *m, \
|
||||
@ -97,7 +86,7 @@ static int parse_log_error(int error, const char *field, const char *eq) {
|
||||
\
|
||||
r = parse_func(eq, &val); \
|
||||
if (r < 0) \
|
||||
return parse_log_error(r, field, eq); \
|
||||
return log_error_errno(r, "Failed to parse %s=%s: %m", field, eq); \
|
||||
\
|
||||
r = sd_bus_message_append(m, "(sv)", field, \
|
||||
bus_type, (cast_type) val); \
|
||||
@ -116,7 +105,7 @@ static int parse_log_error(int error, const char *field, const char *eq) {
|
||||
\
|
||||
r = parse_func(eq); \
|
||||
if (r < 0) \
|
||||
return parse_log_error(r, field, eq); \
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s: %s", field, eq); \
|
||||
\
|
||||
r = sd_bus_message_append(m, "(sv)", field, \
|
||||
bus_type, (int32_t) r); \
|
||||
@ -186,8 +175,10 @@ static int bus_append_strv_full(sd_bus_message *m, const char *field, const char
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&p, &word, /* separators= */ NULL, flags);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Invalid syntax: %s", eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
@ -257,7 +248,7 @@ static int bus_append_parse_sec_rename(sd_bus_message *m, const char *field, con
|
||||
|
||||
r = parse_sec(eq, &t);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s=%s: %m", field, eq);
|
||||
|
||||
l = strlen(field);
|
||||
n = newa(char, l + 2);
|
||||
@ -281,7 +272,7 @@ static int bus_append_parse_size(sd_bus_message *m, const char *field, const cha
|
||||
|
||||
r = parse_size(eq, /* base= */ 1024, &v);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s=%s: %m", field, eq);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "t", v);
|
||||
if (r < 0)
|
||||
@ -295,7 +286,7 @@ static int bus_append_parse_permyriad(sd_bus_message *m, const char *field, cons
|
||||
|
||||
r = parse_permyriad(eq);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s=%s: %m", field, eq);
|
||||
|
||||
/* Pass around scaled to 2^32-1 == 100% */
|
||||
r = sd_bus_message_append(m, "(sv)", field, "u", UINT32_SCALE_FROM_PERMYRIAD(r));
|
||||
@ -313,7 +304,7 @@ static int bus_append_parse_cpu_set(sd_bus_message *m, const char *field, const
|
||||
|
||||
r = parse_cpu_set(eq, &cpuset);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s value: %s", field, eq);
|
||||
|
||||
r = cpu_set_to_dbus(&cpuset, &array, &allocated);
|
||||
if (r < 0)
|
||||
@ -384,10 +375,10 @@ static int bus_append_parse_cpu_quota(sd_bus_message *m, const char *field, cons
|
||||
x = USEC_INFINITY;
|
||||
else {
|
||||
r = parse_permyriad_unbounded(eq);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == 0)
|
||||
return parse_log_error(SYNTHETIC_ERRNO(ERANGE), field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(ERANGE), "%s value too small.", field);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse %s=%s: %m", field, eq);
|
||||
x = r * USEC_PER_SEC / 10000U;
|
||||
}
|
||||
|
||||
@ -435,7 +426,9 @@ static int bus_try_append_parse_cgroup_io_limit(sd_bus_message *m, const char *f
|
||||
else {
|
||||
const char *e = strchr(eq, ' ');
|
||||
if (!e)
|
||||
return parse_log_error(0, field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to parse %s value %s.",
|
||||
field, eq);
|
||||
|
||||
const char *bandwidth = e + 1;
|
||||
_cleanup_free_ char *path = strndup(eq, e - eq);
|
||||
@ -448,7 +441,7 @@ static int bus_try_append_parse_cgroup_io_limit(sd_bus_message *m, const char *f
|
||||
else {
|
||||
r = parse_size(bandwidth, 1000, &bytes);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse byte value %s: %m", bandwidth);
|
||||
}
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "a(st)", 1, path, bytes);
|
||||
@ -467,7 +460,9 @@ static int bus_append_parse_io_device_weight(sd_bus_message *m, const char *fiel
|
||||
else {
|
||||
const char *e = strchr(eq, ' ');
|
||||
if (!e)
|
||||
return parse_log_error(0, field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to parse %s value %s.",
|
||||
field, eq);
|
||||
|
||||
const char *weight = e + 1;
|
||||
_cleanup_free_ char *path = strndup(eq, e - eq);
|
||||
@ -477,7 +472,7 @@ static int bus_append_parse_io_device_weight(sd_bus_message *m, const char *fiel
|
||||
uint64_t u;
|
||||
r = safe_atou64(weight, &u);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, weight);
|
||||
return log_error_errno(r, "Failed to parse %s value %s: %m", field, weight);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "a(st)", 1, path, u);
|
||||
}
|
||||
@ -496,7 +491,9 @@ static int bus_append_parse_io_device_latency(sd_bus_message *m, const char *fie
|
||||
else {
|
||||
const char *e = strchr(eq, ' ');
|
||||
if (!e)
|
||||
return parse_log_error(0, field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to parse %s value %s.",
|
||||
field, eq);
|
||||
|
||||
const char *target = e + 1;
|
||||
_cleanup_free_ char *path = strndup(eq, e - eq);
|
||||
@ -506,7 +503,7 @@ static int bus_append_parse_io_device_latency(sd_bus_message *m, const char *fie
|
||||
usec_t usec;
|
||||
r = parse_sec(target, &usec);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, target);
|
||||
return log_error_errno(r, "Failed to parse %s value %s: %m", field, target);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field_usec, "a(st)", 1, path, usec);
|
||||
}
|
||||
@ -525,8 +522,10 @@ static int bus_append_bpf_program(sd_bus_message *m, const char *field, const ch
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&eq, &word, ":", 0);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s: %m", field);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "a(ss)", 1, word, eq);
|
||||
}
|
||||
@ -546,8 +545,10 @@ static int bus_append_socket_filter(sd_bus_message *m, const char *field, const
|
||||
uint16_t nr_ports, port_min;
|
||||
|
||||
r = parse_socket_bind_item(eq, &family, &ip_protocol, &nr_ports, &port_min);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s", field);
|
||||
|
||||
r = sd_bus_message_append(
|
||||
m, "(sv)", field, "a(iiqq)", 1, family, ip_protocol, nr_ports, port_min);
|
||||
@ -560,9 +561,10 @@ static int bus_append_socket_filter(sd_bus_message *m, const char *field, const
|
||||
|
||||
static int bus_append_exec_command(sd_bus_message *m, const char *field, const char *eq) {
|
||||
bool explicit_path = false, done = false, ambient_hack = false;
|
||||
_cleanup_strv_free_ char **cmdline = NULL, **ex_opts = NULL;
|
||||
_cleanup_free_ char *_path = NULL;
|
||||
_cleanup_strv_free_ char **l = NULL, **ex_opts = NULL;
|
||||
_cleanup_free_ char *path = NULL, *upgraded_name = NULL;
|
||||
ExecCommandFlags flags = 0;
|
||||
bool is_ex_prop = endswith(field, "Ex");
|
||||
int r;
|
||||
|
||||
do {
|
||||
@ -637,40 +639,43 @@ static int bus_append_exec_command(sd_bus_message *m, const char *field, const c
|
||||
}
|
||||
} while (!done);
|
||||
|
||||
bool ex_prop = flags & (EXEC_COMMAND_NO_ENV_EXPAND|EXEC_COMMAND_FULLY_PRIVILEGED|EXEC_COMMAND_NO_SETUID|EXEC_COMMAND_VIA_SHELL);
|
||||
if (ex_prop) {
|
||||
/* We need to use ExecXYZEx=. */
|
||||
if (!endswith(field, "Ex"))
|
||||
field = strjoina(field, "Ex");
|
||||
if (!is_ex_prop && (flags & (EXEC_COMMAND_NO_ENV_EXPAND|EXEC_COMMAND_FULLY_PRIVILEGED|EXEC_COMMAND_NO_SETUID|EXEC_COMMAND_VIA_SHELL))) {
|
||||
/* Upgrade the ExecXYZ= property to ExecXYZEx= for convenience */
|
||||
is_ex_prop = true;
|
||||
|
||||
upgraded_name = strjoin(field, "Ex");
|
||||
if (!upgraded_name)
|
||||
return log_oom();
|
||||
field = upgraded_name;
|
||||
}
|
||||
|
||||
if (is_ex_prop) {
|
||||
r = exec_command_flags_to_strv(flags, &ex_opts);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to serialize ExecCommand flags: %m");
|
||||
} else {
|
||||
if (endswith(field, "Ex"))
|
||||
field = strndupa_safe(field, strlen(field) - 2);
|
||||
return log_error_errno(r, "Failed to convert ExecCommandFlags to strv: %m");
|
||||
}
|
||||
|
||||
const char *path = NULL;
|
||||
if (FLAGS_SET(flags, EXEC_COMMAND_VIA_SHELL))
|
||||
path = _PATH_BSHELL;
|
||||
else if (explicit_path) {
|
||||
r = extract_first_word(&eq, &_path, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No executable path specified for %s=, refusing.", field);
|
||||
if (isempty(eq))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Got empty command line for %s=, refusing.", field);
|
||||
path = _path;
|
||||
}
|
||||
|
||||
r = strv_split_full(&cmdline, eq, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
|
||||
if (FLAGS_SET(flags, EXEC_COMMAND_VIA_SHELL)) {
|
||||
r = strv_prepend(&cmdline, explicit_path ? "-sh" : "sh");
|
||||
path = strdup(_PATH_BSHELL);
|
||||
if (!path)
|
||||
return log_oom();
|
||||
|
||||
} else if (explicit_path) {
|
||||
r = extract_first_word(&eq, &path, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse path: %m");
|
||||
if (r == 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No executable path specified, refusing.");
|
||||
if (isempty(eq))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Got empty command line, refusing.");
|
||||
}
|
||||
|
||||
r = strv_split_full(&l, eq, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse command line: %m");
|
||||
|
||||
if (FLAGS_SET(flags, EXEC_COMMAND_VIA_SHELL)) {
|
||||
r = strv_prepend(&l, explicit_path ? "-sh" : "sh");
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
}
|
||||
@ -683,29 +688,29 @@ static int bus_append_exec_command(sd_bus_message *m, const char *field, const c
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
r = sd_bus_message_open_container(m, 'v', ex_prop ? "a(sasas)" : "a(sasb)");
|
||||
r = sd_bus_message_open_container(m, 'v', is_ex_prop ? "a(sasas)" : "a(sasb)");
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
r = sd_bus_message_open_container(m, 'a', ex_prop ? "(sasas)" : "(sasb)");
|
||||
r = sd_bus_message_open_container(m, 'a', is_ex_prop ? "(sasas)" : "(sasb)");
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
if (!strv_isempty(cmdline)) {
|
||||
r = sd_bus_message_open_container(m, 'r', ex_prop ? "sasas" : "sasb");
|
||||
if (!strv_isempty(l)) {
|
||||
|
||||
r = sd_bus_message_open_container(m, 'r', is_ex_prop ? "sasas" : "sasb");
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
r = sd_bus_message_append(m, "s", path ?: cmdline[0]);
|
||||
r = sd_bus_message_append(m, "s", path ?: l[0]);
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
r = sd_bus_message_append_strv(m, cmdline);
|
||||
r = sd_bus_message_append_strv(m, l);
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
r = ex_prop ? sd_bus_message_append_strv(m, ex_opts) :
|
||||
sd_bus_message_append(m, "b", FLAGS_SET(flags, EXEC_COMMAND_IGNORE_FAILURE));
|
||||
r = is_ex_prop ? sd_bus_message_append_strv(m, ex_opts) : sd_bus_message_append(m, "b", FLAGS_SET(flags, EXEC_COMMAND_IGNORE_FAILURE));
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
@ -737,7 +742,7 @@ static int bus_append_open_file(sd_bus_message *m, const char *field, const char
|
||||
|
||||
r = open_file_parse(eq, &of);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse OpenFile= setting: %m");
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "a(sst)", (size_t) 1, of->path, of->fdname, of->flags);
|
||||
if (r < 0)
|
||||
@ -859,14 +864,16 @@ static int bus_append_parse_ip_address_filter(sd_bus_message *m, const char *fie
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&eq, &word, NULL, 0);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse %s: %s", field, eq);
|
||||
|
||||
r = in_addr_prefix_from_string_auto(word, &family, &prefix, &prefixlen);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse IP address prefix '%s': %m", word);
|
||||
return log_error_errno(r, "Failed to parse IP address prefix: %s", word);
|
||||
|
||||
r = bus_append_ip_address_access(m, family, &prefix, prefixlen);
|
||||
if (r < 0)
|
||||
@ -941,38 +948,34 @@ static int bus_append_nft_set(sd_bus_message *m, const char *field, const char *
|
||||
int source, nfproto;
|
||||
|
||||
r = extract_first_word(&p, &tuple, NULL, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s: %m", field);
|
||||
if (r == 0)
|
||||
break;
|
||||
if (isempty(tuple))
|
||||
return parse_log_error(0, field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s.", field);
|
||||
|
||||
q = tuple;
|
||||
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE, &source_str, &nfproto_str, &table, &set);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r != 4 || !isempty(q))
|
||||
return parse_log_error(0, field, tuple);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s.", field);
|
||||
|
||||
assert(source_str);
|
||||
assert(nfproto_str);
|
||||
assert(table);
|
||||
assert(set);
|
||||
|
||||
source = r = nft_set_source_from_string(source_str);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse NFT set source '%s': %m", source_str);
|
||||
source = nft_set_source_from_string(source_str);
|
||||
if (!IN_SET(source, NFT_SET_SOURCE_CGROUP, NFT_SET_SOURCE_USER, NFT_SET_SOURCE_GROUP))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Bad NFT set source value '%s'.",
|
||||
nft_set_source_to_string(source));
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s.", field);
|
||||
|
||||
nfproto = r = nfproto_from_string(nfproto_str);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse nft protocol '%s': %m", nfproto_str);
|
||||
|
||||
if (!nft_identifier_valid(table))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Bad NFT identifier name '%s'.", table);
|
||||
if (!nft_identifier_valid(set))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Bad NFT identifier name '%s'.", set);
|
||||
nfproto = nfproto_from_string(nfproto_str);
|
||||
if (nfproto < 0 || !nft_identifier_valid(table) || !nft_identifier_valid(set))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse %s.", field);
|
||||
|
||||
r = sd_bus_message_append(m, "(iiss)", source, nfproto, table, set);
|
||||
if (r < 0)
|
||||
@ -1022,8 +1025,12 @@ static int bus_append_set_credential(sd_bus_message *m, const char *field, const
|
||||
const char *p = eq;
|
||||
|
||||
r = extract_first_word(&p, &word, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r <= 0 || !p)
|
||||
return parse_log_error(r < 0 ? r : 0, field, eq);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse %s= parameter: %s", field, eq);
|
||||
if (r == 0 || !p)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Missing argument to %s=.", field);
|
||||
|
||||
r = sd_bus_message_open_container(m, 'a', "(say)");
|
||||
if (r < 0)
|
||||
@ -1037,13 +1044,13 @@ static int bus_append_set_credential(sd_bus_message *m, const char *field, const
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
if (endswith(field, "Encrypted")) {
|
||||
if (streq(field, "SetCredentialEncrypted")) {
|
||||
_cleanup_free_ void *decoded = NULL;
|
||||
size_t decoded_size;
|
||||
|
||||
r = unbase64mem(p, &decoded, &decoded_size);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to decode base64 data for %s=: %m", field);
|
||||
return log_error_errno(r, "Failed to base64 decode encrypted credential: %m");
|
||||
|
||||
r = sd_bus_message_append_array(m, 'y', decoded, decoded_size);
|
||||
} else {
|
||||
@ -1052,7 +1059,7 @@ static int bus_append_set_credential(sd_bus_message *m, const char *field, const
|
||||
|
||||
l = cunescape(p, UNESCAPE_ACCEPT_NUL, &unescaped);
|
||||
if (l < 0)
|
||||
return log_error_errno(l, "Failed to unescape value for %s=: %s", field, p);
|
||||
return log_error_errno(l, "Failed to unescape %s= value: %s", field, p);
|
||||
|
||||
r = sd_bus_message_append_array(m, 'y', unescaped, l);
|
||||
}
|
||||
@ -1101,8 +1108,12 @@ static int bus_append_load_credential(sd_bus_message *m, const char *field, cons
|
||||
const char *p = eq;
|
||||
|
||||
r = extract_first_word(&p, &word, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r <= 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse %s= parameter: %s", field, eq);
|
||||
if (r == 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Missing argument to %s=.", field);
|
||||
|
||||
if (isempty(p)) /* If only one field is specified, then this means "inherit from above" */
|
||||
p = eq;
|
||||
@ -1133,8 +1144,12 @@ static int bus_append_import_credential(sd_bus_message *m, const char *field, co
|
||||
const char *p = eq;
|
||||
|
||||
r = extract_first_word(&p, &word, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r <= 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse %s= parameter: %s", field, eq);
|
||||
if (r == 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Missing argument to %s=.", field);
|
||||
|
||||
if (!p)
|
||||
r = sd_bus_message_append(m, "(sv)", "ImportCredential", "as", 1, eq);
|
||||
@ -1208,10 +1223,15 @@ static int bus_append_log_extra_fields(sd_bus_message *m, const char *field, con
|
||||
}
|
||||
|
||||
static int bus_append_log_filter_patterns(sd_bus_message *m, const char *field, const char *eq) {
|
||||
return bus_append_trivial_array(m, field, eq,
|
||||
"a(bs)",
|
||||
eq[0] != '~',
|
||||
eq[0] != '~' ? eq : eq + 1);
|
||||
int r;
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", "LogFilterPatterns", "a(bs)", 1,
|
||||
eq[0] != '~',
|
||||
eq[0] != '~' ? eq : eq + 1);
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int bus_append_standard_inputs(sd_bus_message *m, const char *field, const char *eq) {
|
||||
@ -1244,7 +1264,7 @@ static int bus_append_standard_input_text(sd_bus_message *m, const char *field,
|
||||
|
||||
l = cunescape(eq, 0, &unescaped);
|
||||
if (l < 0)
|
||||
return log_error_errno(l, "Failed to unescape value for %s=: %s", field, eq);
|
||||
return log_error_errno(l, "Failed to unescape text '%s': %m", eq);
|
||||
|
||||
if (!strextend(&unescaped, "\n"))
|
||||
return log_oom();
|
||||
@ -1262,7 +1282,7 @@ static int bus_append_standard_input_data(sd_bus_message *m, const char *field,
|
||||
|
||||
r = unbase64mem(eq, &decoded, &sz);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to decode base64 data for %s=: %m", field);
|
||||
return log_error_errno(r, "Failed to decode base64 data '%s': %m", eq);
|
||||
|
||||
return bus_append_byte_array(m, field, decoded, sz);
|
||||
}
|
||||
@ -1276,12 +1296,12 @@ static int bus_try_append_resource_limit(sd_bus_message *m, const char *field, c
|
||||
|
||||
int rl = rlimit_from_string(suffix);
|
||||
if (rl < 0)
|
||||
return 0; /* We let the generic error machinery handle this. */
|
||||
return log_error_errno(rl, "Unknown setting '%s'.", field);
|
||||
|
||||
struct rlimit l;
|
||||
r = rlimit_parse(rl, eq, &l);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse resource limit: %s", eq);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "t", (uint64_t) l.rlim_max);
|
||||
if (r < 0)
|
||||
@ -1329,7 +1349,7 @@ static int bus_append_capabilities(sd_bus_message *m, const char *field, const c
|
||||
|
||||
r = capability_set_from_string(p, &sum);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s value %s: %m", field, eq);
|
||||
|
||||
sum = invert ? ~sum : sum;
|
||||
|
||||
@ -1366,7 +1386,7 @@ static int bus_append_numa_mask(sd_bus_message *m, const char *field, const char
|
||||
} else {
|
||||
r = parse_cpu_set(eq, &nodes);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s value: %s", field, eq);
|
||||
}
|
||||
|
||||
r = cpu_set_to_dbus(&nodes, &array, &allocated);
|
||||
@ -1414,10 +1434,12 @@ static int bus_append_filter_list(sd_bus_message *m, const char *field, const ch
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Invalid syntax: %s", eq);
|
||||
|
||||
r = sd_bus_message_append_basic(m, 's', word);
|
||||
if (r < 0)
|
||||
@ -1465,7 +1487,7 @@ static int bus_append_namespace_list(sd_bus_message *m, const char *field, const
|
||||
|
||||
r = namespace_flags_from_string(eq, &flags);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s value %s.", field, eq);
|
||||
}
|
||||
|
||||
if (invert)
|
||||
@ -1506,7 +1528,7 @@ static int bus_append_bind_paths(sd_bus_message *m, const char *field, const cha
|
||||
|
||||
r = extract_first_word(&p, &source, ":" WHITESPACE, EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
@ -1519,7 +1541,7 @@ static int bus_append_bind_paths(sd_bus_message *m, const char *field, const cha
|
||||
if (p && p[-1] == ':') {
|
||||
r = extract_first_word(&p, &destination, ":" WHITESPACE, EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, p);
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
if (r == 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Missing argument after ':': %s", eq);
|
||||
@ -1531,7 +1553,7 @@ static int bus_append_bind_paths(sd_bus_message *m, const char *field, const cha
|
||||
|
||||
r = extract_first_word(&p, &options, NULL, EXTRACT_UNQUOTE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, p);
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
|
||||
if (isempty(options) || streq(options, "rbind"))
|
||||
flags = MS_REC;
|
||||
@ -1590,14 +1612,17 @@ static int bus_append_temporary_file_system(sd_bus_message *m, const char *field
|
||||
|
||||
r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
w = word;
|
||||
r = extract_first_word(&w, &path, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
|
||||
if (r <= 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
if (r == 0)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to parse argument: %s", p);
|
||||
|
||||
r = sd_bus_message_append(m, "(ss)", path, w);
|
||||
if (r < 0)
|
||||
@ -1631,9 +1656,9 @@ static int bus_append_root_hash(sd_bus_message *m, const char *field, const char
|
||||
/* We have a roothash to decode, eg: RootHash=012345789abcdef */
|
||||
r = unhexmem(eq, &roothash_decoded, &roothash_decoded_size);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to decode base64 data for %s=: %m", field);
|
||||
return log_error_errno(r, "Failed to decode RootHash= '%s': %m", eq);
|
||||
if (roothash_decoded_size < sizeof(sd_id128_t))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "%s value '%s' is too short.", field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "RootHash= '%s' is too short.", eq);
|
||||
|
||||
return bus_append_byte_array(m, field, roothash_decoded, roothash_decoded_size);
|
||||
}
|
||||
@ -1650,13 +1675,13 @@ static int bus_append_root_hash_signature(sd_bus_message *m, const char *field,
|
||||
|
||||
if (!(value = startswith(eq, "base64:")))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to decode %s value '%s': neither a path nor starts with 'base64:'.",
|
||||
"Failed to decode %s=%s: neither a path nor starts with 'base64:'.",
|
||||
field, eq);
|
||||
|
||||
/* We have a roothash signature to decode, eg: RootHashSignature=base64:012345789abcdef */
|
||||
r = unbase64mem(value, &roothash_sig_decoded, &roothash_sig_decoded_size);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to decode base64 data for %s=: %m", field);
|
||||
return log_error_errno(r, "Failed to decode %s=%s: %m", field, eq);
|
||||
|
||||
return bus_append_byte_array(m, field, roothash_sig_decoded, roothash_sig_decoded_size);
|
||||
}
|
||||
@ -1684,7 +1709,7 @@ static int bus_append_root_image_options(sd_bus_message *m, const char *field, c
|
||||
|
||||
r = strv_split_colon_pairs(&l, p);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
|
||||
STRV_FOREACH_PAIR(first, second, l) {
|
||||
r = sd_bus_message_append(m, "(ss)",
|
||||
@ -1736,14 +1761,14 @@ static int bus_append_mount_images(sd_bus_message *m, const char *field, const c
|
||||
|
||||
r = extract_first_word(&p, &tuple, NULL, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s property: %s", field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
q = tuple;
|
||||
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &first, &second);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s property: %s", field, eq);
|
||||
if (r == 0)
|
||||
continue;
|
||||
|
||||
@ -1755,7 +1780,7 @@ static int bus_append_mount_images(sd_bus_message *m, const char *field, const c
|
||||
|
||||
if (isempty(second))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Missing argument after ':' for %s=: '%s'", field, eq);
|
||||
"Missing argument after ':' for %s: %s", field, eq);
|
||||
|
||||
r = sd_bus_message_open_container(m, 'r', "ssba(ss)");
|
||||
if (r < 0)
|
||||
@ -1774,7 +1799,7 @@ static int bus_append_mount_images(sd_bus_message *m, const char *field, const c
|
||||
|
||||
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s property: %s", field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
/* Single set of options, applying to the root partition/single filesystem */
|
||||
@ -1842,14 +1867,14 @@ static int bus_append_extension_images(sd_bus_message *m, const char *field, con
|
||||
|
||||
r = extract_first_word(&p, &tuple, NULL, EXTRACT_UNQUOTE|EXTRACT_RETAIN_ESCAPE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s property: %s", field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
q = tuple;
|
||||
r = extract_first_word(&q, &source, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s property: %s", field, eq);
|
||||
if (r == 0)
|
||||
continue;
|
||||
|
||||
@ -1876,7 +1901,7 @@ static int bus_append_extension_images(sd_bus_message *m, const char *field, con
|
||||
|
||||
r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s property: %s", field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
/* Single set of options, applying to the root partition/single filesystem */
|
||||
@ -1931,14 +1956,14 @@ static int bus_append_directory(sd_bus_message *m, const char *field, const char
|
||||
|
||||
r = extract_first_word(&p, &tuple, NULL, EXTRACT_UNQUOTE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse argument: %m");
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
const char *t = tuple;
|
||||
r = extract_many_words(&t, ":", EXTRACT_UNQUOTE|EXTRACT_DONT_COALESCE_SEPARATORS, &source, &dest, &flags);
|
||||
if (r <= 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r ?: SYNTHETIC_ERRNO(EINVAL), "Failed to parse argument: %m");
|
||||
|
||||
path_simplify(source);
|
||||
|
||||
@ -1954,7 +1979,7 @@ static int bus_append_directory(sd_bus_message *m, const char *field, const char
|
||||
} else {
|
||||
ExecDirectoryFlags exec_directory_flags = exec_directory_flags_from_string(flags);
|
||||
if (exec_directory_flags < 0 || (exec_directory_flags & ~_EXEC_DIRECTORY_FLAGS_PUBLIC) != 0)
|
||||
return log_error_errno(r, "Failed to parse flags for %s=: '%s'", field, flags);
|
||||
return log_error_errno(r, "Failed to parse flags: %s", flags);
|
||||
|
||||
if (!isempty(dest)) {
|
||||
path_simplify(dest);
|
||||
@ -2072,7 +2097,7 @@ static int bus_append_protect_hostname(sd_bus_message *m, const char *field, con
|
||||
const char *colon = strchr(eq, ':');
|
||||
if (colon) {
|
||||
if (isempty(colon + 1))
|
||||
return parse_log_error(0, field, eq);
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse argument: %s=%s", field, eq);
|
||||
|
||||
_cleanup_free_ char *p = strndup(eq, colon - eq);
|
||||
if (!p)
|
||||
@ -2088,28 +2113,6 @@ static int bus_append_protect_hostname(sd_bus_message *m, const char *field, con
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int bus_append_boolean_or_ex_string(sd_bus_message *m, const char *field, const char *eq) {
|
||||
int r;
|
||||
|
||||
r = parse_boolean(eq);
|
||||
if (r >= 0) {
|
||||
if (endswith(field, "Ex"))
|
||||
field = strndupa_safe(field, strlen(field) - 2);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "b", r);
|
||||
} else {
|
||||
if (!endswith(field, "Ex"))
|
||||
field = strjoina(field, "Ex");
|
||||
|
||||
/* We allow any string through and let the server perform the verification. */
|
||||
r = sd_bus_message_append(m, "(sv)", field, "s", eq);
|
||||
}
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int bus_append_paths(sd_bus_message *m, const char *field, const char *eq) {
|
||||
return bus_append_trivial_array(m, "Paths", eq,
|
||||
"a(ss)", field, eq);
|
||||
@ -2124,10 +2127,12 @@ static int bus_append_exit_status(sd_bus_message *m, const char *field, const ch
|
||||
_cleanup_free_ char *word = NULL;
|
||||
|
||||
r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
if (r == 0)
|
||||
break;
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Invalid syntax in %s: %s", field, eq);
|
||||
|
||||
/* We need to call exit_status_from_string() first, because we want
|
||||
* to parse numbers as exit statuses, not signals. */
|
||||
@ -2149,7 +2154,8 @@ static int bus_append_exit_status(sd_bus_message *m, const char *field, const ch
|
||||
|
||||
} else
|
||||
/* original r from exit_status_to_string() */
|
||||
return parse_log_error(r, field, word);
|
||||
return log_error_errno(r, "Invalid status or signal %s in %s: %m",
|
||||
word, field);
|
||||
}
|
||||
|
||||
r = sd_bus_message_open_container(m, SD_BUS_TYPE_STRUCT, "sv");
|
||||
@ -2201,7 +2207,7 @@ static int bus_append_action_exit_status(sd_bus_message *m, const char *field, c
|
||||
|
||||
r = safe_atou8(eq, &u);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s=%s", field, eq);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", field, "i", (int) u);
|
||||
}
|
||||
@ -2227,7 +2233,7 @@ static int bus_append_timers_monotonic(sd_bus_message *m, const char *field, con
|
||||
usec_t t;
|
||||
r = parse_sec(eq, &t);
|
||||
if (r < 0)
|
||||
return parse_log_error(r, field, eq);
|
||||
return log_error_errno(r, "Failed to parse %s=%s: %m", field, eq);
|
||||
|
||||
r = sd_bus_message_append(m, "(sv)", "TimersMonotonic", "a(st)", 1, field, t);
|
||||
}
|
||||
@ -2385,6 +2391,9 @@ static const BusProperty execute_properties[] = {
|
||||
{ "SyslogIdentifier", bus_append_string },
|
||||
{ "ProtectSystem", bus_append_string },
|
||||
{ "ProtectHome", bus_append_string },
|
||||
{ "PrivateTmpEx", bus_append_string },
|
||||
{ "PrivateUsersEx", bus_append_string },
|
||||
{ "ProtectControlGroupsEx", bus_append_string },
|
||||
{ "SELinuxContext", bus_append_string },
|
||||
{ "RootImage", bus_append_string },
|
||||
{ "RootVerity", bus_append_string },
|
||||
@ -2404,8 +2413,10 @@ static const BusProperty execute_properties[] = {
|
||||
{ "TTYVHangup", bus_append_parse_boolean },
|
||||
{ "TTYReset", bus_append_parse_boolean },
|
||||
{ "TTYVTDisallocate", bus_append_parse_boolean },
|
||||
{ "PrivateTmp", bus_append_parse_boolean },
|
||||
{ "PrivateDevices", bus_append_parse_boolean },
|
||||
{ "PrivateNetwork", bus_append_parse_boolean },
|
||||
{ "PrivateUsers", bus_append_parse_boolean },
|
||||
{ "PrivateMounts", bus_append_parse_boolean },
|
||||
{ "PrivateIPC", bus_append_parse_boolean },
|
||||
{ "NoNewPrivileges", bus_append_parse_boolean },
|
||||
@ -2418,6 +2429,7 @@ static const BusProperty execute_properties[] = {
|
||||
{ "ProtectKernelModules", bus_append_parse_boolean },
|
||||
{ "ProtectKernelLogs", bus_append_parse_boolean },
|
||||
{ "ProtectClock", bus_append_parse_boolean },
|
||||
{ "ProtectControlGroups", bus_append_parse_boolean },
|
||||
{ "MountAPIVFS", bus_append_parse_boolean },
|
||||
{ "BindLogSockets", bus_append_parse_boolean },
|
||||
{ "CPUSchedulingResetOnFork", bus_append_parse_boolean },
|
||||
@ -2472,7 +2484,7 @@ static const BusProperty execute_properties[] = {
|
||||
{ "LoadCredential", bus_append_load_credential },
|
||||
{ "LoadCredentialEncrypted", bus_append_load_credential },
|
||||
{ "ImportCredential", bus_append_import_credential },
|
||||
{ "ImportCredentialEx", bus_append_import_credential }, /* compat */
|
||||
{ "ImportCredentialEx", bus_append_import_credential },
|
||||
{ "LogExtraFields", bus_append_log_extra_fields },
|
||||
{ "LogFilterPatterns", bus_append_log_filter_patterns },
|
||||
{ "StandardInput", bus_append_standard_inputs },
|
||||
@ -2507,13 +2519,7 @@ static const BusProperty execute_properties[] = {
|
||||
{ "CacheDirectory", bus_append_directory },
|
||||
{ "LogsDirectory", bus_append_directory },
|
||||
{ "ProtectHostname", bus_append_protect_hostname },
|
||||
{ "ProtectHostnameEx", bus_append_protect_hostname }, /* compat */
|
||||
{ "PrivateTmp", bus_append_boolean_or_ex_string },
|
||||
{ "PrivateTmpEx", bus_append_boolean_or_ex_string }, /* compat */
|
||||
{ "ProtectControlGroups", bus_append_boolean_or_ex_string },
|
||||
{ "ProtectControlGroupsEx", bus_append_boolean_or_ex_string }, /* compat */
|
||||
{ "PrivateUsers", bus_append_boolean_or_ex_string },
|
||||
{ "PrivateUsersEx", bus_append_boolean_or_ex_string }, /* compat */
|
||||
{ "ProtectHostnameEx", bus_append_protect_hostname },
|
||||
|
||||
{ NULL, bus_try_append_resource_limit, dump_resource_limits },
|
||||
{}
|
||||
@ -2603,19 +2609,19 @@ static const BusProperty service_properties[] = {
|
||||
{ "FileDescriptorStoreMax", bus_append_safe_atou },
|
||||
{ "RestartSteps", bus_append_safe_atou },
|
||||
{ "ExecCondition", bus_append_exec_command },
|
||||
{ "ExecConditionEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecStartPre", bus_append_exec_command },
|
||||
{ "ExecStartPreEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecStart", bus_append_exec_command },
|
||||
{ "ExecStartEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecStartPost", bus_append_exec_command },
|
||||
{ "ExecStartPostEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecConditionEx", bus_append_exec_command },
|
||||
{ "ExecStartPreEx", bus_append_exec_command },
|
||||
{ "ExecStartEx", bus_append_exec_command },
|
||||
{ "ExecStartPostEx", bus_append_exec_command },
|
||||
{ "ExecReload", bus_append_exec_command },
|
||||
{ "ExecReloadEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecStop", bus_append_exec_command },
|
||||
{ "ExecStopEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecStopPost", bus_append_exec_command },
|
||||
{ "ExecStopPostEx", bus_append_exec_command }, /* compat */
|
||||
{ "ExecReloadEx", bus_append_exec_command },
|
||||
{ "ExecStopEx", bus_append_exec_command },
|
||||
{ "ExecStopPostEx", bus_append_exec_command },
|
||||
{ "RestartPreventExitStatus", bus_append_exit_status },
|
||||
{ "RestartForceExitStatus", bus_append_exit_status },
|
||||
{ "SuccessExitStatus", bus_append_exit_status },
|
||||
@ -2880,11 +2886,9 @@ void bus_dump_transient_settings(UnitType t) {
|
||||
for (const BusProperty *item = *tables; item->convert; item++) {
|
||||
assert(item->name || item->dump);
|
||||
|
||||
/* Do not print deprecated names. All "Ex" variants are deprecated. */
|
||||
/* Do not print deprecated names */
|
||||
if (item->convert == warn_deprecated)
|
||||
continue;
|
||||
if (item->name && endswith(item->name, "Ex"))
|
||||
continue;
|
||||
|
||||
if (item->name)
|
||||
puts(item->name);
|
||||
|
@ -271,7 +271,7 @@ static int systemctl_help(void) {
|
||||
" For kill, wait until service stopped\n"
|
||||
" --no-block Do not wait until operation finished\n"
|
||||
" --no-wall Don't send wall message before halt/power-off/reboot\n"
|
||||
" --message=MESSAGE Specify human-readable reason for system shutdown\n"
|
||||
" --message=MESSAGE Specify human readable reason for system shutdown\n"
|
||||
" --no-reload Don't reload daemon after en-/dis-abling unit files\n"
|
||||
" --legend=BOOL Enable/disable the legend (column headers and hints)\n"
|
||||
" --no-pager Do not pipe output into a pager\n"
|
||||
|
@ -189,9 +189,9 @@ int sd_is_mq(int fd, const char *path);
|
||||
that describes the daemon state. This is free-form
|
||||
and can be used for various purposes: general state
|
||||
feedback, fsck-like programs could pass completion
|
||||
percentages and failing programs could pass a
|
||||
human-readable error message. Example:
|
||||
"STATUS=Completed 66% of file system check..."
|
||||
percentages and failing programs could pass a human
|
||||
readable error message. Example: "STATUS=Completed
|
||||
66% of file system check..."
|
||||
|
||||
NOTIFYACCESS=...
|
||||
Reset the access to the service status notification socket.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,6 @@
|
||||
#include <string.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/timex.h>
|
||||
|
||||
#define __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
#include <float.h>
|
||||
|
@ -5,7 +5,6 @@
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <resolv.h>
|
||||
#include <sys/timex.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "sd-bus.h"
|
||||
|
@ -20,16 +20,25 @@ property[7_seven]=ExecStopPost
|
||||
# These should all get upgraded to the corresponding Ex property as the non-Ex variant
|
||||
# does not support the ":" prefix (no-env-expand).
|
||||
for c in "${!property[@]}"; do
|
||||
systemd-run --unit="$c" -r -p "Type=oneshot" -p "${property[$c]}=:/bin/echo \${$c}" true
|
||||
systemd-run --unit="$c" -r -p "Type=oneshot" -p "${property[$c]}=:/bin/echo \${$c}" /bin/true
|
||||
systemctl show -p "${property[$c]}" "$c" | grep -F "path=/bin/echo ; argv[]=/bin/echo \${$c} ; ignore_errors=no"
|
||||
systemctl show -p "${property[$c]}Ex" "$c" | grep -F "path=/bin/echo ; argv[]=/bin/echo \${$c} ; flags=no-env-expand"
|
||||
done
|
||||
|
||||
# Ex names on the commandline are supported for backward compat.
|
||||
for c in "${!property[@]}"; do
|
||||
systemd-run --unit="${c}_ex" -r -p "Type=oneshot" -p "${property[$c]}Ex=:/bin/echo \${$c}" true
|
||||
systemctl show -p "${property[$c]}" "$c" | grep -F "path=/bin/echo ; argv[]=/bin/echo \${$c} ; ignore_errors=no"
|
||||
systemctl show -p "${property[$c]}Ex" "$c" | grep -F "path=/bin/echo ; argv[]=/bin/echo \${$c} ; flags=no-env-expand"
|
||||
declare -A property_ex
|
||||
|
||||
property_ex[1_one_ex]=ExecConditionEx
|
||||
property_ex[2_two_ex]=ExecStartPreEx
|
||||
property_ex[3_three_ex]=ExecStartEx
|
||||
property_ex[4_four_ex]=ExecStartPostEx
|
||||
property_ex[5_five_ex]=ExecReloadEx
|
||||
property_ex[6_six_ex]=ExecStopEx
|
||||
property_ex[7_seven_ex]=ExecStopPostEx
|
||||
|
||||
for c in "${!property_ex[@]}"; do
|
||||
systemd-run --unit="$c" -r -p "Type=oneshot" -p "${property_ex[$c]}=:/bin/echo \${$c}" /bin/true
|
||||
systemctl show -p "${property_ex[$c]%??}" "$c" | grep -F "path=/bin/echo ; argv[]=/bin/echo \${$c} ; ignore_errors=no"
|
||||
systemctl show -p "${property_ex[$c]}" "$c" | grep -F "path=/bin/echo ; argv[]=/bin/echo \${$c} ; flags=no-env-expand"
|
||||
done
|
||||
|
||||
systemd-analyze log-level info
|
||||
|
@ -1115,7 +1115,6 @@ systemd-analyze transient-settings mount | grep CPUQuotaPeriodSec
|
||||
(! systemd-analyze transient-settings service | grep CPUAccounting )
|
||||
(! systemd-analyze transient-settings service | grep ConditionKernelVersion )
|
||||
(! systemd-analyze transient-settings service | grep AssertKernelVersion )
|
||||
(! systemd-analyze transient-settings service socket timer path slice scope mount automount | grep -E 'Ex$' )
|
||||
|
||||
# check systemd-analyze unit-shell with a namespaced unit
|
||||
UNIT_NAME="test-unit-shell.service"
|
||||
|
Loading…
x
Reference in New Issue
Block a user