mirror of
https://git.proxmox.com/git/systemd
synced 2025-10-04 11:58:31 +00:00
New upstream version 250.3
This commit is contained in:
parent
36ceca0325
commit
a80b52fdbc
12
NEWS
12
NEWS
@ -10698,7 +10698,7 @@ CHANGES WITH 211:
|
|||||||
also supports LUKS-encrypted partitions now. With this in
|
also supports LUKS-encrypted partitions now. With this in
|
||||||
place, automatic discovery of partitions to mount following
|
place, automatic discovery of partitions to mount following
|
||||||
the Discoverable Partitions Specification
|
the Discoverable Partitions Specification
|
||||||
(https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec)
|
(https://systemd.io/DISCOVERABLE_PARTITIONS/)
|
||||||
is now a lot more complete. This allows booting without
|
is now a lot more complete. This allows booting without
|
||||||
/etc/fstab and without root= on the kernel command line on
|
/etc/fstab and without root= on the kernel command line on
|
||||||
systems prepared appropriately.
|
systems prepared appropriately.
|
||||||
@ -12203,7 +12203,7 @@ CHANGES WITH 198:
|
|||||||
only in conjunction with Gummiboot, but could be supported
|
only in conjunction with Gummiboot, but could be supported
|
||||||
by other boot loaders too. For details see:
|
by other boot loaders too. For details see:
|
||||||
|
|
||||||
https://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface
|
https://systemd.io/BOOT_LOADER_INTERFACE
|
||||||
|
|
||||||
* A new generator has been added that automatically mounts the
|
* A new generator has been added that automatically mounts the
|
||||||
EFI System Partition (ESP) to /boot, if that directory
|
EFI System Partition (ESP) to /boot, if that directory
|
||||||
@ -12279,7 +12279,7 @@ CHANGES WITH 198:
|
|||||||
* A new tool kernel-install has been added that can install
|
* A new tool kernel-install has been added that can install
|
||||||
kernel images according to the Boot Loader Specification:
|
kernel images according to the Boot Loader Specification:
|
||||||
|
|
||||||
https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec
|
https://systemd.io/BOOT_LOADER_SPECIFICATION
|
||||||
|
|
||||||
* Boot time console output has been improved to provide
|
* Boot time console output has been improved to provide
|
||||||
animated boot time output for hanging jobs.
|
animated boot time output for hanging jobs.
|
||||||
@ -12369,7 +12369,7 @@ CHANGES WITH 197:
|
|||||||
of these policies is now the default. Please see this wiki
|
of these policies is now the default. Please see this wiki
|
||||||
document for details:
|
document for details:
|
||||||
|
|
||||||
https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames
|
https://www.freedesktop.org/software/systemd/man/systemd.net-naming-scheme.html
|
||||||
|
|
||||||
* Auke Kok's bootchart implementation has been added to the
|
* Auke Kok's bootchart implementation has been added to the
|
||||||
systemd tree. It is an optional component that can graph the
|
systemd tree. It is an optional component that can graph the
|
||||||
@ -13368,7 +13368,7 @@ CHANGES WITH 183:
|
|||||||
|
|
||||||
* A framework for implementing offline system updates is now
|
* A framework for implementing offline system updates is now
|
||||||
integrated, for details see:
|
integrated, for details see:
|
||||||
https://www.freedesktop.org/wiki/Software/systemd/SystemUpdates
|
https://www.freedesktop.org/software/systemd/man/systemd.offline-updates.html
|
||||||
|
|
||||||
* A new service type Type=idle is available now which helps us
|
* A new service type Type=idle is available now which helps us
|
||||||
avoiding ugly interleaving of getty output and boot status
|
avoiding ugly interleaving of getty output and boot status
|
||||||
@ -13736,7 +13736,7 @@ CHANGES WITH 38:
|
|||||||
* Processes with '@' in argv[0][0] are now excluded from the
|
* Processes with '@' in argv[0][0] are now excluded from the
|
||||||
final shut-down killing spree, following the logic explained
|
final shut-down killing spree, following the logic explained
|
||||||
in:
|
in:
|
||||||
https://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
|
https://systemd.io/ROOT_STORAGE_DAEMONS/
|
||||||
|
|
||||||
* All processes remaining in a service cgroup when we enter
|
* All processes remaining in a service cgroup when we enter
|
||||||
the START or START_PRE states are now killed with
|
the START or START_PRE states are now killed with
|
||||||
|
10
README
10
README
@ -1,10 +1,7 @@
|
|||||||
systemd System and Service Manager
|
systemd System and Service Manager
|
||||||
|
|
||||||
DETAILS:
|
|
||||||
http://0pointer.de/blog/projects/systemd.html
|
|
||||||
|
|
||||||
WEB SITE:
|
WEB SITE:
|
||||||
https://www.freedesktop.org/wiki/Software/systemd
|
https://systemd.io
|
||||||
|
|
||||||
GIT:
|
GIT:
|
||||||
git@github.com:systemd/systemd.git
|
git@github.com:systemd/systemd.git
|
||||||
@ -19,6 +16,11 @@ IRC:
|
|||||||
BUG REPORTS:
|
BUG REPORTS:
|
||||||
https://github.com/systemd/systemd/issues
|
https://github.com/systemd/systemd/issues
|
||||||
|
|
||||||
|
OLDER DOCUMENTATION:
|
||||||
|
|
||||||
|
http://0pointer.de/blog/projects/systemd.html
|
||||||
|
https://www.freedesktop.org/wiki/Software/systemd
|
||||||
|
|
||||||
AUTHOR:
|
AUTHOR:
|
||||||
Lennart Poettering
|
Lennart Poettering
|
||||||
Kay Sievers
|
Kay Sievers
|
||||||
|
2
TODO
2
TODO
@ -816,7 +816,7 @@ Features:
|
|||||||
Note that we start initrd-fs.target and initrd-cleanup.target there, so a straightforward
|
Note that we start initrd-fs.target and initrd-cleanup.target there, so a straightforward
|
||||||
ConditionPathExists= is not enough.
|
ConditionPathExists= is not enough.
|
||||||
|
|
||||||
* docs: bring http://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime up to date
|
* docs: bring https://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime up to date
|
||||||
|
|
||||||
* add a job mode that will fail if a transaction would mean stopping
|
* add a job mode that will fail if a transaction would mean stopping
|
||||||
running units. Use this in timedated to manage the NTP service
|
running units. Use this in timedated to manage the NTP service
|
||||||
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
|
|||||||
# The Container Interface
|
# The Container Interface
|
||||||
|
|
||||||
Also consult [Writing Virtual Machine or Container
|
Also consult [Writing Virtual Machine or Container
|
||||||
Managers](http://www.freedesktop.org/wiki/Software/systemd/writing-vm-managers).
|
Managers](https://www.freedesktop.org/wiki/Software/systemd/writing-vm-managers).
|
||||||
|
|
||||||
systemd has a number of interfaces for interacting with container managers,
|
systemd has a number of interfaces for interacting with container managers,
|
||||||
when systemd is used inside of an OS container. If you work on a container
|
when systemd is used inside of an OS container. If you work on a container
|
||||||
|
@ -31,8 +31,8 @@ for specific uses. This has many benefits:
|
|||||||
descriptive information about partitions tables.
|
descriptive information about partitions tables.
|
||||||
|
|
||||||
Note that the OS side of this specification is currently implemented in
|
Note that the OS side of this specification is currently implemented in
|
||||||
[systemd](http://systemd.io/) 211 and newer in the
|
[systemd](https://systemd.io/) 211 and newer in the
|
||||||
[systemd-gpt-auto-generator(8)](http://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html)
|
[systemd-gpt-auto-generator(8)](https://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html)
|
||||||
generator tool. Note that automatic discovery of the root only works if the
|
generator tool. Note that automatic discovery of the root only works if the
|
||||||
boot loader communicates this information to the OS, by implementing the [Boot
|
boot loader communicates this information to the OS, by implementing the [Boot
|
||||||
Loader
|
Loader
|
||||||
@ -164,7 +164,7 @@ Other GPT type IDs might be used on Linux, for example to mark software RAID or
|
|||||||
LVM partitions. The definitions of those GPT types is outside of the scope of
|
LVM partitions. The definitions of those GPT types is outside of the scope of
|
||||||
this specification.
|
this specification.
|
||||||
|
|
||||||
[systemd-id128(1)](http://www.freedesktop.org/software/systemd/man/systemd-id128.html)'s
|
[systemd-id128(1)](https://www.freedesktop.org/software/systemd/man/systemd-id128.html)'s
|
||||||
`show` command may be used to list those GPT partition type UUIDs.
|
`show` command may be used to list those GPT partition type UUIDs.
|
||||||
|
|
||||||
## Partition Names
|
## Partition Names
|
||||||
|
@ -7,11 +7,9 @@ SPDX-License-Identifier: LGPL-2.1-or-later
|
|||||||
|
|
||||||
# Journal File Format
|
# Journal File Format
|
||||||
|
|
||||||
_Note that this document describes the binary on-disk format of journals
|
_Note that this document describes the binary on-disk format of journals only.
|
||||||
only. For interfacing with web technologies there's the [Journal JSON
|
For interfacing with web technologies there's the [Journal JSON Format](https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-json-format).
|
||||||
Format](http://www.freedesktop.org/wiki/Software/systemd/json). For transfer
|
For transfer of journal data across the network there's the [Journal Export Format](https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format)._
|
||||||
of journal data across the network there's the [Journal Export
|
|
||||||
Format](http://www.freedesktop.org/wiki/Software/systemd/export)._
|
|
||||||
|
|
||||||
The systemd journal stores log data in a binary format with several features:
|
The systemd journal stores log data in a binary format with several features:
|
||||||
|
|
||||||
@ -32,30 +30,30 @@ keep this document up-to-date and accurate.
|
|||||||
|
|
||||||
Instead of implementing your own reader or writer for journal files we ask you
|
Instead of implementing your own reader or writer for journal files we ask you
|
||||||
to use the [Journal's native C
|
to use the [Journal's native C
|
||||||
API](http://www.freedesktop.org/software/systemd/man/sd-journal.html) to access
|
API](https://www.freedesktop.org/software/systemd/man/sd-journal.html) to access
|
||||||
these files. It provides you with full access to the files, and will not
|
these files. It provides you with full access to the files, and will not
|
||||||
withhold any data. If you find a limitation, please ping us and we might add
|
withhold any data. If you find a limitation, please ping us and we might add
|
||||||
some additional interfaces for you.
|
some additional interfaces for you.
|
||||||
|
|
||||||
If you need access to the raw journal data in serialized stream form without C
|
If you need access to the raw journal data in serialized stream form without C
|
||||||
API our recommendation is to make use of the [Journal Export
|
API our recommendation is to make use of the [Journal Export
|
||||||
Format](http://www.freedesktop.org/wiki/Software/systemd/export), which you can
|
Format](https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format), which you can
|
||||||
get via "journalctl -o export" or via systemd-journal-gatewayd. The export
|
get via `journalctl -o export` or via `systemd-journal-gatewayd`. The export
|
||||||
format is much simpler to parse, but complete and accurate. Due to its
|
format is much simpler to parse, but complete and accurate. Due to its
|
||||||
stream-based nature it is not indexed.
|
stream-based nature it is not indexed.
|
||||||
|
|
||||||
_Or, to put this in other words: this low-level document is probably not what
|
_Or, to put this in other words: this low-level document is probably not what
|
||||||
you want to use as base of your project. You want our [C
|
you want to use as base of your project. You want our [C
|
||||||
API](http://www.freedesktop.org/software/systemd/man/sd-journal.html) instead!
|
API](https://www.freedesktop.org/software/systemd/man/sd-journal.html) instead!
|
||||||
And if you really don't want the C API, then you want the [Journal Export
|
And if you really don't want the C API, then you want the [Journal Export
|
||||||
Format](http://www.freedesktop.org/wiki/Software/systemd/export) instead! This
|
Format or Journal JSON Format](https://systemd.io/JOURNAL_EXPORT_FORMATS) instead!
|
||||||
document is primarily for your entertainment and education. Thank you!_
|
This document is primarily for your entertainment and education. Thank you!_
|
||||||
|
|
||||||
This document assumes you have a basic understanding of the journal concepts,
|
This document assumes you have a basic understanding of the journal concepts,
|
||||||
the properties of a journal entry and so on. If not, please go and read up,
|
the properties of a journal entry and so on. If not, please go and read up,
|
||||||
then come back! This is a good opportunity to read about the [basic properties
|
then come back! This is a good opportunity to read about the [basic properties
|
||||||
of journal
|
of journal
|
||||||
entries](http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html),
|
entries](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html),
|
||||||
in particular realize that they may include binary non-text data (though
|
in particular realize that they may include binary non-text data (though
|
||||||
usually don't), and the same field might have multiple values assigned within
|
usually don't), and the same field might have multiple values assigned within
|
||||||
the same entry.
|
the same entry.
|
||||||
|
@ -100,7 +100,7 @@ And now, here's the list of (hopefully) all APIs that we have introduced with sy
|
|||||||
| [Network](https://www.freedesktop.org/software/systemd/man/systemd.network.html) & [Netdev file format](https://www.freedesktop.org/software/systemd/man/systemd.netdev.html) | File format | yes | yes | no | no | - | no |
|
| [Network](https://www.freedesktop.org/software/systemd/man/systemd.network.html) & [Netdev file format](https://www.freedesktop.org/software/systemd/man/systemd.netdev.html) | File format | yes | yes | no | no | - | no |
|
||||||
| [Link file format](https://www.freedesktop.org/software/systemd/man/systemd.link.html) | File format | yes | yes | no | no | - | no |
|
| [Link file format](https://www.freedesktop.org/software/systemd/man/systemd.link.html) | File format | yes | yes | no | no | - | no |
|
||||||
| [Journal File Format](https://systemd.io/JOURNAL_FILE_FORMAT) | File format | yes | yes | - | maybe | - | no |
|
| [Journal File Format](https://systemd.io/JOURNAL_FILE_FORMAT) | File format | yes | yes | - | maybe | - | no |
|
||||||
| [Journal Export Format](https://www.freedesktop.org/wiki/Software/systemd/export) | File format | yes | yes | - | yes | - | no |
|
| [Journal Export Format](https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format) | File format | yes | yes | - | yes | - | no |
|
||||||
| [Cooperation in cgroup tree](https://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups) | Treaty | yes | yes | libvirt | yes | libvirt | no |
|
| [Cooperation in cgroup tree](https://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups) | Treaty | yes | yes | libvirt | yes | libvirt | no |
|
||||||
| [Password Agents](https://systemd.io/PASSWORD_AGENTS) | Socket+Files | yes | yes | - | yes | - | no |
|
| [Password Agents](https://systemd.io/PASSWORD_AGENTS) | Socket+Files | yes | yes | - | yes | - | no |
|
||||||
| [udev multi-seat properties](https://www.freedesktop.org/software/systemd/man/sd-login.html) | udev Property | yes | yes | X11, gdm | no | - | no |
|
| [udev multi-seat properties](https://www.freedesktop.org/software/systemd/man/sd-login.html) | udev Property | yes | yes | X11, gdm | no | - | no |
|
||||||
|
@ -62,7 +62,7 @@ Does this have any drawbacks? Yes, it does. Previously it was practically guaran
|
|||||||
You basically have three options:
|
You basically have three options:
|
||||||
|
|
||||||
1. You disable the assignment of fixed names, so that the unpredictable kernel names are used again. For this, simply mask udev's .link file for the default policy: `ln -s /dev/null /etc/systemd/network/99-default.link`
|
1. You disable the assignment of fixed names, so that the unpredictable kernel names are used again. For this, simply mask udev's .link file for the default policy: `ln -s /dev/null /etc/systemd/network/99-default.link`
|
||||||
1. You create your own manual naming scheme, for example by naming your interfaces `internet0`, `dmz0` or `lan0`. For that create your own `.link` files in `/etc/systemd/network/`, that choose an explicit name or a better naming scheme for one, some, or all of your interfaces. See [systemd.link(5)](http://www.freedesktop.org/software/systemd/man/systemd.link.html) for more information.
|
1. You create your own manual naming scheme, for example by naming your interfaces `internet0`, `dmz0` or `lan0`. For that create your own `.link` files in `/etc/systemd/network/`, that choose an explicit name or a better naming scheme for one, some, or all of your interfaces. See [systemd.link(5)](https://www.freedesktop.org/software/systemd/man/systemd.link.html) for more information.
|
||||||
1. You pass the `net.ifnames=0` on the kernel command line
|
1. You pass the `net.ifnames=0` on the kernel command line
|
||||||
|
|
||||||
## How does the new naming scheme look like, precisely?
|
## How does the new naming scheme look like, precisely?
|
||||||
|
@ -34,6 +34,7 @@ Most generic unit settings are available for transient units.
|
|||||||
✓ PropagatesReloadTo=
|
✓ PropagatesReloadTo=
|
||||||
✓ ReloadPropagatedFrom=
|
✓ ReloadPropagatedFrom=
|
||||||
✓ PartOf=
|
✓ PartOf=
|
||||||
|
✓ Upholds=
|
||||||
✓ JoinsNamespaceOf=
|
✓ JoinsNamespaceOf=
|
||||||
✓ RequiresMountsFor=
|
✓ RequiresMountsFor=
|
||||||
✓ StopWhenUnneeded=
|
✓ StopWhenUnneeded=
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
title: systemd
|
title: systemd
|
||||||
baseurl: "" # the subpath of your site, e.g. /blog/
|
baseurl: "" # the subpath of your site, e.g. /blog/
|
||||||
url: "http://systemd.io" # the base hostname & protocol for your site
|
url: "https://systemd.io" # the base hostname & protocol for your site
|
||||||
|
|
||||||
permalink: /:title/
|
permalink: /:title/
|
||||||
|
|
||||||
|
@ -301,7 +301,7 @@
|
|||||||
<para>serializes the journal into a binary (but mostly
|
<para>serializes the journal into a binary (but mostly
|
||||||
text-based) stream suitable for backups and network
|
text-based) stream suitable for backups and network
|
||||||
transfer (see
|
transfer (see
|
||||||
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal Export Format</ulink>
|
<ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format">Journal Export Format</ulink>
|
||||||
for more information). To import the binary stream back
|
for more information). To import the binary stream back
|
||||||
into native journald format use
|
into native journald format use
|
||||||
<citerefentry><refentrytitle>systemd-journal-remote</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
|
<citerefentry><refentrytitle>systemd-journal-remote</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
|
||||||
@ -314,7 +314,7 @@
|
|||||||
</term>
|
</term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>formats entries as JSON objects, separated by newline characters (see <ulink
|
<para>formats entries as JSON objects, separated by newline characters (see <ulink
|
||||||
url="https://www.freedesktop.org/wiki/Software/systemd/json">Journal JSON Format</ulink> for more
|
url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-json-format">Journal JSON Format</ulink> for more
|
||||||
information). Field values are generally encoded as JSON strings, with three exceptions:
|
information). Field values are generally encoded as JSON strings, with three exceptions:
|
||||||
<orderedlist>
|
<orderedlist>
|
||||||
<listitem><para>Fields larger than 4096 bytes are encoded as <constant>null</constant> values. (This
|
<listitem><para>Fields larger than 4096 bytes are encoded as <constant>null</constant> values. (This
|
||||||
|
@ -621,7 +621,7 @@ node /org/freedesktop/login1 {
|
|||||||
whether the inhibit shall be consider mandatory or whether it should just delay the operation to a
|
whether the inhibit shall be consider mandatory or whether it should just delay the operation to a
|
||||||
certain maximum time. The method returns a file descriptor. The lock is released the moment this file
|
certain maximum time. The method returns a file descriptor. The lock is released the moment this file
|
||||||
descriptor and all its duplicates are closed. For more information on the inhibition logic see
|
descriptor and all its duplicates are closed. For more information on the inhibition logic see
|
||||||
<ulink url="http://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor Locks</ulink>.
|
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor Locks</ulink>.
|
||||||
</para>
|
</para>
|
||||||
</refsect2>
|
</refsect2>
|
||||||
|
|
||||||
@ -644,7 +644,7 @@ node /org/freedesktop/login1 {
|
|||||||
that should be done shortly before shutdown/sleep, in conjunction with delay inhibitor locks. After
|
that should be done shortly before shutdown/sleep, in conjunction with delay inhibitor locks. After
|
||||||
completion of this work they should release their inhibition locks in order to not delay the operation
|
completion of this work they should release their inhibition locks in order to not delay the operation
|
||||||
any further. For more information see
|
any further. For more information see
|
||||||
<ulink url="http://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor Locks</ulink>.
|
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor Locks</ulink>.
|
||||||
</para>
|
</para>
|
||||||
</refsect2>
|
</refsect2>
|
||||||
|
|
||||||
|
@ -506,7 +506,7 @@ node /org/freedesktop/resolve1 {
|
|||||||
<filename>/etc/hosts</filename>. Moreover, it is set for all LLMNR or mDNS RRs which originate from
|
<filename>/etc/hosts</filename>. Moreover, it is set for all LLMNR or mDNS RRs which originate from
|
||||||
the local host. Applications that require authenticated RR data for operation should check this flag
|
the local host. Applications that require authenticated RR data for operation should check this flag
|
||||||
before trusting the data. Note that <filename>systemd-resolved</filename> will never return
|
before trusting the data. Note that <filename>systemd-resolved</filename> will never return
|
||||||
invalidated data, hence this flag simply allows to discern the cases where data is known to be
|
invalidated data, hence this flag simply allows one to discern the cases where data is known to be
|
||||||
trusted, or where there is proof that the data is "rightfully" unauthenticated (which includes cases
|
trusted, or where there is proof that the data is "rightfully" unauthenticated (which includes cases
|
||||||
where the underlying protocol or server does not support authenticating data).</para>
|
where the underlying protocol or server does not support authenticating data).</para>
|
||||||
|
|
||||||
|
@ -1427,7 +1427,7 @@ node /org/freedesktop/systemd1 {
|
|||||||
<varname>properties</varname> contains properties of the unit, specified like in
|
<varname>properties</varname> contains properties of the unit, specified like in
|
||||||
<function>SetUnitProperties()</function>. <varname>aux</varname> is currently unused and should be
|
<function>SetUnitProperties()</function>. <varname>aux</varname> is currently unused and should be
|
||||||
passed as an empty array. See the
|
passed as an empty array. See the
|
||||||
<ulink url="http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New Control Group
|
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New Control Group
|
||||||
Interface</ulink> for more information how to make use of this functionality for resource control
|
Interface</ulink> for more information how to make use of this functionality for resource control
|
||||||
purposes.</para>
|
purposes.</para>
|
||||||
</refsect2>
|
</refsect2>
|
||||||
@ -1649,6 +1649,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as PartOf = ['...', ...];
|
readonly as PartOf = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as Upholds = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as RequiredBy = ['...', ...];
|
readonly as RequiredBy = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as RequisiteOf = ['...', ...];
|
readonly as RequisiteOf = ['...', ...];
|
||||||
@ -1657,6 +1659,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as BoundBy = ['...', ...];
|
readonly as BoundBy = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as UpheldBy = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as ConsistsOf = ['...', ...];
|
readonly as ConsistsOf = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as Conflicts = ['...', ...];
|
readonly as Conflicts = ['...', ...];
|
||||||
@ -1667,14 +1671,14 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as After = ['...', ...];
|
readonly as After = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as OnFailure = ['...', ...];
|
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
|
||||||
readonly as OnFailureOf = ['...', ...];
|
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
|
||||||
readonly as OnSuccess = ['...', ...];
|
readonly as OnSuccess = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as OnSuccessOf = ['...', ...];
|
readonly as OnSuccessOf = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as OnFailure = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
|
readonly as OnFailureOf = ['...', ...];
|
||||||
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as Triggers = ['...', ...];
|
readonly as Triggers = ['...', ...];
|
||||||
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
|
||||||
readonly as TriggeredBy = ['...', ...];
|
readonly as TriggeredBy = ['...', ...];
|
||||||
@ -1820,16 +1824,20 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
|
|
||||||
<!--property PartOf is not documented!-->
|
<!--property PartOf is not documented!-->
|
||||||
|
|
||||||
|
<!--property Upholds is not documented!-->
|
||||||
|
|
||||||
<!--property RequisiteOf is not documented!-->
|
<!--property RequisiteOf is not documented!-->
|
||||||
|
|
||||||
<!--property ConsistsOf is not documented!-->
|
<!--property UpheldBy is not documented!-->
|
||||||
|
|
||||||
<!--property OnFailureOf is not documented!-->
|
<!--property ConsistsOf is not documented!-->
|
||||||
|
|
||||||
<!--property OnSuccess is not documented!-->
|
<!--property OnSuccess is not documented!-->
|
||||||
|
|
||||||
<!--property OnSuccessOf is not documented!-->
|
<!--property OnSuccessOf is not documented!-->
|
||||||
|
|
||||||
|
<!--property OnFailureOf is not documented!-->
|
||||||
|
|
||||||
<!--property ReloadPropagatedFrom is not documented!-->
|
<!--property ReloadPropagatedFrom is not documented!-->
|
||||||
|
|
||||||
<!--property PropagatesStopTo is not documented!-->
|
<!--property PropagatesStopTo is not documented!-->
|
||||||
@ -1948,6 +1956,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="PartOf"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="PartOf"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="Upholds"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="RequiredBy"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="RequiredBy"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="RequisiteOf"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="RequisiteOf"/>
|
||||||
@ -1956,6 +1966,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="BoundBy"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="BoundBy"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="UpheldBy"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="ConsistsOf"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="ConsistsOf"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="Conflicts"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="Conflicts"/>
|
||||||
@ -1966,14 +1978,14 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
|
|||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="After"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="After"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="OnFailure"/>
|
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="OnFailureOf"/>
|
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="OnSuccess"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="OnSuccess"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="OnSuccessOf"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="OnSuccessOf"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="OnFailure"/>
|
||||||
|
|
||||||
|
<variablelist class="dbus-property" generated="True" extra-ref="OnFailureOf"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="Triggers"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="Triggers"/>
|
||||||
|
|
||||||
<variablelist class="dbus-property" generated="True" extra-ref="TriggeredBy"/>
|
<variablelist class="dbus-property" generated="True" extra-ref="TriggeredBy"/>
|
||||||
|
@ -962,6 +962,7 @@ manpages = [
|
|||||||
['systemd-sleep.conf', '5', ['sleep.conf.d'], ''],
|
['systemd-sleep.conf', '5', ['sleep.conf.d'], ''],
|
||||||
['systemd-socket-activate', '1', [], ''],
|
['systemd-socket-activate', '1', [], ''],
|
||||||
['systemd-socket-proxyd', '8', [], ''],
|
['systemd-socket-proxyd', '8', [], ''],
|
||||||
|
['systemd-stdio-bridge', '1', [], ''],
|
||||||
['systemd-stub',
|
['systemd-stub',
|
||||||
'7',
|
'7',
|
||||||
['linuxaa64.efi.stub', 'linuxia32.efi.stub', 'linuxx64.efi.stub'],
|
['linuxaa64.efi.stub', 'linuxia32.efi.stub', 'linuxx64.efi.stub'],
|
||||||
|
@ -172,7 +172,23 @@
|
|||||||
<para>On success, these functions return a non-negative integer. On failure, they return a negative
|
<para>On success, these functions return a non-negative integer. On failure, they return a negative
|
||||||
errno-style error code.</para>
|
errno-style error code.</para>
|
||||||
|
|
||||||
<xi:include href="sd_bus_message_read_basic.xml" xpointer="errors" />
|
<refsect2 id='errors'>
|
||||||
|
<title>Errors</title>
|
||||||
|
|
||||||
|
<para>Returned errors may indicate the following problems:</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<xi:include href="sd_bus_message_read_basic.xml" xpointer="errors-einval"/>
|
||||||
|
<xi:include href="sd_bus_message_read_basic.xml" xpointer="errors-enxio"/>
|
||||||
|
<xi:include href="sd_bus_message_read_basic.xml" xpointer="errors-ebadmsg"/>
|
||||||
|
<varlistentry>
|
||||||
|
<term><constant>-EBUSY</constant></term>
|
||||||
|
|
||||||
|
<listitem><para>When reading from a container, this error will be returned if unread elements
|
||||||
|
are left in the container.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect2>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<xi:include href="libsystemd-pkgconfig.xml" />
|
<xi:include href="libsystemd-pkgconfig.xml" />
|
||||||
|
@ -199,21 +199,21 @@
|
|||||||
<para>Returned errors may indicate the following problems:</para>
|
<para>Returned errors may indicate the following problems:</para>
|
||||||
|
|
||||||
<variablelist>
|
<variablelist>
|
||||||
<varlistentry>
|
<varlistentry id="errors-einval">
|
||||||
<term><constant>-EINVAL</constant></term>
|
<term><constant>-EINVAL</constant></term>
|
||||||
|
|
||||||
<listitem><para>Specified type string is invalid or the message parameter is
|
<listitem><para>Specified type string is invalid or the message parameter is
|
||||||
<constant>NULL</constant>.</para></listitem>
|
<constant>NULL</constant>.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry id="errors-enxio">
|
||||||
<term><constant>-ENXIO</constant></term>
|
<term><constant>-ENXIO</constant></term>
|
||||||
|
|
||||||
<listitem><para>The message does not contain the specified type at current position.
|
<listitem><para>The message does not contain the specified type at current position.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry id="errors-ebadmsg">
|
||||||
<term><constant>-EBADMSG</constant></term>
|
<term><constant>-EBADMSG</constant></term>
|
||||||
|
|
||||||
<listitem><para>The message cannot be parsed.</para></listitem>
|
<listitem><para>The message cannot be parsed.</para></listitem>
|
||||||
|
@ -141,7 +141,7 @@
|
|||||||
specification, informing the receiving side that the caller is prepared to wait for interactive
|
specification, informing the receiving side that the caller is prepared to wait for interactive
|
||||||
authorization, which might take a considerable time to complete. If this flag is set, the user
|
authorization, which might take a considerable time to complete. If this flag is set, the user
|
||||||
may be queried for passwords or confirmation via
|
may be queried for passwords or confirmation via
|
||||||
<ulink url="http://www.freedesktop.org/wiki/Software/polkit">polkit</ulink> or a similar
|
<ulink url="https://www.freedesktop.org/wiki/Software/polkit">polkit</ulink> or a similar
|
||||||
framework.</para>
|
framework.</para>
|
||||||
|
|
||||||
<para><function>sd_bus_get_allow_interactive_authorization()</function> returns true if
|
<para><function>sd_bus_get_allow_interactive_authorization()</function> returns true if
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
<para>It is also possible to invoke <command>systemd-coredump</command> with
|
<para>It is also possible to invoke <command>systemd-coredump</command> with
|
||||||
<option>--backtrace</option> option. In this case, <command>systemd-coredump</command> expects a
|
<option>--backtrace</option> option. In this case, <command>systemd-coredump</command> expects a
|
||||||
journal entry in the journal
|
journal entry in the journal
|
||||||
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal Export Format</ulink>
|
<ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format">Journal Export Format</ulink>
|
||||||
on standard input. The entry should contain a <varname>MESSAGE=</varname> field and any additional
|
on standard input. The entry should contain a <varname>MESSAGE=</varname> field and any additional
|
||||||
metadata fields the caller deems reasonable. <command>systemd-coredump</command> will append additional
|
metadata fields the caller deems reasonable. <command>systemd-coredump</command> will append additional
|
||||||
metadata fields in the same way it does for core dumps received from the kernel. In this mode, no core
|
metadata fields in the same way it does for core dumps received from the kernel. In this mode, no core
|
||||||
|
@ -212,9 +212,8 @@
|
|||||||
<listitem><para>Entries are formatted as JSON data structures,
|
<listitem><para>Entries are formatted as JSON data structures,
|
||||||
one per line
|
one per line
|
||||||
(like <command>journalctl --output json</command>).
|
(like <command>journalctl --output json</command>).
|
||||||
See <ulink
|
See <ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-json-format">Journal JSON Format</ulink>
|
||||||
url="https://www.freedesktop.org/wiki/Software/systemd/json">Journal
|
for more information.</para>
|
||||||
JSON Format</ulink> for more information.</para>
|
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
@ -233,13 +232,10 @@
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><constant>application/vnd.fdo.journal</constant></term>
|
<term><constant>application/vnd.fdo.journal</constant></term>
|
||||||
|
|
||||||
<listitem><para>Entries are serialized into a binary (but
|
<listitem><para>Entries are serialized into a binary (but mostly text-based) stream suitable for
|
||||||
mostly text-based) stream suitable for backups and network
|
backups and network transfer (like <command>journalctl --output export</command>). See <ulink
|
||||||
transfer
|
url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format">Journal Export Format</ulink>
|
||||||
(like <command>journalctl --output export</command>).
|
for more information.</para>
|
||||||
See <ulink
|
|
||||||
url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal
|
|
||||||
Export Format</ulink> for more information.</para>
|
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
@ -303,10 +299,8 @@
|
|||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
<title>Examples</title>
|
<title>Examples</title>
|
||||||
<para>Retrieve events from this boot from local journal
|
<para>Retrieve events from this boot from local journal in
|
||||||
in <ulink
|
<ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format">Journal Export Format</ulink>:
|
||||||
url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal
|
|
||||||
Export Format</ulink>:
|
|
||||||
<programlisting>curl --silent -H'Accept: application/vnd.fdo.journal' \
|
<programlisting>curl --silent -H'Accept: application/vnd.fdo.journal' \
|
||||||
'http://localhost:19531/entries?boot'</programlisting>
|
'http://localhost:19531/entries?boot'</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
<para><command>systemd-journal-remote</command> is a command to receive serialized journal
|
<para><command>systemd-journal-remote</command> is a command to receive serialized journal
|
||||||
events and store them to journal files. Input streams are in the
|
events and store them to journal files. Input streams are in the
|
||||||
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal Export Format</ulink>,
|
<ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format">Journal Export Format</ulink>,
|
||||||
i.e. like the output from <command>journalctl --output=export</command>. For transport over the
|
i.e. like the output from <command>journalctl --output=export</command>. For transport over the
|
||||||
network, this serialized stream is usually carried over an HTTPS connection.</para>
|
network, this serialized stream is usually carried over an HTTPS connection.</para>
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
used.</para></listitem>
|
used.</para></listitem>
|
||||||
|
|
||||||
<listitem><para>Providing <ulink
|
<listitem><para>Providing <ulink
|
||||||
url="http://www.freedesktop.org/wiki/Software/polkit">polkit</ulink>-based
|
url="https://www.freedesktop.org/wiki/Software/polkit">polkit</ulink>-based
|
||||||
access for users for operations such as system shutdown or sleep</para>
|
access for users for operations such as system shutdown or sleep</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
@ -92,7 +92,7 @@
|
|||||||
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/writing-display-managers">Writing Display
|
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/writing-display-managers">Writing Display
|
||||||
Managers</ulink>.
|
Managers</ulink>.
|
||||||
If you are interested in writing a desktop environment that makes use of logind, please have look at
|
If you are interested in writing a desktop environment that makes use of logind, please have look at
|
||||||
<ulink url="http://www.freedesktop.org/wiki/Software/systemd/writing-desktop-environments">Writing
|
<ulink url="https://www.freedesktop.org/wiki/Software/systemd/writing-desktop-environments">Writing
|
||||||
Desktop Environments</ulink>.</para>
|
Desktop Environments</ulink>.</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
92
man/systemd-stdio-bridge.xml
Normal file
92
man/systemd-stdio-bridge.xml
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?xml version='1.0'?> <!--*-nxml-*-->
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||||||
|
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
|
||||||
|
|
||||||
|
<refentry id="systemd-stdio-bridge"
|
||||||
|
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||||
|
|
||||||
|
<refentryinfo>
|
||||||
|
<title>systemd-stdio-bridge</title>
|
||||||
|
<productname>systemd</productname>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>systemd-stdio-bridge</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>systemd-stdio-bridge</refname>
|
||||||
|
<refpurpose>D-Bus proxy</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>systemd-stdio-bridge</command>
|
||||||
|
<arg choice="opt" rep="repeat">OPTIONS</arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para><command>systemd-stdio-bridge</command> implements a proxy for a D-Bus endpoint. It expects to
|
||||||
|
receive an open connection to a bus when started, and will also connect to a (different) bus as a
|
||||||
|
client. It will then act as a server on the first connection, and forward messages between the two
|
||||||
|
busses. This program is suitable for socket activation: the first connection may be a pipe or a socket
|
||||||
|
and must be passed as either standard input, or as an open file descriptor according to the protocol
|
||||||
|
described in
|
||||||
|
<citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>. The
|
||||||
|
second connection will be made by default to the local system bus, but this can be influenced by the
|
||||||
|
<option>--user</option>, <option>--system</option>, <option>--machine=</option>, and
|
||||||
|
<option>--bus-path=</option> options described below.</para>
|
||||||
|
|
||||||
|
<para><citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry> uses
|
||||||
|
<command>systemd-stdio-bridge</command> to forward D-Bus connections over
|
||||||
|
<citerefentry project='die-net'><refentrytitle>ssh</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
or to connect to the bus of a different user, see
|
||||||
|
<citerefentry><refentrytitle>sd_bus_set_address</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Options</title>
|
||||||
|
|
||||||
|
<para>The following options are understood:</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<xi:include href="user-system-options.xml" xpointer="user" />
|
||||||
|
<xi:include href="user-system-options.xml" xpointer="system" />
|
||||||
|
<xi:include href="user-system-options.xml" xpointer="machine" />
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-p <replaceable>PATH</replaceable></option></term>
|
||||||
|
<term><option>--bus-path=<replaceable>PATH</replaceable></option></term>
|
||||||
|
|
||||||
|
<listitem><para>Path to the bus address. Default: <literal>unix:path=/run/dbus/system_bus_socket</literal>
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<xi:include href="standard-options.xml" xpointer="help" />
|
||||||
|
<xi:include href="standard-options.xml" xpointer="version" />
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Exit status</title>
|
||||||
|
|
||||||
|
<para>On success, 0 is returned, a non-zero failure code otherwise.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See Also</title>
|
||||||
|
<para>
|
||||||
|
<citerefentry project='dbus'><refentrytitle>dbus-daemon</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry project='dbus'><refentrytitle>dbus-broker</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<ulink url="https://www.freedesktop.org/wiki/Software/dbus">D-Bus</ulink>,
|
||||||
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
@ -41,6 +41,55 @@
|
|||||||
<citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>
|
||||||
for more details.</para>
|
for more details.</para>
|
||||||
|
|
||||||
|
<para>XDG autostart may be conditionalized using both standardized and non-standardized keys.
|
||||||
|
In order to handle these, the generator may create one or more <varname>ExecCondition=</varname> entries.
|
||||||
|
For non-standardized keys, well-known helper binaries provided by Desktop Environments are used.
|
||||||
|
All external helpers <emphasis>must</emphasis> detect their corresponding desktop environment and
|
||||||
|
<emphasis>must</emphasis> return success when run in a different environment.
|
||||||
|
This is important as all <varname>ExecCondition=</varname> directives must succeed for an application to be started.</para>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<title>
|
||||||
|
Special XDG desktop file entries that are processed
|
||||||
|
</title>
|
||||||
|
<tgroup cols='2'>
|
||||||
|
<colspec colname='entry' />
|
||||||
|
<colspec colname='handling' />
|
||||||
|
<thead>
|
||||||
|
<row>
|
||||||
|
<entry>Entry</entry>
|
||||||
|
<entry>Handling</entry>
|
||||||
|
</row>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<row>
|
||||||
|
<entry><varname>Hidden=</varname>, <varname>X-systemd-skip=</varname></entry>
|
||||||
|
<entry>No service will be generated if set to true</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><varname>OnlyShowIn=</varname>, <varname>NotShowIn=</varname></entry>
|
||||||
|
<entry><varname>ExecCondition=</varname> using <filename>systemd-xdg-autostart-condition</filename></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><varname>TryExec=</varname></entry>
|
||||||
|
<entry>No service will be generated if the binary does not exist or cannot be executed</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><varname>AutostartCondition=</varname> (GNOME extension)</entry>
|
||||||
|
<entry><varname>ExecCondition=</varname> using <filename>gnome-systemd-autostart-condition</filename></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><varname>X-GNOME-Autostart-Phase=</varname></entry>
|
||||||
|
<entry>No service will be generated if set to any value</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><varname>X-KDE-autostart-condition=</varname></entry>
|
||||||
|
<entry><varname>ExecCondition=</varname> using <filename>kde-systemd-start-condition</filename></entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
|
||||||
<para><filename>systemd-xdg-autostart-generator</filename> implements
|
<para><filename>systemd-xdg-autostart-generator</filename> implements
|
||||||
<citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
|
<citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
@ -515,11 +515,10 @@
|
|||||||
<title>Address Fields</title>
|
<title>Address Fields</title>
|
||||||
|
|
||||||
<para>During serialization into external formats, such as the
|
<para>During serialization into external formats, such as the
|
||||||
<ulink
|
<ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-export-format">Journal Export Format</ulink>
|
||||||
url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal
|
or the
|
||||||
Export Format</ulink> or the <ulink
|
<ulink url="https://systemd.io/JOURNAL_EXPORT_FORMATS#journal-json-format">Journal JSON Format</ulink>,
|
||||||
url="https://www.freedesktop.org/wiki/Software/systemd/json">Journal
|
the addresses of journal entries are
|
||||||
JSON Format</ulink>, the addresses of journal entries are
|
|
||||||
serialized into fields prefixed with double underscores. Note that
|
serialized into fields prefixed with double underscores. Note that
|
||||||
these are not proper fields when stored in the journal but for
|
these are not proper fields when stored in the journal but for
|
||||||
addressing metadata of entries. They cannot be written as part of
|
addressing metadata of entries. They cannot be written as part of
|
||||||
|
@ -1566,14 +1566,14 @@
|
|||||||
<term><varname>RouteTable=</varname></term>
|
<term><varname>RouteTable=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>The table identifier for the routes to the addresses specified in the
|
<para>The table identifier for the routes to the addresses specified in the
|
||||||
<varname>AllowedIPs=</varname>. Takes the special value <literal>off</literal>, one of the
|
<varname>AllowedIPs=</varname>. Takes a negative boolean value, one of the predefined names
|
||||||
predefined names <literal>default</literal>, <literal>main</literal>, and
|
<literal>default</literal>, <literal>main</literal>, and <literal>local</literal>, names
|
||||||
<literal>local</literal>, names defined in <varname>RouteTable=</varname> in
|
defined in <varname>RouteTable=</varname> in
|
||||||
<citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
or a number in the range 1…4294967295. When <literal>off</literal> the routes to the
|
or a number in the range 1…4294967295. When <literal>off</literal> the routes to the
|
||||||
addresses specified in the <varname>AllowedIPs=</varname> setting will not be configured.
|
addresses specified in the <varname>AllowedIPs=</varname> setting will not be configured.
|
||||||
Defaults to <literal>main</literal>. This setting will be ignored when the same setting is
|
Defaults to false. This setting will be ignored when the same setting is specified in the
|
||||||
specified in the [WireGuardPeer] section.</para>
|
[WireGuardPeer] section.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
@ -1673,9 +1673,9 @@
|
|||||||
<term><varname>RouteTable=</varname></term>
|
<term><varname>RouteTable=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>The table identifier for the routes to the addresses specified in the
|
<para>The table identifier for the routes to the addresses specified in the
|
||||||
<varname>AllowedIPs=</varname>. Takes the special value <literal>off</literal>, one of the
|
<varname>AllowedIPs=</varname>. Takes a negative boolean value, one of the predefined names
|
||||||
predefined names <literal>default</literal>, <literal>main</literal>, and
|
<literal>default</literal>, <literal>main</literal>, and <literal>local</literal>, names
|
||||||
<literal>local</literal>, names defined in <varname>RouteTable=</varname> in
|
defined in <varname>RouteTable=</varname> in
|
||||||
<citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
or a number in the range 1…4294967295. Defaults to unset, and the value specified in the
|
or a number in the range 1…4294967295. Defaults to unset, and the value specified in the
|
||||||
same setting in the [WireGuard] section will be used.</para>
|
same setting in the [WireGuard] section will be used.</para>
|
||||||
@ -2064,7 +2064,7 @@
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>HopPenalty=</varname></term>
|
<term><varname>HopPenalty=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>The hop penalty setting allows to modify
|
<para>The hop penalty setting allows one to modify
|
||||||
<citerefentry project='mankier'><refentrytitle>batctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
<citerefentry project='mankier'><refentrytitle>batctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
preference for multihop routes vs. short routes. This integer value is applied to the
|
preference for multihop routes vs. short routes. This integer value is applied to the
|
||||||
TQ (Transmit Quality) of each forwarded OGM (Originator Message), thereby propagating the
|
TQ (Transmit Quality) of each forwarded OGM (Originator Message), thereby propagating the
|
||||||
|
@ -362,7 +362,7 @@
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>Trust=</varname></term>
|
<term><varname>Trust=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Takes a boolean. Allows to set trust mode of the virtual function (VF). When set, VF
|
<para>Takes a boolean. Allows one to set trust mode of the virtual function (VF). When set, VF
|
||||||
users can set a specific feature which may impact security and/or performance. When unset,
|
users can set a specific feature which may impact security and/or performance. When unset,
|
||||||
the kernel's default will be used.</para>
|
the kernel's default will be used.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
@ -371,7 +371,7 @@
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>LinkState=</varname></term>
|
<term><varname>LinkState=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Allows to set the link state of the virtual function (VF). Takes a boolean or a
|
<para>Allows one to set the link state of the virtual function (VF). Takes a boolean or a
|
||||||
special value <literal>auto</literal>. Setting to <literal>auto</literal> means a
|
special value <literal>auto</literal>. Setting to <literal>auto</literal> means a
|
||||||
reflection of the physical function (PF) link state, <literal>yes</literal> lets the VF to
|
reflection of the physical function (PF) link state, <literal>yes</literal> lets the VF to
|
||||||
communicate with other VFs on this host even if the PF link state is down,
|
communicate with other VFs on this host even if the PF link state is down,
|
||||||
@ -2038,7 +2038,7 @@ Table=1234</programlisting></para>
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>FallbackLeaseLifetimeSec=</varname></term>
|
<term><varname>FallbackLeaseLifetimeSec=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Allows to set DHCPv4 lease lifetime when DHCPv4 server does not send the lease
|
<para>Allows one to set DHCPv4 lease lifetime when DHCPv4 server does not send the lease
|
||||||
lifetime. Takes one of <literal>forever</literal> or <literal>infinity</literal>. If
|
lifetime. Takes one of <literal>forever</literal> or <literal>infinity</literal>. If
|
||||||
specified, the acquired address never expires. Defaults to unset.</para>
|
specified, the acquired address never expires. Defaults to unset.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
@ -3234,7 +3234,7 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
|
|||||||
<term><varname>SyncJumpWidth=</varname></term>
|
<term><varname>SyncJumpWidth=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Specifies the time quanta, propagation segment, phase buffer segment 1 and 2, and the
|
<para>Specifies the time quanta, propagation segment, phase buffer segment 1 and 2, and the
|
||||||
synchronization jump width, which allow to define the CAN bit-timing in a hardware
|
synchronization jump width, which allow one to define the CAN bit-timing in a hardware
|
||||||
independent format as proposed by the Bosch CAN 2.0 Specification.
|
independent format as proposed by the Bosch CAN 2.0 Specification.
|
||||||
<varname>TimeQuantaNSec=</varname> takes a timespan in nanoseconds.
|
<varname>TimeQuantaNSec=</varname> takes a timespan in nanoseconds.
|
||||||
<varname>PropagationSegment=</varname>, <varname>PhaseBufferSegment1=</varname>,
|
<varname>PropagationSegment=</varname>, <varname>PhaseBufferSegment1=</varname>,
|
||||||
|
@ -1189,14 +1189,9 @@ static bool should_parse_proc_cmdline(void) {
|
|||||||
return getpid_cached() == p;
|
return getpid_cached() == p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_parse_environment(void) {
|
void log_parse_environment_variables(void) {
|
||||||
const char *e;
|
const char *e;
|
||||||
|
|
||||||
/* Do not call from library code. */
|
|
||||||
|
|
||||||
if (should_parse_proc_cmdline())
|
|
||||||
(void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
|
|
||||||
|
|
||||||
e = getenv("SYSTEMD_LOG_TARGET");
|
e = getenv("SYSTEMD_LOG_TARGET");
|
||||||
if (e && log_set_target_from_string(e) < 0)
|
if (e && log_set_target_from_string(e) < 0)
|
||||||
log_warning("Failed to parse log target '%s'. Ignoring.", e);
|
log_warning("Failed to parse log target '%s'. Ignoring.", e);
|
||||||
@ -1222,6 +1217,15 @@ void log_parse_environment(void) {
|
|||||||
log_warning("Failed to parse log tid '%s'. Ignoring.", e);
|
log_warning("Failed to parse log tid '%s'. Ignoring.", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void log_parse_environment(void) {
|
||||||
|
/* Do not call from library code. */
|
||||||
|
|
||||||
|
if (should_parse_proc_cmdline())
|
||||||
|
(void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
|
||||||
|
|
||||||
|
log_parse_environment_variables();
|
||||||
|
}
|
||||||
|
|
||||||
LogTarget log_get_target(void) {
|
LogTarget log_get_target(void) {
|
||||||
return log_target;
|
return log_target;
|
||||||
}
|
}
|
||||||
|
@ -82,6 +82,7 @@ int log_open(void);
|
|||||||
void log_close(void);
|
void log_close(void);
|
||||||
void log_forget_fds(void);
|
void log_forget_fds(void);
|
||||||
|
|
||||||
|
void log_parse_environment_variables(void);
|
||||||
void log_parse_environment(void);
|
void log_parse_environment(void);
|
||||||
|
|
||||||
int log_dispatch_internal(
|
int log_dispatch_internal(
|
||||||
|
@ -1382,6 +1382,39 @@ static void print_yes_no_line(bool first, bool good, const char *name) {
|
|||||||
name);
|
name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int are_we_installed(void) {
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = acquire_esp(/* privileged_mode= */ false, /* graceful= */ false, NULL, NULL, NULL, NULL);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
/* Tests whether systemd-boot is installed. It's not obvious what to use as check here: we could
|
||||||
|
* check EFI variables, we could check what binary /EFI/BOOT/BOOT*.EFI points to, or whether the
|
||||||
|
* loader entries directory exists. Here we opted to check whether /EFI/systemd/ is non-empty, which
|
||||||
|
* should be a suitable and very minimal check for a number of reasons:
|
||||||
|
*
|
||||||
|
* → The check is architecture independent (i.e. we check if any systemd-boot loader is installed,
|
||||||
|
* not a specific one.)
|
||||||
|
*
|
||||||
|
* → It doesn't assume we are the only boot loader (i.e doesn't check if we own the main
|
||||||
|
* /EFI/BOOT/BOOT*.EFI fallback binary.
|
||||||
|
*
|
||||||
|
* → It specifically checks for systemd-boot, not for other boot loaders (which a check for
|
||||||
|
* /boot/loader/entries would do). */
|
||||||
|
|
||||||
|
_cleanup_free_ char *p = path_join(arg_esp_path, "/EFI/systemd/");
|
||||||
|
if (!p)
|
||||||
|
return log_oom();
|
||||||
|
|
||||||
|
log_debug("Checking whether %s contains any files…", p);
|
||||||
|
r = dir_is_empty(p);
|
||||||
|
if (r < 0 && r != -ENOENT)
|
||||||
|
return log_error_errno(r, "Failed to check whether %s contains any files: %m", p);
|
||||||
|
|
||||||
|
return r == 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int verb_status(int argc, char *argv[], void *userdata) {
|
static int verb_status(int argc, char *argv[], void *userdata) {
|
||||||
sd_id128_t esp_uuid = SD_ID128_NULL, xbootldr_uuid = SD_ID128_NULL;
|
sd_id128_t esp_uuid = SD_ID128_NULL, xbootldr_uuid = SD_ID128_NULL;
|
||||||
int r, k;
|
int r, k;
|
||||||
@ -1758,6 +1791,17 @@ static int verb_install(int argc, char *argv[], void *userdata) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
if (!install) {
|
||||||
|
/* If we are updating, don't do anything if sd-boot wasn't actually installed. */
|
||||||
|
r = are_we_installed();
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
if (r == 0) {
|
||||||
|
log_debug("Skipping update because sd-boot is not installed in the ESP.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
r = acquire_xbootldr(/* unprivileged_mode= */ false, NULL);
|
r = acquire_xbootldr(/* unprivileged_mode= */ false, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
@ -1880,41 +1924,19 @@ static int verb_remove(int argc, char *argv[], void *userdata) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int verb_is_installed(int argc, char *argv[], void *userdata) {
|
static int verb_is_installed(int argc, char *argv[], void *userdata) {
|
||||||
_cleanup_free_ char *p = NULL;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = acquire_esp(/* privileged_mode= */ false, /* graceful= */ false, NULL, NULL, NULL, NULL);
|
r = are_we_installed();
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
/* Tests whether systemd-boot is installed. It's not obvious what to use as check here: we could
|
if (r > 0) {
|
||||||
* check EFI variables, we could check what binary /EFI/BOOT/BOOT*.EFI points to, or whether the
|
puts("yes");
|
||||||
* loader entries directory exists. Here we opted to check whether /EFI/systemd/ is non-empty, which
|
return EXIT_SUCCESS;
|
||||||
* should be a suitable and very minimal check for a number of reasons:
|
} else {
|
||||||
*
|
|
||||||
* → The check is architecture independent (i.e. we check if any systemd-boot loader is installed, not a
|
|
||||||
* specific one.)
|
|
||||||
*
|
|
||||||
* → It doesn't assume we are the only boot loader (i.e doesn't check if we own the main
|
|
||||||
* /EFI/BOOT/BOOT*.EFI fallback binary.
|
|
||||||
*
|
|
||||||
* → It specifically checks for systemd-boot, not for other boot loaders (which a check for
|
|
||||||
* /boot/loader/entries would do). */
|
|
||||||
|
|
||||||
p = path_join(arg_esp_path, "/EFI/systemd/");
|
|
||||||
if (!p)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
r = dir_is_empty(p);
|
|
||||||
if (r > 0 || r == -ENOENT) {
|
|
||||||
puts("no");
|
puts("no");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to detect whether systemd-boot is installed: %m");
|
|
||||||
|
|
||||||
puts("yes");
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_timeout(const char *arg1, char16_t **ret_timeout, size_t *ret_timeout_size) {
|
static int parse_timeout(const char *arg1, char16_t **ret_timeout, size_t *ret_timeout_size) {
|
||||||
|
@ -1572,7 +1572,7 @@ static void config_load_entries(
|
|||||||
_cleanup_freepool_ CHAR8 *content = NULL;
|
_cleanup_freepool_ CHAR8 *content = NULL;
|
||||||
|
|
||||||
err = readdir_harder(entries_dir, &f, &f_size);
|
err = readdir_harder(entries_dir, &f, &f_size);
|
||||||
if (f_size == 0 || EFI_ERROR(err))
|
if (EFI_ERROR(err) || !f)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (f->FileName[0] == '.')
|
if (f->FileName[0] == '.')
|
||||||
@ -2007,7 +2007,7 @@ static void config_entry_add_linux(
|
|||||||
CHAR8 *key, *value;
|
CHAR8 *key, *value;
|
||||||
|
|
||||||
err = readdir_harder(linux_dir, &f, &f_size);
|
err = readdir_harder(linux_dir, &f, &f_size);
|
||||||
if (f_size == 0 || EFI_ERROR(err))
|
if (EFI_ERROR(err) || !f)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (f->FileName[0] == '.')
|
if (f->FileName[0] == '.')
|
||||||
@ -2341,7 +2341,7 @@ static void config_load_all_entries(
|
|||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
||||||
_cleanup_freepool_ EFI_LOADED_IMAGE *loaded_image = NULL;
|
EFI_LOADED_IMAGE *loaded_image;
|
||||||
_cleanup_(FileHandleClosep) EFI_FILE *root_dir = NULL;
|
_cleanup_(FileHandleClosep) EFI_FILE *root_dir = NULL;
|
||||||
_cleanup_(config_free) Config config = {};
|
_cleanup_(config_free) Config config = {};
|
||||||
CHAR16 *loaded_image_path;
|
CHAR16 *loaded_image_path;
|
||||||
|
@ -118,13 +118,14 @@ static EFIAPI EFI_STATUS security_policy_authentication (const EFI_SECURITY_PROT
|
|||||||
if (!dev_path)
|
if (!dev_path)
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
status = BS->LocateDevicePath(&FileSystemProtocol, &dev_path, &h);
|
EFI_DEVICE_PATH *dp = dev_path;
|
||||||
|
status = BS->LocateDevicePath(&FileSystemProtocol, &dp, &h);
|
||||||
if (EFI_ERROR(status))
|
if (EFI_ERROR(status))
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
/* No need to check return value, this already happened in efi_main() */
|
/* No need to check return value, this already happened in efi_main() */
|
||||||
root = LibOpenRoot(h);
|
root = LibOpenRoot(h);
|
||||||
dev_path_str = DevicePathToStr(dev_path);
|
dev_path_str = DevicePathToStr(dp);
|
||||||
if (!dev_path_str)
|
if (!dev_path_str)
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
|
@ -596,7 +596,12 @@ EFI_STATUS readdir_harder(
|
|||||||
* the specified buffer needs to be freed by caller, after final use. */
|
* the specified buffer needs to be freed by caller, after final use. */
|
||||||
|
|
||||||
if (!*buffer) {
|
if (!*buffer) {
|
||||||
sz = offsetof(EFI_FILE_INFO, FileName) /* + 256 */;
|
/* Some broken firmware violates the EFI spec by still advancing the readdir
|
||||||
|
* position when returning EFI_BUFFER_TOO_SMALL, effectively skipping over any files when
|
||||||
|
* the buffer was too small. Therefore, start with a buffer that should handle FAT32 max
|
||||||
|
* file name length.
|
||||||
|
* As a side effect, most readdir_harder() calls will now be slightly faster. */
|
||||||
|
sz = sizeof(EFI_FILE_INFO) + 256 * sizeof(CHAR16);
|
||||||
*buffer = xallocate_pool(sz);
|
*buffer = xallocate_pool(sz);
|
||||||
*buffer_size = sz;
|
*buffer_size = sz;
|
||||||
} else
|
} else
|
||||||
|
@ -286,7 +286,8 @@ EFI_STATUS xbootldr_open(EFI_HANDLE *device, EFI_HANDLE *ret_device, EFI_FILE **
|
|||||||
hd->SignatureType = SIGNATURE_TYPE_GUID;
|
hd->SignatureType = SIGNATURE_TYPE_GUID;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = BS->LocateDevicePath(&BlockIoProtocol, &partition_path, &new_device);
|
EFI_DEVICE_PATH *dp = partition_path;
|
||||||
|
err = BS->LocateDevicePath(&BlockIoProtocol, &dp, &new_device);
|
||||||
if (EFI_ERROR(err))
|
if (EFI_ERROR(err))
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -872,19 +872,21 @@ const sd_bus_vtable bus_unit_vtable[] = {
|
|||||||
SD_BUS_PROPERTY("Wants", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("Wants", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("BindsTo", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("BindsTo", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("PartOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("PartOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("Upholds", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("RequiredBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("RequiredBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("RequisiteOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("RequisiteOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("WantedBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("WantedBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("BoundBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("BoundBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("UpheldBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("ConsistsOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("ConsistsOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("Conflicts", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("Conflicts", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("ConflictedBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("ConflictedBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("Before", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("Before", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("After", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("After", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("OnFailure", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
|
||||||
SD_BUS_PROPERTY("OnFailureOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
|
||||||
SD_BUS_PROPERTY("OnSuccess", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("OnSuccess", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("OnSuccessOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("OnSuccessOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("OnFailure", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
|
SD_BUS_PROPERTY("OnFailureOf", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("Triggers", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("Triggers", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("TriggeredBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("TriggeredBy", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
SD_BUS_PROPERTY("PropagatesReloadTo", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_PROPERTY("PropagatesReloadTo", "as", property_get_dependencies, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
@ -1312,11 +1314,15 @@ static int append_cgroup(sd_bus_message *reply, const char *p, Set *pids) {
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
|
/* libvirt / qemu uses threaded mode and cgroup.procs cannot be read at the lower levels.
|
||||||
|
* From https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#threads,
|
||||||
|
* “cgroup.procs” in a threaded domain cgroup contains the PIDs of all processes in
|
||||||
|
* the subtree and is not readable in the subtree proper. */
|
||||||
r = cg_read_pid(f, &pid);
|
r = cg_read_pid(f, &pid);
|
||||||
|
if (IN_SET(r, 0, -EOPNOTSUPP))
|
||||||
|
break;
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
if (r == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (is_kernel_thread(pid) > 0)
|
if (is_kernel_thread(pid) > 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.systemd1.reply-password">
|
<action id="org.freedesktop.systemd1.reply-password">
|
||||||
<description gettext-domain="systemd">Send passphrase back to system</description>
|
<description gettext-domain="systemd">Send passphrase back to system</description>
|
||||||
|
@ -19,9 +19,12 @@ static struct restrict_ifaces_bpf *restrict_ifaces_bpf_free(struct restrict_ifac
|
|||||||
|
|
||||||
DEFINE_TRIVIAL_CLEANUP_FUNC(struct restrict_ifaces_bpf *, restrict_ifaces_bpf_free);
|
DEFINE_TRIVIAL_CLEANUP_FUNC(struct restrict_ifaces_bpf *, restrict_ifaces_bpf_free);
|
||||||
|
|
||||||
static int prepare_restrict_ifaces_bpf(Unit* u, bool is_allow_list,
|
static int prepare_restrict_ifaces_bpf(
|
||||||
|
Unit* u,
|
||||||
|
bool is_allow_list,
|
||||||
const Set *restrict_network_interfaces,
|
const Set *restrict_network_interfaces,
|
||||||
struct restrict_ifaces_bpf **ret_object) {
|
struct restrict_ifaces_bpf **ret_object) {
|
||||||
|
|
||||||
_cleanup_(restrict_ifaces_bpf_freep) struct restrict_ifaces_bpf *obj = NULL;
|
_cleanup_(restrict_ifaces_bpf_freep) struct restrict_ifaces_bpf *obj = NULL;
|
||||||
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
||||||
char *iface;
|
char *iface;
|
||||||
@ -50,9 +53,10 @@ static int prepare_restrict_ifaces_bpf(Unit* u, bool is_allow_list,
|
|||||||
SET_FOREACH(iface, restrict_network_interfaces) {
|
SET_FOREACH(iface, restrict_network_interfaces) {
|
||||||
uint8_t dummy = 0;
|
uint8_t dummy = 0;
|
||||||
int ifindex;
|
int ifindex;
|
||||||
|
|
||||||
ifindex = rtnl_resolve_interface(&rtnl, iface);
|
ifindex = rtnl_resolve_interface(&rtnl, iface);
|
||||||
if (ifindex < 0) {
|
if (ifindex < 0) {
|
||||||
log_unit_warning_errno(u, ifindex, "Couldn't find index of network interface: %m. Ignoring '%s'", iface);
|
log_unit_warning_errno(u, ifindex, "Couldn't find index of network interface '%s', ignoring: %m", iface);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.home1.create-home">
|
<action id="org.freedesktop.home1.create-home">
|
||||||
<description gettext-domain="systemd">Create a home area</description>
|
<description gettext-domain="systemd">Create a home area</description>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.hostname1.set-hostname">
|
<action id="org.freedesktop.hostname1.set-hostname">
|
||||||
<description gettext-domain="systemd">Set hostname</description>
|
<description gettext-domain="systemd">Set hostname</description>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.import1.import">
|
<action id="org.freedesktop.import1.import">
|
||||||
<description gettext-domain="systemd">Import a VM or container image</description>
|
<description gettext-domain="systemd">Import a VM or container image</description>
|
||||||
|
@ -552,8 +552,6 @@ static int parse_argv(int argc, char *argv[]) {
|
|||||||
arg_lines = 1000;
|
arg_lines = 1000;
|
||||||
|
|
||||||
arg_boot = true;
|
arg_boot = true;
|
||||||
arg_boot_id = SD_ID128_NULL;
|
|
||||||
arg_boot_offset = 0;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -76,17 +76,17 @@ static void test_non_empty(void) {
|
|||||||
assert_se(le64toh(o->entry.seqnum) == 1);
|
assert_se(le64toh(o->entry.seqnum) == 1);
|
||||||
|
|
||||||
assert_se(journal_file_find_data_object(f->file, test, strlen(test), NULL, &p) == 1);
|
assert_se(journal_file_find_data_object(f->file, test, strlen(test), NULL, &p) == 1);
|
||||||
assert_se(journal_file_next_entry_for_data(f->file, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
|
assert_se(journal_file_next_entry_for_data(f->file, p, DIRECTION_DOWN, &o, NULL) == 1);
|
||||||
assert_se(le64toh(o->entry.seqnum) == 1);
|
assert_se(le64toh(o->entry.seqnum) == 1);
|
||||||
|
|
||||||
assert_se(journal_file_next_entry_for_data(f->file, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
|
assert_se(journal_file_next_entry_for_data(f->file, p, DIRECTION_UP, &o, NULL) == 1);
|
||||||
assert_se(le64toh(o->entry.seqnum) == 3);
|
assert_se(le64toh(o->entry.seqnum) == 3);
|
||||||
|
|
||||||
assert_se(journal_file_find_data_object(f->file, test2, strlen(test2), NULL, &p) == 1);
|
assert_se(journal_file_find_data_object(f->file, test2, strlen(test2), NULL, &p) == 1);
|
||||||
assert_se(journal_file_next_entry_for_data(f->file, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
|
assert_se(journal_file_next_entry_for_data(f->file, p, DIRECTION_UP, &o, NULL) == 1);
|
||||||
assert_se(le64toh(o->entry.seqnum) == 2);
|
assert_se(le64toh(o->entry.seqnum) == 2);
|
||||||
|
|
||||||
assert_se(journal_file_next_entry_for_data(f->file, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
|
assert_se(journal_file_next_entry_for_data(f->file, p, DIRECTION_DOWN, &o, NULL) == 1);
|
||||||
assert_se(le64toh(o->entry.seqnum) == 2);
|
assert_se(le64toh(o->entry.seqnum) == 2);
|
||||||
|
|
||||||
assert_se(journal_file_find_data_object(f->file, "quux", 4, NULL, &p) == 0);
|
assert_se(journal_file_find_data_object(f->file, "quux", 4, NULL, &p) == 0);
|
||||||
|
@ -36,7 +36,7 @@ case "$COMMAND" in
|
|||||||
remove)
|
remove)
|
||||||
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \
|
[ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \
|
||||||
echo "Removing /lib/modules/${KERNEL_VERSION}/modules.dep and associated files"
|
echo "Removing /lib/modules/${KERNEL_VERSION}/modules.dep and associated files"
|
||||||
exec rm -f /lib/modules/"${KERNEL_VERSION}"/modules.{alias{,.bin},builtin.bin,dep{,.bin},devname,softdep,symbols{,.bin}}
|
exec rm -f /lib/modules/"${KERNEL_VERSION}"/modules.{alias{,.bin},builtin{,.alias}.bin,dep{,.bin},devname,softdep,symbols{,.bin}}
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "sd-event.h"
|
#include "sd-event.h"
|
||||||
#include "sd-dhcp6-client.h"
|
#include "sd-dhcp6-client.h"
|
||||||
|
|
||||||
|
#include "dhcp6-protocol.h"
|
||||||
#include "hashmap.h"
|
#include "hashmap.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
@ -130,6 +131,12 @@ int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *address);
|
|||||||
int dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
|
int dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
|
||||||
const void *packet, size_t len);
|
const void *packet, size_t len);
|
||||||
|
|
||||||
|
int client_parse_message(
|
||||||
|
sd_dhcp6_client *client,
|
||||||
|
DHCP6Message *message,
|
||||||
|
size_t len,
|
||||||
|
sd_dhcp6_lease *lease);
|
||||||
|
|
||||||
const char *dhcp6_message_type_to_string(int s) _const_;
|
const char *dhcp6_message_type_to_string(int s) _const_;
|
||||||
int dhcp6_message_type_from_string(const char *s) _pure_;
|
int dhcp6_message_type_from_string(const char *s) _pure_;
|
||||||
const char *dhcp6_message_status_to_string(int s) _const_;
|
const char *dhcp6_message_status_to_string(int s) _const_;
|
||||||
|
@ -1124,7 +1124,7 @@ static int client_ensure_iaid(sd_dhcp6_client *client) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int client_parse_message(
|
int client_parse_message(
|
||||||
sd_dhcp6_client *client,
|
sd_dhcp6_client *client,
|
||||||
DHCP6Message *message,
|
DHCP6Message *message,
|
||||||
size_t len,
|
size_t len,
|
||||||
@ -1261,35 +1261,35 @@ static int client_parse_message(
|
|||||||
case SD_DHCP6_OPTION_DNS_SERVERS:
|
case SD_DHCP6_OPTION_DNS_SERVERS:
|
||||||
r = dhcp6_lease_add_dns(lease, optval, optlen);
|
r = dhcp6_lease_add_dns(lease, optval, optlen);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
log_dhcp6_client_errno(client, r, "Failed to parse DNS server option, ignoring: %m");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_DOMAIN_LIST:
|
case SD_DHCP6_OPTION_DOMAIN_LIST:
|
||||||
r = dhcp6_lease_add_domains(lease, optval, optlen);
|
r = dhcp6_lease_add_domains(lease, optval, optlen);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
log_dhcp6_client_errno(client, r, "Failed to parse domain list option, ignoring: %m");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_NTP_SERVER:
|
case SD_DHCP6_OPTION_NTP_SERVER:
|
||||||
r = dhcp6_lease_add_ntp(lease, optval, optlen);
|
r = dhcp6_lease_add_ntp(lease, optval, optlen);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
log_dhcp6_client_errno(client, r, "Failed to parse NTP server option, ignoring: %m");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_SNTP_SERVERS:
|
case SD_DHCP6_OPTION_SNTP_SERVERS:
|
||||||
r = dhcp6_lease_add_sntp(lease, optval, optlen);
|
r = dhcp6_lease_add_sntp(lease, optval, optlen);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
log_dhcp6_client_errno(client, r, "Failed to parse SNTP server option, ignoring: %m");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_CLIENT_FQDN:
|
case SD_DHCP6_OPTION_CLIENT_FQDN:
|
||||||
r = dhcp6_lease_set_fqdn(lease, optval, optlen);
|
r = dhcp6_lease_set_fqdn(lease, optval, optlen);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
log_dhcp6_client_errno(client, r, "Failed to parse FQDN option, ignoring: %m");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ static int test_client_message_num;
|
|||||||
static be32_t test_iaid = 0;
|
static be32_t test_iaid = 0;
|
||||||
static uint8_t test_duid[14] = { };
|
static uint8_t test_duid[14] = { };
|
||||||
|
|
||||||
static int test_client_basic(sd_event *e) {
|
static void test_client_basic(sd_event *e) {
|
||||||
sd_dhcp6_client *client;
|
sd_dhcp6_client *client;
|
||||||
int v;
|
int v;
|
||||||
|
|
||||||
@ -108,11 +108,9 @@ static int test_client_basic(sd_event *e) {
|
|||||||
|
|
||||||
assert_se(sd_dhcp6_client_detach_event(client) >= 0);
|
assert_se(sd_dhcp6_client_detach_event(client) >= 0);
|
||||||
assert_se(!sd_dhcp6_client_unref(client));
|
assert_se(!sd_dhcp6_client_unref(client));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_parse_domain(sd_event *e) {
|
static void test_parse_domain(void) {
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
char *domain;
|
char *domain;
|
||||||
char **list;
|
char **list;
|
||||||
@ -154,11 +152,9 @@ static int test_parse_domain(sd_event *e) {
|
|||||||
data = (uint8_t []) { 0 , 0 };
|
data = (uint8_t []) { 0 , 0 };
|
||||||
r = dhcp6_option_parse_domainname_list(data, 2, &list);
|
r = dhcp6_option_parse_domainname_list(data, 2, &list);
|
||||||
assert_se(r < 0);
|
assert_se(r < 0);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_option(sd_event *e) {
|
static void test_option(void) {
|
||||||
uint8_t packet[] = {
|
uint8_t packet[] = {
|
||||||
'F', 'O', 'O', 'H', 'O', 'G', 'E',
|
'F', 'O', 'O', 'H', 'O', 'G', 'E',
|
||||||
0x00, SD_DHCP6_OPTION_ORO, 0x00, 0x07,
|
0x00, SD_DHCP6_OPTION_ORO, 0x00, 0x07,
|
||||||
@ -232,11 +228,9 @@ static int test_option(sd_event *e) {
|
|||||||
assert_se(*out == 'B');
|
assert_se(*out == 'B');
|
||||||
|
|
||||||
assert_se(memcmp(packet, result, sizeof(packet)) == 0);
|
assert_se(memcmp(packet, result, sizeof(packet)) == 0);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_option_status(sd_event *e) {
|
static void test_option_status(void) {
|
||||||
uint8_t option1[] = {
|
uint8_t option1[] = {
|
||||||
/* IA NA */
|
/* IA NA */
|
||||||
0x00, 0x03, 0x00, 0x12, 0x1a, 0x1d, 0x1a, 0x1d,
|
0x00, 0x03, 0x00, 0x12, 0x1a, 0x1d, 0x1a, 0x1d,
|
||||||
@ -370,8 +364,56 @@ static int test_option_status(sd_event *e) {
|
|||||||
assert_se(r >= 0);
|
assert_se(r >= 0);
|
||||||
assert_se(pd.addresses);
|
assert_se(pd.addresses);
|
||||||
dhcp6_lease_free_ia(&pd);
|
dhcp6_lease_free_ia(&pd);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
static void test_client_parse_message_issue_22099(void) {
|
||||||
|
static const uint8_t msg[] = {
|
||||||
|
/* xid */
|
||||||
|
0x07, 0x7c, 0x4c, 0x16,
|
||||||
|
/* status code (zero length) */
|
||||||
|
0x00, 0x0e, 0x00, 0x00,
|
||||||
|
/* NTP servers (broken sub option and sub option length) */
|
||||||
|
0x00, 0x38, 0x00, 0x14, 0x01, 0x00, 0x10, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xde, 0x15, 0xc8, 0xff, 0xfe, 0xef, 0x1e, 0x4e,
|
||||||
|
/* client ID */
|
||||||
|
0x00, 0x01, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x00, 0xab, 0x11, 0x5c, 0x6b, 0x90, 0xec, 0xda, 0x95,
|
||||||
|
0x15, 0x45,
|
||||||
|
/* server ID */
|
||||||
|
0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x01, 0xdc, 0x15, 0xc8, 0xef, 0x1e, 0x4e,
|
||||||
|
/* preference */
|
||||||
|
0x00, 0x07, 0x00, 0x01, 0x00,
|
||||||
|
/* DNS servers */
|
||||||
|
0x00, 0x17, 0x00, 0x10, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x15, 0xc8, 0xff,
|
||||||
|
0xfe, 0xef, 0x1e, 0x4e,
|
||||||
|
/* v6 pcp server */
|
||||||
|
0x00, 0x56, 0x00, 0x10, 0x2a, 0x02, 0x81, 0x0d, 0x98, 0x80, 0x37, 0x00, 0xde, 0x15, 0xc8, 0xff,
|
||||||
|
0xfe, 0xef, 0x1e, 0x4e,
|
||||||
|
/* IA_NA */
|
||||||
|
0x00, 0x03, 0x00, 0x28, 0xcc, 0x59, 0x11, 0x7b, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x0b, 0x40,
|
||||||
|
/* IA_NA (iaaddr) */
|
||||||
|
0x00, 0x05, 0x00, 0x18, 0x2a, 0x02, 0x81, 0x0d, 0x98, 0x80, 0x37, 0x00, 0x6a, 0x05, 0xca, 0xff,
|
||||||
|
0xfe, 0xf1, 0x51, 0x53, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x1c, 0x20,
|
||||||
|
/* IA_PD */
|
||||||
|
0x00, 0x19, 0x00, 0x29, 0xcc, 0x59, 0x11, 0x7b, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x0b, 0x40,
|
||||||
|
/* IA_PD (iaprefix) */
|
||||||
|
0x00, 0x1a, 0x00, 0x19, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x1c, 0x20, 0x3a, 0x2a, 0x02, 0x81,
|
||||||
|
0x0d, 0x98, 0x80, 0x37, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
||||||
|
static const uint8_t duid[] = {
|
||||||
|
0x00, 0x00, 0xab, 0x11, 0x5c, 0x6b, 0x90, 0xec, 0xda, 0x95, 0x15, 0x45,
|
||||||
|
};
|
||||||
|
_cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
|
||||||
|
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
||||||
|
|
||||||
|
log_debug("/* %s */", __func__);
|
||||||
|
|
||||||
|
assert_se(sd_dhcp6_client_new(&client) >= 0);
|
||||||
|
assert_se(sd_dhcp6_client_set_iaid(client, 0xcc59117b) >= 0);
|
||||||
|
assert_se(sd_dhcp6_client_set_duid(client, 2, duid, sizeof(duid)) >= 0);
|
||||||
|
|
||||||
|
assert_se(dhcp6_lease_new(&lease) >= 0);
|
||||||
|
|
||||||
|
assert_se(client_parse_message(client, (DHCP6Message*) msg, sizeof(msg), lease) >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t msg_advertise[198] = {
|
static uint8_t msg_advertise[198] = {
|
||||||
@ -434,7 +476,7 @@ static uint8_t fqdn_wire[16] = {
|
|||||||
0x05, 'i', 'n', 't', 'r', 'a', 0x00
|
0x05, 'i', 'n', 't', 'r', 'a', 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
static int test_advertise_option(sd_event *e) {
|
static void test_advertise_option(sd_event *e) {
|
||||||
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
||||||
DHCP6Message *advertise = (DHCP6Message *)msg_advertise;
|
DHCP6Message *advertise = (DHCP6Message *)msg_advertise;
|
||||||
size_t len = sizeof(msg_advertise) - sizeof(DHCP6Message), pos = 0;
|
size_t len = sizeof(msg_advertise) - sizeof(DHCP6Message), pos = 0;
|
||||||
@ -455,8 +497,7 @@ static int test_advertise_option(sd_event *e) {
|
|||||||
assert_se(dhcp6_lease_new(&lease) >= 0);
|
assert_se(dhcp6_lease_new(&lease) >= 0);
|
||||||
|
|
||||||
assert_se(advertise->type == DHCP6_MESSAGE_ADVERTISE);
|
assert_se(advertise->type == DHCP6_MESSAGE_ADVERTISE);
|
||||||
assert_se((be32toh(advertise->transaction_id) & 0x00ffffff) ==
|
assert_se((be32toh(advertise->transaction_id) & 0x00ffffff) == 0x0fb4e5);
|
||||||
0x0fb4e5);
|
|
||||||
|
|
||||||
while (pos < len) {
|
while (pos < len) {
|
||||||
DHCP6Option *option = (DHCP6Option *)&advertise->options[pos];
|
DHCP6Option *option = (DHCP6Option *)&advertise->options[pos];
|
||||||
@ -495,16 +536,14 @@ static int test_advertise_option(sd_event *e) {
|
|||||||
assert_se(optval == &msg_advertise[179]);
|
assert_se(optval == &msg_advertise[179]);
|
||||||
assert_se(!memcmp(optval, &msg_advertise[179], optlen));
|
assert_se(!memcmp(optval, &msg_advertise[179], optlen));
|
||||||
|
|
||||||
assert_se(dhcp6_lease_set_serverid(lease, optval,
|
assert_se(dhcp6_lease_set_serverid(lease, optval, optlen) >= 0);
|
||||||
optlen) >= 0);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_PREFERENCE:
|
case SD_DHCP6_OPTION_PREFERENCE:
|
||||||
assert_se(optlen == 1);
|
assert_se(optlen == 1);
|
||||||
assert_se(!*optval);
|
assert_se(!*optval);
|
||||||
|
|
||||||
assert_se(dhcp6_lease_set_preference(lease,
|
assert_se(dhcp6_lease_set_preference(lease, *optval) >= 0);
|
||||||
*optval) >= 0);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_ELAPSED_TIME:
|
case SD_DHCP6_OPTION_ELAPSED_TIME:
|
||||||
@ -538,26 +577,20 @@ static int test_advertise_option(sd_event *e) {
|
|||||||
assert_se(opt_clientid);
|
assert_se(opt_clientid);
|
||||||
|
|
||||||
sd_dhcp6_lease_reset_address_iter(lease);
|
sd_dhcp6_lease_reset_address_iter(lease);
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) >= 0);
|
||||||
<_valid) >= 0);
|
|
||||||
assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
|
assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
|
||||||
assert_se(lt_pref == 150);
|
assert_se(lt_pref == 150);
|
||||||
assert_se(lt_valid == 180);
|
assert_se(lt_valid == 180);
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) == -ENOMSG);
|
||||||
<_valid) == -ENOMSG);
|
|
||||||
|
|
||||||
sd_dhcp6_lease_reset_address_iter(lease);
|
sd_dhcp6_lease_reset_address_iter(lease);
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) >= 0);
|
||||||
<_valid) >= 0);
|
|
||||||
assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
|
assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) == -ENOMSG);
|
||||||
<_valid) == -ENOMSG);
|
|
||||||
sd_dhcp6_lease_reset_address_iter(lease);
|
sd_dhcp6_lease_reset_address_iter(lease);
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) >= 0);
|
||||||
<_valid) >= 0);
|
|
||||||
assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
|
assert_se(!memcmp(&addr, &msg_advertise[42], sizeof(addr)));
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) == -ENOMSG);
|
||||||
<_valid) == -ENOMSG);
|
|
||||||
|
|
||||||
assert_se(dhcp6_lease_get_serverid(lease, &opt, &len) >= 0);
|
assert_se(dhcp6_lease_get_serverid(lease, &opt, &len) >= 0);
|
||||||
assert_se(len == 14);
|
assert_se(len == 14);
|
||||||
@ -578,8 +611,6 @@ static int test_advertise_option(sd_event *e) {
|
|||||||
r = sd_dhcp6_lease_get_ntp_addrs(lease, &addrs);
|
r = sd_dhcp6_lease_get_ntp_addrs(lease, &addrs);
|
||||||
assert_se(r == 1);
|
assert_se(r == 1);
|
||||||
assert_se(!memcmp(addrs, &msg_advertise[159], r * 16));
|
assert_se(!memcmp(addrs, &msg_advertise[159], r * 16));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_check_completed_in_2_seconds(sd_event_source *s, uint64_t usec, void *userdata) {
|
static int test_check_completed_in_2_seconds(sd_event_source *s, uint64_t usec, void *userdata) {
|
||||||
@ -615,7 +646,7 @@ static void test_client_solicit_cb(sd_dhcp6_client *client, int event,
|
|||||||
sd_event_exit(e, 0);
|
sd_event_exit(e, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_client_send_reply(DHCP6Message *request) {
|
static void test_client_send_reply(DHCP6Message *request) {
|
||||||
DHCP6Message reply;
|
DHCP6Message reply;
|
||||||
|
|
||||||
log_debug("/* %s */", __func__);
|
log_debug("/* %s */", __func__);
|
||||||
@ -629,13 +660,10 @@ static int test_client_send_reply(DHCP6Message *request) {
|
|||||||
|
|
||||||
memcpy(&msg_reply[44], &test_iaid, sizeof(test_iaid));
|
memcpy(&msg_reply[44], &test_iaid, sizeof(test_iaid));
|
||||||
|
|
||||||
assert_se(write(test_dhcp_fd[1], msg_reply, sizeof(msg_reply))
|
assert_se(write(test_dhcp_fd[1], msg_reply, sizeof(msg_reply)) == sizeof(msg_reply));
|
||||||
== sizeof(msg_reply));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_client_verify_request(DHCP6Message *request, size_t len) {
|
static void test_client_verify_request(DHCP6Message *request, size_t len) {
|
||||||
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
||||||
bool found_clientid = false, found_iana = false, found_serverid = false,
|
bool found_clientid = false, found_iana = false, found_serverid = false,
|
||||||
found_elapsed_time = false, found_fqdn = false;
|
found_elapsed_time = false, found_fqdn = false;
|
||||||
@ -714,16 +742,13 @@ static int test_client_verify_request(DHCP6Message *request, size_t len) {
|
|||||||
pos += sizeof(*option) + optlen;
|
pos += sizeof(*option) + optlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_se(found_clientid && found_iana && found_serverid &&
|
assert_se(found_clientid && found_iana && found_serverid && found_elapsed_time);
|
||||||
found_elapsed_time);
|
|
||||||
|
|
||||||
sd_dhcp6_lease_reset_address_iter(lease);
|
sd_dhcp6_lease_reset_address_iter(lease);
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) == -ENOMSG);
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) == -ENOMSG);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_client_send_advertise(DHCP6Message *solicit) {
|
static void test_client_send_advertise(DHCP6Message *solicit) {
|
||||||
DHCP6Message advertise;
|
DHCP6Message advertise;
|
||||||
|
|
||||||
log_debug("/* %s */", __func__);
|
log_debug("/* %s */", __func__);
|
||||||
@ -737,13 +762,10 @@ static int test_client_send_advertise(DHCP6Message *solicit) {
|
|||||||
|
|
||||||
memcpy(&msg_advertise[26], &test_iaid, sizeof(test_iaid));
|
memcpy(&msg_advertise[26], &test_iaid, sizeof(test_iaid));
|
||||||
|
|
||||||
assert_se(write(test_dhcp_fd[1], msg_advertise, sizeof(msg_advertise))
|
assert_se(write(test_dhcp_fd[1], msg_advertise, sizeof(msg_advertise)) == sizeof(msg_advertise));
|
||||||
== sizeof(msg_advertise));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_client_verify_solicit(DHCP6Message *solicit, size_t len) {
|
static void test_client_verify_solicit(DHCP6Message *solicit, size_t len) {
|
||||||
bool found_clientid = false, found_iana = false,
|
bool found_clientid = false, found_iana = false,
|
||||||
found_elapsed_time = false, found_fqdn = false;
|
found_elapsed_time = false, found_fqdn = false;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
@ -805,12 +827,9 @@ static int test_client_verify_solicit(DHCP6Message *solicit, size_t len) {
|
|||||||
|
|
||||||
assert_se(pos == len);
|
assert_se(pos == len);
|
||||||
assert_se(found_clientid && found_iana && found_elapsed_time);
|
assert_se(found_clientid && found_iana && found_elapsed_time);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_client_information_cb(sd_dhcp6_client *client, int event,
|
static void test_client_information_cb(sd_dhcp6_client *client, int event, void *userdata) {
|
||||||
void *userdata) {
|
|
||||||
sd_event *e = userdata;
|
sd_event *e = userdata;
|
||||||
sd_dhcp6_lease *lease;
|
sd_dhcp6_lease *lease;
|
||||||
const struct in6_addr *addrs;
|
const struct in6_addr *addrs;
|
||||||
@ -843,18 +862,14 @@ static void test_client_information_cb(sd_dhcp6_client *client, int event,
|
|||||||
assert_se(sd_dhcp6_client_stop(client) >= 0);
|
assert_se(sd_dhcp6_client_stop(client) >= 0);
|
||||||
assert_se(sd_dhcp6_client_set_information_request(client, false) >= 0);
|
assert_se(sd_dhcp6_client_set_information_request(client, false) >= 0);
|
||||||
|
|
||||||
assert_se(sd_dhcp6_client_set_callback(client,
|
assert_se(sd_dhcp6_client_set_callback(client, test_client_solicit_cb, e) >= 0);
|
||||||
test_client_solicit_cb, e) >= 0);
|
|
||||||
|
|
||||||
assert_se(sd_dhcp6_client_set_local_address(client, &address) >= 0);
|
assert_se(sd_dhcp6_client_set_local_address(client, &address) >= 0);
|
||||||
|
|
||||||
assert_se(sd_dhcp6_client_start(client) >= 0);
|
assert_se(sd_dhcp6_client_start(client) >= 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_client_verify_information_request(DHCP6Message *information_request,
|
static void test_client_verify_information_request(DHCP6Message *information_request, size_t len) {
|
||||||
size_t len) {
|
|
||||||
|
|
||||||
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
bool found_clientid = false, found_elapsed_time = false;
|
bool found_clientid = false, found_elapsed_time = false;
|
||||||
@ -905,16 +920,12 @@ static int test_client_verify_information_request(DHCP6Message *information_requ
|
|||||||
|
|
||||||
sd_dhcp6_lease_reset_address_iter(lease);
|
sd_dhcp6_lease_reset_address_iter(lease);
|
||||||
|
|
||||||
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref,
|
assert_se(sd_dhcp6_lease_get_address(lease, &addr, <_pref, <_valid) == -ENOMSG);
|
||||||
<_valid) == -ENOMSG);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int dhcp6_network_send_udp_socket(int s, struct in6_addr *server_address,
|
int dhcp6_network_send_udp_socket(int s, struct in6_addr *server_address,
|
||||||
const void *packet, size_t len) {
|
const void *packet, size_t len) {
|
||||||
struct in6_addr mcast =
|
struct in6_addr mcast = IN6ADDR_ALL_DHCP6_RELAY_AGENTS_AND_SERVERS_INIT;
|
||||||
IN6ADDR_ALL_DHCP6_RELAY_AGENTS_AND_SERVERS_INIT;
|
|
||||||
DHCP6Message *message;
|
DHCP6Message *message;
|
||||||
|
|
||||||
log_debug("/* %s */", __func__);
|
log_debug("/* %s */", __func__);
|
||||||
@ -955,7 +966,7 @@ int dhcp6_network_bind_udp_socket(int ifindex, struct in6_addr *local_address) {
|
|||||||
return test_dhcp_fd[0];
|
return test_dhcp_fd[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test_client_solicit(sd_event *e) {
|
static void test_client_solicit(sd_event *e) {
|
||||||
sd_dhcp6_client *client;
|
sd_dhcp6_client *client;
|
||||||
struct in6_addr address = { { { 0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01 } } };
|
struct in6_addr address = { { { 0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01 } } };
|
||||||
int val;
|
int val;
|
||||||
@ -998,8 +1009,6 @@ static int test_client_solicit(sd_event *e) {
|
|||||||
assert_se(!sd_dhcp6_client_unref(client));
|
assert_se(!sd_dhcp6_client_unref(client));
|
||||||
|
|
||||||
test_dhcp_fd[1] = safe_close(test_dhcp_fd[1]);
|
test_dhcp_fd[1] = safe_close(test_dhcp_fd[1]);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
@ -1010,11 +1019,12 @@ int main(int argc, char *argv[]) {
|
|||||||
test_setup_logging(LOG_DEBUG);
|
test_setup_logging(LOG_DEBUG);
|
||||||
|
|
||||||
test_client_basic(e);
|
test_client_basic(e);
|
||||||
test_option(e);
|
test_parse_domain();
|
||||||
test_option_status(e);
|
test_option();
|
||||||
|
test_option_status();
|
||||||
|
test_client_parse_message_issue_22099();
|
||||||
test_advertise_option(e);
|
test_advertise_option(e);
|
||||||
test_client_solicit(e);
|
test_client_solicit(e);
|
||||||
test_parse_domain(e);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1392,7 +1392,7 @@ int device_read_db_internal_filename(sd_device *device, const char *filename) {
|
|||||||
_cleanup_free_ char *db = NULL;
|
_cleanup_free_ char *db = NULL;
|
||||||
const char *value;
|
const char *value;
|
||||||
size_t db_len;
|
size_t db_len;
|
||||||
char key;
|
char key = '\0'; /* Unnecessary initialization to appease gcc-12.0.0-0.4.fc36 */
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -2099,14 +2099,35 @@ static void chain_cache_put(
|
|||||||
ci->last_index = last_index;
|
ci->last_index = last_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int bump_array_index(uint64_t *i, direction_t direction, uint64_t n) {
|
||||||
|
assert(i);
|
||||||
|
|
||||||
|
/* Increase or decrease the specified index, in the right direction. */
|
||||||
|
|
||||||
|
if (direction == DIRECTION_DOWN) {
|
||||||
|
if (*i >= n - 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
(*i)++;
|
||||||
|
} else {
|
||||||
|
if (*i <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
(*i)--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int generic_array_get(
|
static int generic_array_get(
|
||||||
JournalFile *f,
|
JournalFile *f,
|
||||||
uint64_t first,
|
uint64_t first,
|
||||||
uint64_t i,
|
uint64_t i,
|
||||||
|
direction_t direction,
|
||||||
Object **ret, uint64_t *ret_offset) {
|
Object **ret, uint64_t *ret_offset) {
|
||||||
|
|
||||||
Object *o;
|
Object *o, *e;
|
||||||
uint64_t p = 0, a, t = 0;
|
uint64_t p = 0, a, t = 0, k;
|
||||||
int r;
|
int r;
|
||||||
ChainCacheItem *ci;
|
ChainCacheItem *ci;
|
||||||
|
|
||||||
@ -2123,35 +2144,64 @@ static int generic_array_get(
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (a > 0) {
|
while (a > 0) {
|
||||||
uint64_t k;
|
|
||||||
|
|
||||||
r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &o);
|
r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &o);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
k = journal_file_entry_array_n_items(o);
|
k = journal_file_entry_array_n_items(o);
|
||||||
if (i < k) {
|
if (i < k)
|
||||||
p = le64toh(o->entry_array.items[i]);
|
break;
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
|
|
||||||
i -= k;
|
i -= k;
|
||||||
t += k;
|
t += k;
|
||||||
a = le64toh(o->entry_array.next_entry_array_offset);
|
a = le64toh(o->entry_array.next_entry_array_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we've found the right location, now look for the first non-corrupt entry object (in the right
|
||||||
|
* direction). */
|
||||||
|
|
||||||
|
while (a > 0) {
|
||||||
|
/* In the first iteration of the while loop, we reuse i, k and o from the previous while
|
||||||
|
* loop. */
|
||||||
|
if (i == UINT64_MAX) {
|
||||||
|
r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &o);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
k = journal_file_entry_array_n_items(o);
|
||||||
|
if (k == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
i = direction == DIRECTION_DOWN ? 0 : k - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
p = le64toh(o->entry_array.items[i]);
|
||||||
|
|
||||||
|
r = journal_file_move_to_object(f, OBJECT_ENTRY, p, &e);
|
||||||
|
if (r >= 0)
|
||||||
|
goto found;
|
||||||
|
if (!IN_SET(r, -EADDRNOTAVAIL, -EBADMSG))
|
||||||
|
return r;
|
||||||
|
|
||||||
|
/* OK, so this entry is borked. Most likely some entry didn't get synced to
|
||||||
|
* disk properly, let's see if the next one might work for us instead. */
|
||||||
|
log_debug_errno(r, "Entry item %" PRIu64 " is bad, skipping over it.", i);
|
||||||
|
} while (bump_array_index(&i, direction, k) > 0);
|
||||||
|
|
||||||
|
t += k;
|
||||||
|
a = le64toh(o->entry_array.next_entry_array_offset);
|
||||||
|
i = UINT64_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
found:
|
found:
|
||||||
/* Let's cache this item for the next invocation */
|
/* Let's cache this item for the next invocation */
|
||||||
chain_cache_put(f->chain_cache, ci, first, a, le64toh(o->entry_array.items[0]), t, i);
|
chain_cache_put(f->chain_cache, ci, first, a, le64toh(o->entry_array.items[0]), t, i);
|
||||||
|
|
||||||
r = journal_file_move_to_object(f, OBJECT_ENTRY, p, &o);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
*ret = o;
|
*ret = e;
|
||||||
|
|
||||||
if (ret_offset)
|
if (ret_offset)
|
||||||
*ret_offset = p;
|
*ret_offset = p;
|
||||||
@ -2164,16 +2214,18 @@ static int generic_array_get_plus_one(
|
|||||||
uint64_t extra,
|
uint64_t extra,
|
||||||
uint64_t first,
|
uint64_t first,
|
||||||
uint64_t i,
|
uint64_t i,
|
||||||
|
direction_t direction,
|
||||||
Object **ret, uint64_t *ret_offset) {
|
Object **ret, uint64_t *ret_offset) {
|
||||||
|
|
||||||
Object *o;
|
Object *o;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(f);
|
assert(f);
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
int r;
|
|
||||||
|
|
||||||
r = journal_file_move_to_object(f, OBJECT_ENTRY, extra, &o);
|
r = journal_file_move_to_object(f, OBJECT_ENTRY, extra, &o);
|
||||||
|
if (IN_SET(r, -EADDRNOTAVAIL, -EBADMSG))
|
||||||
|
return generic_array_get(f, first, 0, direction, ret, ret_offset);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -2186,7 +2238,7 @@ static int generic_array_get_plus_one(
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return generic_array_get(f, first, i-1, ret, ret_offset);
|
return generic_array_get(f, first, i - 1, direction, ret, ret_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -2710,25 +2762,6 @@ int journal_file_compare_locations(JournalFile *af, JournalFile *bf) {
|
|||||||
return CMP(af->current_xor_hash, bf->current_xor_hash);
|
return CMP(af->current_xor_hash, bf->current_xor_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bump_array_index(uint64_t *i, direction_t direction, uint64_t n) {
|
|
||||||
|
|
||||||
/* Increase or decrease the specified index, in the right direction. */
|
|
||||||
|
|
||||||
if (direction == DIRECTION_DOWN) {
|
|
||||||
if (*i >= n - 1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
(*i) ++;
|
|
||||||
} else {
|
|
||||||
if (*i <= 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
(*i) --;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool check_properly_ordered(uint64_t new_offset, uint64_t old_offset, direction_t direction) {
|
static bool check_properly_ordered(uint64_t new_offset, uint64_t old_offset, direction_t direction) {
|
||||||
|
|
||||||
/* Consider it an error if any of the two offsets is uninitialized */
|
/* Consider it an error if any of the two offsets is uninitialized */
|
||||||
@ -2777,24 +2810,9 @@ int journal_file_next_entry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* And jump to it */
|
/* And jump to it */
|
||||||
for (;;) {
|
r = generic_array_get(f, le64toh(f->header->entry_array_offset), i, direction, ret, &ofs);
|
||||||
r = generic_array_get(f,
|
if (r <= 0)
|
||||||
le64toh(f->header->entry_array_offset),
|
return r;
|
||||||
i,
|
|
||||||
ret, &ofs);
|
|
||||||
if (r > 0)
|
|
||||||
break;
|
|
||||||
if (r != -EBADMSG)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
/* OK, so this entry is borked. Most likely some entry didn't get synced to disk properly, let's see if
|
|
||||||
* the next one might work for us instead. */
|
|
||||||
log_debug_errno(r, "Entry item %" PRIu64 " is bad, skipping over it.", i);
|
|
||||||
|
|
||||||
r = bump_array_index(&i, direction, n);
|
|
||||||
if (r <= 0)
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure our array is properly ordered. */
|
/* Ensure our array is properly ordered. */
|
||||||
if (p > 0 && !check_properly_ordered(ofs, p, direction))
|
if (p > 0 && !check_properly_ordered(ofs, p, direction))
|
||||||
@ -2810,7 +2828,6 @@ int journal_file_next_entry(
|
|||||||
|
|
||||||
int journal_file_next_entry_for_data(
|
int journal_file_next_entry_for_data(
|
||||||
JournalFile *f,
|
JournalFile *f,
|
||||||
Object *o, uint64_t p,
|
|
||||||
uint64_t data_offset,
|
uint64_t data_offset,
|
||||||
direction_t direction,
|
direction_t direction,
|
||||||
Object **ret, uint64_t *ret_offset) {
|
Object **ret, uint64_t *ret_offset) {
|
||||||
@ -2820,7 +2837,6 @@ int journal_file_next_entry_for_data(
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(f);
|
assert(f);
|
||||||
assert(p > 0 || !o);
|
|
||||||
|
|
||||||
r = journal_file_move_to_object(f, OBJECT_DATA, data_offset, &d);
|
r = journal_file_move_to_object(f, OBJECT_DATA, data_offset, &d);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -2830,53 +2846,16 @@ int journal_file_next_entry_for_data(
|
|||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
if (!o)
|
i = direction == DIRECTION_DOWN ? 0 : n - 1;
|
||||||
i = direction == DIRECTION_DOWN ? 0 : n - 1;
|
|
||||||
else {
|
|
||||||
if (o->object.type != OBJECT_ENTRY)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
r = generic_array_bisect_plus_one(f,
|
r = generic_array_get_plus_one(f,
|
||||||
le64toh(d->data.entry_offset),
|
le64toh(d->data.entry_offset),
|
||||||
le64toh(d->data.entry_array_offset),
|
le64toh(d->data.entry_array_offset),
|
||||||
le64toh(d->data.n_entries),
|
i,
|
||||||
p,
|
direction,
|
||||||
test_object_offset,
|
ret, &ofs);
|
||||||
DIRECTION_DOWN,
|
if (r <= 0)
|
||||||
NULL, NULL,
|
return r;
|
||||||
&i);
|
|
||||||
|
|
||||||
if (r <= 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = bump_array_index(&i, direction, n);
|
|
||||||
if (r <= 0)
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
r = generic_array_get_plus_one(f,
|
|
||||||
le64toh(d->data.entry_offset),
|
|
||||||
le64toh(d->data.entry_array_offset),
|
|
||||||
i,
|
|
||||||
ret, &ofs);
|
|
||||||
if (r > 0)
|
|
||||||
break;
|
|
||||||
if (r != -EBADMSG)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
log_debug_errno(r, "Data entry item %" PRIu64 " is bad, skipping over it.", i);
|
|
||||||
|
|
||||||
r = bump_array_index(&i, direction, n);
|
|
||||||
if (r <= 0)
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure our array is properly ordered. */
|
|
||||||
if (p > 0 && check_properly_ordered(ofs, p, direction))
|
|
||||||
return log_debug_errno(SYNTHETIC_ERRNO(EBADMSG),
|
|
||||||
"%s data entry array not properly ordered at entry %" PRIu64,
|
|
||||||
f->path, i);
|
|
||||||
|
|
||||||
if (ret_offset)
|
if (ret_offset)
|
||||||
*ret_offset = ofs;
|
*ret_offset = ofs;
|
||||||
@ -3819,7 +3798,8 @@ int journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot_id, u
|
|||||||
r = generic_array_get_plus_one(f,
|
r = generic_array_get_plus_one(f,
|
||||||
le64toh(o->data.entry_offset),
|
le64toh(o->data.entry_offset),
|
||||||
le64toh(o->data.entry_array_offset),
|
le64toh(o->data.entry_array_offset),
|
||||||
le64toh(o->data.n_entries)-1,
|
le64toh(o->data.n_entries) - 1,
|
||||||
|
DIRECTION_UP,
|
||||||
&o, NULL);
|
&o, NULL);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
return r;
|
return r;
|
||||||
|
@ -214,7 +214,7 @@ void journal_file_save_location(JournalFile *f, Object *o, uint64_t offset);
|
|||||||
int journal_file_compare_locations(JournalFile *af, JournalFile *bf);
|
int journal_file_compare_locations(JournalFile *af, JournalFile *bf);
|
||||||
int journal_file_next_entry(JournalFile *f, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
|
int journal_file_next_entry(JournalFile *f, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
|
||||||
|
|
||||||
int journal_file_next_entry_for_data(JournalFile *f, Object *o, uint64_t p, uint64_t data_offset, direction_t direction, Object **ret, uint64_t *offset);
|
int journal_file_next_entry_for_data(JournalFile *f, uint64_t data_offset, direction_t direction, Object **ret, uint64_t *offset);
|
||||||
|
|
||||||
int journal_file_move_to_entry_by_seqnum(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
|
int journal_file_move_to_entry_by_seqnum(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
|
||||||
int journal_file_move_to_entry_by_realtime(JournalFile *f, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
|
int journal_file_move_to_entry_by_realtime(JournalFile *f, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
|
||||||
|
@ -611,9 +611,9 @@ static int find_location_for_match(
|
|||||||
/* FIXME: missing: find by monotonic */
|
/* FIXME: missing: find by monotonic */
|
||||||
|
|
||||||
if (j->current_location.type == LOCATION_HEAD)
|
if (j->current_location.type == LOCATION_HEAD)
|
||||||
return journal_file_next_entry_for_data(f, NULL, 0, dp, DIRECTION_DOWN, ret, offset);
|
return journal_file_next_entry_for_data(f, dp, DIRECTION_DOWN, ret, offset);
|
||||||
if (j->current_location.type == LOCATION_TAIL)
|
if (j->current_location.type == LOCATION_TAIL)
|
||||||
return journal_file_next_entry_for_data(f, NULL, 0, dp, DIRECTION_UP, ret, offset);
|
return journal_file_next_entry_for_data(f, dp, DIRECTION_UP, ret, offset);
|
||||||
if (j->current_location.seqnum_set && sd_id128_equal(j->current_location.seqnum_id, f->header->seqnum_id))
|
if (j->current_location.seqnum_set && sd_id128_equal(j->current_location.seqnum_id, f->header->seqnum_id))
|
||||||
return journal_file_move_to_entry_by_seqnum_for_data(f, dp, j->current_location.seqnum, direction, ret, offset);
|
return journal_file_move_to_entry_by_seqnum_for_data(f, dp, j->current_location.seqnum, direction, ret, offset);
|
||||||
if (j->current_location.monotonic_set) {
|
if (j->current_location.monotonic_set) {
|
||||||
@ -624,7 +624,7 @@ static int find_location_for_match(
|
|||||||
if (j->current_location.realtime_set)
|
if (j->current_location.realtime_set)
|
||||||
return journal_file_move_to_entry_by_realtime_for_data(f, dp, j->current_location.realtime, direction, ret, offset);
|
return journal_file_move_to_entry_by_realtime_for_data(f, dp, j->current_location.realtime, direction, ret, offset);
|
||||||
|
|
||||||
return journal_file_next_entry_for_data(f, NULL, 0, dp, direction, ret, offset);
|
return journal_file_next_entry_for_data(f, dp, direction, ret, offset);
|
||||||
|
|
||||||
} else if (m->type == MATCH_OR_TERM) {
|
} else if (m->type == MATCH_OR_TERM) {
|
||||||
uint64_t np = 0;
|
uint64_t np = 0;
|
||||||
@ -2303,8 +2303,8 @@ _public_ int sd_journal_get_data(sd_journal *j, const char *field, const void **
|
|||||||
p = le64toh(o->entry.items[i].object_offset);
|
p = le64toh(o->entry.items[i].object_offset);
|
||||||
le_hash = o->entry.items[i].hash;
|
le_hash = o->entry.items[i].hash;
|
||||||
r = journal_file_move_to_object(f, OBJECT_DATA, p, &d);
|
r = journal_file_move_to_object(f, OBJECT_DATA, p, &d);
|
||||||
if (r == -EBADMSG) {
|
if (IN_SET(r, -EADDRNOTAVAIL, -EBADMSG)) {
|
||||||
log_debug("Entry item %"PRIu64" data object is bad, skipping over it.", i);
|
log_debug_errno(r, "Entry item %"PRIu64" data object is bad, skipping over it: %m", i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -2448,8 +2448,8 @@ _public_ int sd_journal_enumerate_data(sd_journal *j, const void **data, size_t
|
|||||||
p = le64toh(o->entry.items[j->current_field].object_offset);
|
p = le64toh(o->entry.items[j->current_field].object_offset);
|
||||||
le_hash = o->entry.items[j->current_field].hash;
|
le_hash = o->entry.items[j->current_field].hash;
|
||||||
r = journal_file_move_to_object(f, OBJECT_DATA, p, &o);
|
r = journal_file_move_to_object(f, OBJECT_DATA, p, &o);
|
||||||
if (r == -EBADMSG) {
|
if (IN_SET(r, -EADDRNOTAVAIL, -EBADMSG)) {
|
||||||
log_debug("Entry item %"PRIu64" data object is bad, skipping over it.", j->current_field);
|
log_debug_errno(r, "Entry item %"PRIu64" data object is bad, skipping over it: %m", j->current_field);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.locale1.set-locale">
|
<action id="org.freedesktop.locale1.set-locale">
|
||||||
<description gettext-domain="systemd">Set system locale</description>
|
<description gettext-domain="systemd">Set system locale</description>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.login1.inhibit-block-shutdown">
|
<action id="org.freedesktop.login1.inhibit-block-shutdown">
|
||||||
<description gettext-domain="systemd">Allow applications to inhibit system shutdown</description>
|
<description gettext-domain="systemd">Allow applications to inhibit system shutdown</description>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.machine1.login">
|
<action id="org.freedesktop.machine1.login">
|
||||||
<description gettext-domain="systemd">Log into a local container</description>
|
<description gettext-domain="systemd">Log into a local container</description>
|
||||||
|
@ -895,13 +895,8 @@ int config_parse_wireguard_route_table(
|
|||||||
assert(data);
|
assert(data);
|
||||||
assert(userdata);
|
assert(userdata);
|
||||||
|
|
||||||
if (isempty(rvalue)) {
|
if (isempty(rvalue) || parse_boolean(rvalue) == 0) {
|
||||||
*table = RT_TABLE_MAIN;
|
*table = 0; /* Disabled. */
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (streq(rvalue, "off")) {
|
|
||||||
*table = 0;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -952,7 +947,7 @@ int config_parse_wireguard_peer_route_table(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (streq(rvalue, "off")) {
|
if (parse_boolean(rvalue) == 0) {
|
||||||
peer->route_table = 0; /* Disabled. */
|
peer->route_table = 0; /* Disabled. */
|
||||||
peer->route_table_set = true;
|
peer->route_table_set = true;
|
||||||
TAKE_PTR(peer);
|
TAKE_PTR(peer);
|
||||||
@ -1061,7 +1056,6 @@ static void wireguard_init(NetDev *netdev) {
|
|||||||
assert(w);
|
assert(w);
|
||||||
|
|
||||||
w->flags = WGDEVICE_F_REPLACE_PEERS;
|
w->flags = WGDEVICE_F_REPLACE_PEERS;
|
||||||
w->route_table = RT_TABLE_MAIN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wireguard_done(NetDev *netdev) {
|
static void wireguard_done(NetDev *netdev) {
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.network1.set-ntp-servers">
|
<action id="org.freedesktop.network1.set-ntp-servers">
|
||||||
<description gettext-domain="systemd">Set NTP servers</description>
|
<description gettext-domain="systemd">Set NTP servers</description>
|
||||||
|
@ -22,14 +22,9 @@
|
|||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
|
||||||
static void setup_logging(void) {
|
|
||||||
/* We need a dummy function because log_parse_environment is a macro. */
|
|
||||||
log_parse_environment();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setup_logging_once(void) {
|
static void setup_logging_once(void) {
|
||||||
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||||
assert_se(pthread_once(&once, setup_logging) == 0);
|
assert_se(pthread_once(&once, log_parse_environment_variables) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NSS_ENTRYPOINT_BEGIN \
|
#define NSS_ENTRYPOINT_BEGIN \
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
static JsonDispatchFlags json_dispatch_flags = 0;
|
static JsonDispatchFlags json_dispatch_flags = 0;
|
||||||
|
|
||||||
static void setup_logging(void) {
|
static void setup_logging(void) {
|
||||||
log_parse_environment();
|
log_parse_environment_variables();
|
||||||
|
|
||||||
if (DEBUG_LOGGING)
|
if (DEBUG_LOGGING)
|
||||||
json_dispatch_flags = JSON_LOG;
|
json_dispatch_flags = JSON_LOG;
|
||||||
|
@ -116,14 +116,9 @@ static GetentData getsgent_data = {
|
|||||||
.mutex = PTHREAD_MUTEX_INITIALIZER,
|
.mutex = PTHREAD_MUTEX_INITIALIZER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void setup_logging(void) {
|
|
||||||
/* We need a dummy function because log_parse_environment is a macro. */
|
|
||||||
log_parse_environment();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setup_logging_once(void) {
|
static void setup_logging_once(void) {
|
||||||
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||||
assert_se(pthread_once(&once, setup_logging) == 0);
|
assert_se(pthread_once(&once, log_parse_environment_variables) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NSS_ENTRYPOINT_BEGIN \
|
#define NSS_ENTRYPOINT_BEGIN \
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.portable1.inspect-images">
|
<action id="org.freedesktop.portable1.inspect-images">
|
||||||
<description gettext-domain="systemd">Inspect a portable service image</description>
|
<description gettext-domain="systemd">Inspect a portable service image</description>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.resolve1.register-service">
|
<action id="org.freedesktop.resolve1.register-service">
|
||||||
<description gettext-domain="systemd">Register a DNS-SD service</description>
|
<description gettext-domain="systemd">Register a DNS-SD service</description>
|
||||||
|
@ -89,7 +89,6 @@ static int show_cgroup_one_by_path(
|
|||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
_cleanup_free_ char *p = NULL;
|
_cleanup_free_ char *p = NULL;
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
pid_t pid;
|
|
||||||
char *fn;
|
char *fn;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
@ -102,7 +101,18 @@ static int show_cgroup_one_by_path(
|
|||||||
if (!f)
|
if (!f)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
while ((r = cg_read_pid(f, &pid)) > 0) {
|
for (;;) {
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
/* libvirt / qemu uses threaded mode and cgroup.procs cannot be read at the lower levels.
|
||||||
|
* From https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#threads,
|
||||||
|
* “cgroup.procs” in a threaded domain cgroup contains the PIDs of all processes in
|
||||||
|
* the subtree and is not readable in the subtree proper. */
|
||||||
|
r = cg_read_pid(f, &pid);
|
||||||
|
if (IN_SET(r, 0, -EOPNOTSUPP))
|
||||||
|
break;
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
if (!(flags & OUTPUT_KERNEL_THREADS) && is_kernel_thread(pid) > 0)
|
if (!(flags & OUTPUT_KERNEL_THREADS) && is_kernel_thread(pid) > 0)
|
||||||
continue;
|
continue;
|
||||||
@ -113,9 +123,6 @@ static int show_cgroup_one_by_path(
|
|||||||
pids[n++] = pid;
|
pids[n++] = pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
show_pid_array(pids, n, prefix, n_columns, false, more, flags);
|
show_pid_array(pids, n, prefix, n_columns, false, more, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -28,7 +28,7 @@ static bool arg_user = false;
|
|||||||
static int help(void) {
|
static int help(void) {
|
||||||
|
|
||||||
printf("%s [OPTIONS...]\n\n"
|
printf("%s [OPTIONS...]\n\n"
|
||||||
"STDIO or socket-activatable proxy to a given DBus endpoint.\n\n"
|
"Forward messages between two D-Bus busses via a pipe or socket.\n\n"
|
||||||
" -h --help Show this help\n"
|
" -h --help Show this help\n"
|
||||||
" --version Show package version\n"
|
" --version Show package version\n"
|
||||||
" -p --bus-path=PATH Path to the bus address (default: %s)\n"
|
" -p --bus-path=PATH Path to the bus address (default: %s)\n"
|
||||||
@ -125,7 +125,7 @@ static int run(int argc, char *argv[]) {
|
|||||||
in_fd = SD_LISTEN_FDS_START;
|
in_fd = SD_LISTEN_FDS_START;
|
||||||
out_fd = SD_LISTEN_FDS_START;
|
out_fd = SD_LISTEN_FDS_START;
|
||||||
} else
|
} else
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Illegal number of file descriptors passed.");
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "More than one file descriptor was passed.");
|
||||||
|
|
||||||
is_unix =
|
is_unix =
|
||||||
sd_is_socket(in_fd, AF_UNIX, 0, 0) > 0 &&
|
sd_is_socket(in_fd, AF_UNIX, 0, 0) > 0 &&
|
||||||
|
@ -166,33 +166,33 @@ TEST(cellescape) {
|
|||||||
assert_se(streq(cellescape(buf, 1, "\020"), ""));
|
assert_se(streq(cellescape(buf, 1, "\020"), ""));
|
||||||
assert_se(streq(cellescape(buf, 2, "\020"), "."));
|
assert_se(streq(cellescape(buf, 2, "\020"), "."));
|
||||||
assert_se(streq(cellescape(buf, 3, "\020"), ".."));
|
assert_se(streq(cellescape(buf, 3, "\020"), ".."));
|
||||||
assert_se(streq(cellescape(buf, 4, "\020"), "…"));
|
assert_se(streq(cellescape(buf, 4, "\020"), is_locale_utf8() ? "…" : "..."));
|
||||||
assert_se(streq(cellescape(buf, 5, "\020"), "\\020"));
|
assert_se(streq(cellescape(buf, 5, "\020"), "\\020"));
|
||||||
|
|
||||||
assert_se(streq(cellescape(buf, 5, "1234\020"), "1…"));
|
assert_se(streq(cellescape(buf, 5, "1234\020"), is_locale_utf8() ? "1…" : "1..."));
|
||||||
assert_se(streq(cellescape(buf, 6, "1234\020"), "12…"));
|
assert_se(streq(cellescape(buf, 6, "1234\020"), is_locale_utf8() ? "12…" : "12..."));
|
||||||
assert_se(streq(cellescape(buf, 7, "1234\020"), "123…"));
|
assert_se(streq(cellescape(buf, 7, "1234\020"), is_locale_utf8() ? "123…" : "123..."));
|
||||||
assert_se(streq(cellescape(buf, 8, "1234\020"), "1234…"));
|
assert_se(streq(cellescape(buf, 8, "1234\020"), is_locale_utf8() ? "1234…" : "1234..."));
|
||||||
assert_se(streq(cellescape(buf, 9, "1234\020"), "1234\\020"));
|
assert_se(streq(cellescape(buf, 9, "1234\020"), "1234\\020"));
|
||||||
|
|
||||||
assert_se(streq(cellescape(buf, 1, "\t\n"), ""));
|
assert_se(streq(cellescape(buf, 1, "\t\n"), ""));
|
||||||
assert_se(streq(cellescape(buf, 2, "\t\n"), "."));
|
assert_se(streq(cellescape(buf, 2, "\t\n"), "."));
|
||||||
assert_se(streq(cellescape(buf, 3, "\t\n"), ".."));
|
assert_se(streq(cellescape(buf, 3, "\t\n"), ".."));
|
||||||
assert_se(streq(cellescape(buf, 4, "\t\n"), "…"));
|
assert_se(streq(cellescape(buf, 4, "\t\n"), is_locale_utf8() ? "…" : "..."));
|
||||||
assert_se(streq(cellescape(buf, 5, "\t\n"), "\\t\\n"));
|
assert_se(streq(cellescape(buf, 5, "\t\n"), "\\t\\n"));
|
||||||
|
|
||||||
assert_se(streq(cellescape(buf, 5, "1234\t\n"), "1…"));
|
assert_se(streq(cellescape(buf, 5, "1234\t\n"), is_locale_utf8() ? "1…" : "1..."));
|
||||||
assert_se(streq(cellescape(buf, 6, "1234\t\n"), "12…"));
|
assert_se(streq(cellescape(buf, 6, "1234\t\n"), is_locale_utf8() ? "12…" : "12..."));
|
||||||
assert_se(streq(cellescape(buf, 7, "1234\t\n"), "123…"));
|
assert_se(streq(cellescape(buf, 7, "1234\t\n"), is_locale_utf8() ? "123…" : "123..."));
|
||||||
assert_se(streq(cellescape(buf, 8, "1234\t\n"), "1234…"));
|
assert_se(streq(cellescape(buf, 8, "1234\t\n"), is_locale_utf8() ? "1234…" : "1234..."));
|
||||||
assert_se(streq(cellescape(buf, 9, "1234\t\n"), "1234\\t\\n"));
|
assert_se(streq(cellescape(buf, 9, "1234\t\n"), "1234\\t\\n"));
|
||||||
|
|
||||||
assert_se(streq(cellescape(buf, 4, "x\t\020\n"), "…"));
|
assert_se(streq(cellescape(buf, 4, "x\t\020\n"), is_locale_utf8() ? "…" : "..."));
|
||||||
assert_se(streq(cellescape(buf, 5, "x\t\020\n"), "x…"));
|
assert_se(streq(cellescape(buf, 5, "x\t\020\n"), is_locale_utf8() ? "x…" : "x..."));
|
||||||
assert_se(streq(cellescape(buf, 6, "x\t\020\n"), "x…"));
|
assert_se(streq(cellescape(buf, 6, "x\t\020\n"), is_locale_utf8() ? "x…" : "x..."));
|
||||||
assert_se(streq(cellescape(buf, 7, "x\t\020\n"), "x\\t…"));
|
assert_se(streq(cellescape(buf, 7, "x\t\020\n"), is_locale_utf8() ? "x\\t…" : "x\\t..."));
|
||||||
assert_se(streq(cellescape(buf, 8, "x\t\020\n"), "x\\t…"));
|
assert_se(streq(cellescape(buf, 8, "x\t\020\n"), is_locale_utf8() ? "x\\t…" : "x\\t..."));
|
||||||
assert_se(streq(cellescape(buf, 9, "x\t\020\n"), "x\\t…"));
|
assert_se(streq(cellescape(buf, 9, "x\t\020\n"), is_locale_utf8() ? "x\\t…" : "x\\t..."));
|
||||||
assert_se(streq(cellescape(buf, 10, "x\t\020\n"), "x\\t\\020\\n"));
|
assert_se(streq(cellescape(buf, 10, "x\t\020\n"), "x\\t\\020\\n"));
|
||||||
|
|
||||||
assert_se(streq(cellescape(buf, 6, "1\011"), "1\\t"));
|
assert_se(streq(cellescape(buf, 6, "1\011"), "1\\t"));
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
|
|
||||||
<vendor>The systemd Project</vendor>
|
<vendor>The systemd Project</vendor>
|
||||||
<vendor_url>http://www.freedesktop.org/wiki/Software/systemd</vendor_url>
|
<vendor_url>https://systemd.io</vendor_url>
|
||||||
|
|
||||||
<action id="org.freedesktop.timedate1.set-time">
|
<action id="org.freedesktop.timedate1.set-time">
|
||||||
<description gettext-domain="systemd">Set system time</description>
|
<description gettext-domain="systemd">Set system time</description>
|
||||||
|
@ -485,7 +485,7 @@ static int xdg_autostart_generate_desktop_condition(
|
|||||||
log_full_errno(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, r,
|
log_full_errno(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, r,
|
||||||
"%s not found: %m", test_binary);
|
"%s not found: %m", test_binary);
|
||||||
fprintf(f, "# ExecCondition using %s skipped due to missing binary.\n", test_binary);
|
fprintf(f, "# ExecCondition using %s skipped due to missing binary.\n", test_binary);
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
e_autostart_condition = cescape(condition);
|
e_autostart_condition = cescape(condition);
|
||||||
|
Loading…
Reference in New Issue
Block a user