1
0
mirror of https://github.com/systemd/systemd synced 2026-03-23 23:34:52 +01:00

Compare commits

...

14 Commits

Author SHA1 Message Date
Franck Bui
463aef23a7 manager: reexecute on SIGRTMIN+25, user instances only
Before this patch, there was no way to request all running user instances for
reexecuting. However this can be useful especially during package updates
otherwise user instances are never updated and keep running a potentially very
old version of the binaries.

Now assuming that we have enough priviledge, it's possible to request
reexecution of all user instances:

  systemctl kill --signal=SIGRTMIN+25 "user@*.service"

Note that this request is obviously asynchronous as it relies on a
signal. Keeping "systemctl kill" as the only interface should be good enough to
make this obvious and that's the reason why another interface, such as
"systemctl --global daemon-reexec" has not been considered.

PID1 already uses SIGTERM for reexecuting hence sending it SIGRTMIN+25 is a
nop.
2021-07-28 18:50:30 +02:00
Lennart Poettering
fac5588944 update TODO 2021-07-28 18:39:17 +02:00
Yegor Alexeyev
caf8c6ea3f added missing handling of button release events 2021-07-28 17:34:31 +02:00
Yao Wei
f238549b5a Use SKU to identify Dell clamshell models for accelerometer properties
As per request from Dell, we need to use sku property of modalias that
is patched into linux 5.13 for model identification:

  https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e26f023e01ef26b4138bc1099af309bdc4523d23
2021-07-28 17:10:22 +02:00
Luca Boccassi
a8d1a8e96d
Merge pull request #20326 from keszybz/meson-0.53.2
Use some more new meson features
2021-07-28 13:30:37 +01:00
Luca Boccassi
8d5b391b19
Merge pull request #20311 from keszybz/manpage-l10n-report
Man pages cleanups
2021-07-28 12:37:39 +01:00
Zbigniew Jędrzejewski-Szmek
e04eae5e1c man/systemctl: rework descriptions of bind and mount-image
The text used "unit's view" to mean mount namespace. But we talk about
mount namespaces in the later part of the paragraph anyway, so trying to
use an "approachable term" only makes the whole thing harder to understand.
Let's use the precise term.

Some paragraph-breaking and re-indentation is done too.
2021-07-28 10:21:21 +02:00
Zbigniew Jędrzejewski-Szmek
12085ebb40 meson: use meson's summary()
The output is similar to our hand-crafted status message, but it's nice to use
the built-in functionality. After all, it was amended during development to
support our use case.
2021-07-28 10:04:06 +02:00
Zbigniew Jędrzejewski-Szmek
f12c5d36a9 meson: use alias_target for doc update commands
This undoes part of 4c890ad3cc7b3445683d7b52bc00e4a58bef5e94: the
implementations of update-dbus-docs and update-man-rules are moved back to
man/meson.build, and alias_target() is used to keep the visible target names
unchanged.

The rules for man pages are reworked so that it's possible to invoke the
targets even if xstlproc is not available. After all, xsltproc is only needed
for the final formatted output, and not other processing.
2021-07-27 20:34:40 +02:00
Zbigniew Jędrzejewski-Szmek
6839ce3318 meson: use alias_target in one place
It was added in meson 0.52.0, and fits very nicely here.
See https://mesonbuild.com/Release-notes-for-0-52-0.html#alias_target.
2021-07-27 19:58:55 +02:00
Zbigniew Jędrzejewski-Szmek
fce9abb227 meson: use a/b instead of join_paths(a,b)
It is nicer and shorter.
2021-07-27 19:32:35 +02:00
Zbigniew Jędrzejewski-Szmek
dab1fe1a8e man/tmpfiles.d: rewrite the description of age-by 2021-07-27 09:43:29 +02:00
Zbigniew Jędrzejewski-Szmek
d6029680df man: use title of docs/ pages when referring to them
There is some inconsistency, partially caused by the awkward naming
of the docs/ pages. But let's be consistent and use the "official" title.
If we ever change plural↔singular, we should use the same form everywhere.
2021-07-27 09:43:29 +02:00
Zbigniew Jędrzejewski-Szmek
be0d27ee0c man: fix assorted issues reported by the manpage-l10n project
Fixes #20297.
2021-07-27 09:43:29 +02:00
54 changed files with 545 additions and 486 deletions

2
TODO
View File

@ -83,6 +83,8 @@ Janitorial Clean-ups:
Features: Features:
* use credentials logic/TPM2 logic to store homed signing key
* New udev block device symlink names: * New udev block device symlink names:
/dev/disk/by-parttypelabel/<pttype>/<ptlabel>. Use case: if pt label is used /dev/disk/by-parttypelabel/<pttype>/<ptlabel>. Use case: if pt label is used
as partition image version string, this is a safe way to reference a specific as partition image version string, this is a safe way to reference a specific

View File

@ -289,10 +289,10 @@ sensor:modalias:acpi:*KIOX000A*:dmi:*svn*CytrixTechnology:*pn*Complex11t:*
sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:pnVostro5581:* sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:pnVostro5581:*
ACCEL_LOCATION=base ACCEL_LOCATION=base
sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:pnLatitude9520:*:ct10:* sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:sku0A3E:*
ACCEL_LOCATION=base ACCEL_LOCATION=base
sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:pnLatitude7420:* sensor:modalias:platform:HID-SENSOR-200073:dmi:*svnDell*:sku0B0B:*
ACCEL_LOCATION=base ACCEL_LOCATION=base
# Dell Venue 8 Pro 3845 # Dell Venue 8 Pro 3845

View File

@ -49,7 +49,7 @@ if conf.get('ENABLE_HWDB') == 1
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'udev/hwdb.d'))) mkdir_p.format(sysconfdir / 'udev/hwdb.d'))
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
'test -n "$DESTDIR" || @0@/systemd-hwdb update'.format(rootbindir)) 'test -n "$DESTDIR" || @0@/systemd-hwdb update'.format(rootbindir))

View File

@ -240,8 +240,8 @@
<varlistentry> <varlistentry>
<term><option>--make-machine-id-directory=yes|no|auto</option></term> <term><option>--make-machine-id-directory=yes|no|auto</option></term>
<listitem><para>Control creation and deletion of the top-level machine ID directory on the file <listitem><para>Control creation and deletion of the top-level machine ID directory on the file
system containing boot loader entries (i.e. beneath the file system returned by system containing boot loader entries (i.e. beneath the file system returned by the
<option>--print-boot-path</option> above) during <option>install</option> and <option>--print-boot-path</option> option, see above) during <option>install</option> and
<option>remove</option>, respectively. <literal>auto</literal> is equivalent to <option>remove</option>, respectively. <literal>auto</literal> is equivalent to
<literal>yes</literal> if <filename>/etc/machine-id</filename> resides on a filesystem other than <literal>yes</literal> if <filename>/etc/machine-id</filename> resides on a filesystem other than
tmpfs and <literal>no</literal> otherwise (in the latter case the machine ID is likely transient and tmpfs and <literal>no</literal> otherwise (in the latter case the machine ID is likely transient and

View File

@ -83,12 +83,9 @@
<varlistentry> <varlistentry>
<term><varname>ProcessSizeMax=</varname></term> <term><varname>ProcessSizeMax=</varname></term>
<listitem><para>The maximum size in bytes of a core <listitem><para>The maximum size in bytes of a core which will be processed. Core dumps exceeding
which will be processed. Core dumps exceeding this size this size may be stored, but the backtrace will not be generated. Like other sizes in this same
may be stored, but the backtrace will not be generated. config file, the usual suffixes to the base of 1024 are allowed (B, K, M, G, T, P, and E).</para>
Like other sizes in this same config file, the usual
suffixes to the base of 1024 are allowed (B, K, M,
G, T, P, and E.)</para>
<para>Setting <varname>Storage=none</varname> and <varname>ProcessSizeMax=0</varname> <para>Setting <varname>Storage=none</varname> and <varname>ProcessSizeMax=0</varname>
disables all coredump handling except for a log entry.</para> disables all coredump handling except for a log entry.</para>
@ -99,9 +96,8 @@
<term><varname>ExternalSizeMax=</varname></term> <term><varname>ExternalSizeMax=</varname></term>
<term><varname>JournalSizeMax=</varname></term> <term><varname>JournalSizeMax=</varname></term>
<listitem><para>The maximum (compressed or uncompressed) size in bytes of a <listitem><para>The maximum (compressed or uncompressed) size in bytes of a core to be saved. Unit
core to be saved. Unit suffixes are allowed just as in suffixes are allowed just as in <option>ProcessSizeMax=</option>.</para></listitem>
<option>ProcessSizeMax=</option></para></listitem>.
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -120,9 +116,8 @@
by core dumps might temporarily exceed these limits while by core dumps might temporarily exceed these limits while
core dumps are processed. Note that old core dumps are also core dumps are processed. Note that old core dumps are also
removed based on time via removed based on time via
<citerefentry><refentrytitle>systemd-tmpfiles</refentrytitle><manvolnum>8</manvolnum></citerefentry>. Set <citerefentry><refentrytitle>systemd-tmpfiles</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
either value to 0 to turn off size-based Set either value to 0 to turn off size-based cleanup.</para></listitem>
clean-up.</para></listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>

View File

@ -162,7 +162,7 @@
<term><option>-1</option></term> <term><option>-1</option></term>
<listitem><para>Show information of the most recent core dump only, instead of listing all known core <listitem><para>Show information of the most recent core dump only, instead of listing all known core
dumps. (Equivalent to <option>--reverse -n 1</option></para></listitem> dumps. Equivalent to <option>--reverse -n 1</option>.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View File

@ -37,7 +37,7 @@ man_pages = []
html_pages = [] html_pages = []
source_xml_files = [] source_xml_files = []
dbus_docs = [] dbus_docs = []
foreach tuple : xsltproc.found() ? manpages : [] foreach tuple : manpages
stem = tuple[0] stem = tuple[0]
section = tuple[1] section = tuple[1]
aliases = tuple[2] aliases = tuple[2]
@ -54,49 +54,50 @@ foreach tuple : xsltproc.found() ? manpages : []
htmlaliases += alias + '.html' htmlaliases += alias + '.html'
endforeach endforeach
mandirn = join_paths(get_option('mandir'), 'man' + section) mandirn = get_option('mandir') / ('man' + section)
if condition == '' or conf.get(condition) == 1 if condition == '' or conf.get(condition) == 1
p1 = custom_target(
man,
input : xml,
output : [man] + manaliases,
command : xslt_cmd + [custom_man_xsl, '@INPUT@'],
depends : custom_entities_ent,
install : want_man,
install_dir : mandirn)
man_pages += p1
p2 = []
foreach htmlalias : htmlaliases
link = custom_target(
htmlalias,
output : htmlalias,
command : [ln, '-fs', html, '@OUTPUT@'])
if want_html
dst = join_paths(docdir, 'html', htmlalias)
cmd = 'ln -fs @0@ $DESTDIR@1@'.format(html, dst)
meson.add_install_script('sh', '-c', cmd)
p2 += link
endif
html_pages += link
endforeach
p3 = custom_target(
html,
input : xml,
output : html,
command : xslt_cmd + [custom_html_xsl, '@INPUT@'],
depends : [custom_entities_ent, p2],
install : want_html,
install_dir : join_paths(docdir, 'html'))
html_pages += p3
file = files(tuple[0] + '.xml') file = files(tuple[0] + '.xml')
source_xml_files += file
if tuple[0].startswith('org.freedesktop.') if tuple[0].startswith('org.freedesktop.')
dbus_docs += file dbus_docs += file
endif endif
if xsltproc.found()
p1 = custom_target(
man,
input : xml,
output : [man] + manaliases,
command : xslt_cmd + [custom_man_xsl, '@INPUT@'],
depends : custom_entities_ent,
install : want_man,
install_dir : mandirn)
man_pages += p1
p2 = []
foreach htmlalias : htmlaliases
link = custom_target(
htmlalias,
output : htmlalias,
command : [ln, '-fs', html, '@OUTPUT@'])
if want_html
dst = docdir / 'html' / htmlalias
cmd = 'ln -fs @0@ $DESTDIR@1@'.format(html, dst)
meson.add_install_script('sh', '-c', cmd)
p2 += link
endif
html_pages += link
endforeach
p3 = custom_target(
html,
input : xml,
output : html,
command : xslt_cmd + [custom_html_xsl, '@INPUT@'],
depends : [custom_entities_ent, p2],
install : want_html,
install_dir : docdir / 'html')
html_pages += p3
endif
else else
message('Skipping @0@.@1@ because @2@ is false'.format(stem, section, condition)) message('Skipping @0@.@1@ because @2@ is false'.format(stem, section, condition))
endif endif
@ -132,7 +133,7 @@ foreach tuple : xsltproc.found() ? [['systemd.directives', '7', systemd_directiv
html = stem + '.html' html = stem + '.html'
man = stem + '.' + section man = stem + '.' + section
mandirn = join_paths(get_option('mandir'), 'man' + section) mandirn = get_option('mandir') / ('man' + section)
p1 = custom_target( p1 = custom_target(
man, man,
@ -152,7 +153,7 @@ foreach tuple : xsltproc.found() ? [['systemd.directives', '7', systemd_directiv
output : htmlalias, output : htmlalias,
command : [ln, '-fs', html, '@OUTPUT@']) command : [ln, '-fs', html, '@OUTPUT@'])
if want_html if want_html
dst = join_paths(docdir, 'html', htmlalias) dst = docdir / 'html' / htmlalias
cmd = 'ln -fs @0@ $DESTDIR@1@'.format(html, dst) cmd = 'ln -fs @0@ $DESTDIR@1@'.format(html, dst)
meson.add_install_script('sh', '-c', cmd) meson.add_install_script('sh', '-c', cmd)
p2 += link p2 += link
@ -167,7 +168,7 @@ foreach tuple : xsltproc.found() ? [['systemd.directives', '7', systemd_directiv
command : xslt_cmd + [custom_html_xsl, '@INPUT@'], command : xslt_cmd + [custom_html_xsl, '@INPUT@'],
depends : [custom_entities_ent, p2], depends : [custom_entities_ent, p2],
install : want_html and have_lxml, install : want_html and have_lxml,
install_dir : join_paths(docdir, 'html')) install_dir : docdir / 'html')
html_pages += p3 html_pages += p3
endforeach endforeach
@ -213,3 +214,26 @@ configure_file(
input : 'html.in', input : 'html.in',
output : 'html', output : 'html',
configuration : buildroot_substs) configuration : buildroot_substs)
############################################################
update_dbus_docs = custom_target(
'update-dbus-docs',
output : 'update-dbus-docs',
command : [update_dbus_docs_py, '--build-dir', project_build_root, '@INPUT@'],
input : dbus_docs)
if conf.get('BUILD_MODE_DEVELOPER') == 1
test('dbus-docs-fresh',
update_dbus_docs_py,
args : ['--build-dir', project_build_root, '--test', dbus_docs])
endif
update_man_rules = custom_target(
'update-man-rules',
output : 'update-man-rules',
command : [sh, '-c',
'cd @0@ && '.format(project_build_root) +
'python3 @0@/tools/update-man-rules.py $(find @0@ -wholename "*/man/*.xml") >t && '.format(project_source_root) +
'mv t @0@/rules/meson.build'.format(meson.current_source_dir())],
depends : custom_entities_ent)

View File

@ -67,7 +67,7 @@
<para>This is a simple mechanism to provide static user and group records via JSON drop-in files. Such <para>This is a simple mechanism to provide static user and group records via JSON drop-in files. Such
user records should be defined in the format described by the <ulink user records should be defined in the format described by the <ulink
url="https://systemd.io/USER_RECORD">JSON User Record</ulink> specification and be placed in one of the url="https://systemd.io/USER_RECORD">JSON User Records</ulink> specification and be placed in one of the
aforementioned directories under a file name composed of the user name suffixed with aforementioned directories under a file name composed of the user name suffixed with
<filename>.user</filename>, with a world-readable access mode. A symlink named after the user record's <filename>.user</filename>, with a world-readable access mode. A symlink named after the user record's
UID formatted in decimal and suffixed with <filename>.user</filename> pointing to the primary record file UID formatted in decimal and suffixed with <filename>.user</filename> pointing to the primary record file

View File

@ -373,7 +373,7 @@
<listitem><para>A lower-case string (mostly numeric, no spaces or other characters outside of 09, <listitem><para>A lower-case string (mostly numeric, no spaces or other characters outside of 09,
az, ".", "_" and "-") identifying the operating system extensions support level, to indicate which az, ".", "_" and "-") identifying the operating system extensions support level, to indicate which
extension images are supported. See: extension images are supported. See
<citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry>) <citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry>)
for more information.</para> for more information.</para>

View File

@ -33,7 +33,7 @@
and hence the systemd control group hierarchy.</para> and hence the systemd control group hierarchy.</para>
<para>The module also applies various resource management and runtime parameters to the new session, as <para>The module also applies various resource management and runtime parameters to the new session, as
configured in the <ulink url="https://systemd.io/USER_RECORD">JSON User Record</ulink> of the user, when configured in the <ulink url="https://systemd.io/USER_RECORD">JSON User Records</ulink> of the user, when
one is defined.</para> one is defined.</para>
<para>On login, this module — in conjunction with <filename>systemd-logind.service</filename> — ensures the <para>On login, this module — in conjunction with <filename>systemd-logind.service</filename> — ensures the

View File

@ -452,8 +452,8 @@
<para>If the special value <literal>auto</literal> is specified, the source to copy from is <para>If the special value <literal>auto</literal> is specified, the source to copy from is
automatically picked up from the running system (or the image specified with automatically picked up from the running system (or the image specified with
<option>--image=</option> — if used). A partition that matches both the configured partition type (as <option>--image=</option> — if used). A partition that matches both the configured partition type (as
declared with <varname>Type=</varname> above), and the currently mounted directory appropriate for declared with <varname>Type=</varname> described above), and the currently mounted directory
that partition type is determined. For example, if the partition type is set to appropriate for that partition type is determined. For example, if the partition type is set to
<literal>root</literal> the partition backing the root directory (<filename>/</filename>) is used as <literal>root</literal> the partition backing the root directory (<filename>/</filename>) is used as
source to copy from — if its partition type is set to <literal>root</literal> as well. If the source to copy from — if its partition type is set to <literal>root</literal> as well. If the
declared type is <literal>usr</literal> the partition backing <filename>/usr/</filename> is used as declared type is <literal>usr</literal> the partition backing <filename>/usr/</filename> is used as
@ -529,7 +529,7 @@
<varlistentry> <varlistentry>
<term><varname>MakeDirectories=</varname></term> <term><varname>MakeDirectories=</varname></term>
<listitem><para>akes one or more absolute paths, separated by whitespace, each declaring a directory <listitem><para>Takes one or more absolute paths, separated by whitespace, each declaring a directory
to create within the new file system. Behaviour is similar to <varname>CopyFiles=</varname>, but to create within the new file system. Behaviour is similar to <varname>CopyFiles=</varname>, but
instead of copying in a set of files this just creates the specified directories with the default instead of copying in a set of files this just creates the specified directories with the default
mode of 0755 owned by the root user and group, plus all their parent directories (with the same mode of 0755 owned by the root user and group, plus all their parent directories (with the same
@ -564,10 +564,10 @@
are copied in or the file system configured with <varname>Format=</varname> is created.</para> are copied in or the file system configured with <varname>Format=</varname> is created.</para>
<para>The LUKS2 UUID is automatically derived from the partition UUID in a stable fashion. If <para>The LUKS2 UUID is automatically derived from the partition UUID in a stable fashion. If
<literal>key-file</literal> or <literal>key-file+tpm2</literal> is used a key is added to the LUKS2 <literal>key-file</literal> or <literal>key-file+tpm2</literal> is used, a key is added to the LUKS2
superblock, configurable with the <option>--key-file=</option> switch to superblock, configurable with the <option>--key-file=</option> option to
<command>systemd-repart</command>. If <literal>tpm2</literal> or <literal>key-file+tpm2</literal> is <command>systemd-repart</command>. If <literal>tpm2</literal> or <literal>key-file+tpm2</literal> is
used a key is added to the LUKS2 superblock that is enrolled to the local TPM2 chip, as configured used, a key is added to the LUKS2 superblock that is enrolled to the local TPM2 chip, as configured
with the <option>--tpm2-device=</option> and <option>--tpm2-pcrs=</option> options to with the <option>--tpm2-device=</option> and <option>--tpm2-pcrs=</option> options to
<command>systemd-repart</command>.</para> <command>systemd-repart</command>.</para>
@ -623,7 +623,7 @@
has no effect on explicit mounts, such as those done via <citerefentry has no effect on explicit mounts, such as those done via <citerefentry
project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry> or project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry> or
<citerefentry <citerefentry
project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry></para> project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
<para>If both bit 50 and 59 are set for a partition (i.e. the partition is marked both read-only and <para>If both bit 50 and 59 are set for a partition (i.e. the partition is marked both read-only and
marked for file system growing) the latter is typically without effect: the read-only flag takes marked for file system growing) the latter is typically without effect: the read-only flag takes

View File

@ -552,38 +552,62 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><command>bind</command> <replaceable>UNIT</replaceable> <replaceable>PATH</replaceable> [<replaceable>PATH</replaceable>]</term> <term>
<command>bind</command>
<replaceable>UNIT</replaceable>
<replaceable>PATH</replaceable>
[<replaceable>PATH</replaceable>]
</term>
<listitem><para>Bind mounts a file or directory from the host into the specified unit's view. The first path <listitem><para>Bind-mounts a file or directory from the host into the specified unit's mount
argument is the source file or directory on the host, the second path argument is the destination file or namespace. The first path argument is the source file or directory on the host, the second path
directory in the unit's view. When the latter is omitted, the destination path in the unit's view is the same as argument is the destination file or directory in the unit's mount namespace. When the latter is
the source path on the host. When combined with the <option>--read-only</option> switch, a ready-only bind omitted, the destination path in the unit's mount namespace is the same as the source path on the
mount is created. When combined with the <option>--mkdir</option> switch, the destination path is first created host. When combined with the <option>--read-only</option> switch, a ready-only bind mount is
before the mount is applied. Note that this option is currently only supported for units that run within a mount created. When combined with the <option>--mkdir</option> switch, the destination path is first
namespace (e.g.: with <option>RootImage=</option>, <option>PrivateMounts=</option>, etc.). This command supports bind created before the mount is applied.</para>
mounting directories, regular files, device nodes, <constant>AF_UNIX</constant> socket nodes, as well as FIFOs.
The bind mount is ephemeral, and it is undone as soon as the current unit process exists. <para>Note that this option is currently only supported for units that run within a mount namespace
Note that the namespace mentioned here, where the bind mount will be added to, is the one where the main service (e.g.: with <option>RootImage=</option>, <option>PrivateMounts=</option>, etc.). This command
process runs, as other processes run in distinct namespaces (e.g.: <option>ExecReload=</option>, supports bind-mounting directories, regular files, device nodes, <constant>AF_UNIX</constant>
<option>ExecStartPre=</option>, etc.) </para></listitem> socket nodes, as well as FIFOs. The bind mount is ephemeral, and it is undone as soon as the
current unit process exists. Note that the namespace mentioned here, where the bind mount will be
added to, is the one where the main service process runs. Other processes (those exececuted by
<option>ExecReload=</option>, <option>ExecStartPre=</option>, etc.) run in distinct namespaces.
</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><command>mount-image</command> <replaceable>UNIT</replaceable> <replaceable>IMAGE</replaceable> [<replaceable>PATH</replaceable> [<replaceable>PARTITION_NAME</replaceable>:<replaceable>MOUNT_OPTIONS</replaceable>]]</term> <term>
<command>mount-image</command>
<replaceable>UNIT</replaceable>
<replaceable>IMAGE</replaceable>
[<replaceable>PATH</replaceable>
[<replaceable>PARTITION_NAME</replaceable>:<replaceable>MOUNT_OPTIONS</replaceable>]]
</term>
<listitem><para>Mounts an image from the host into the specified unit's view. The first path argument is the source <listitem><para>Mounts an image from the host into the specified unit's mount namespace. The first
image on the host, the second path argument is the destination directory in the unit's view (ie: inside path argument is the source image on the host, the second path argument is the destination
<option>RootImage=</option>/<option>RootDirectory=</option>). Any following argument is interpreted as a directory in the unit's mount namespace (i.e. inside
colon-separated tuple of partition name and comma-separated list of mount options for that partition. The format is the <option>RootImage=</option>/<option>RootDirectory=</option>). The following argument, if any, is
same as the service <option>MountImages=</option> setting. When combined with the <option>--read-only</option> switch, a interpreted as a colon-separated tuple of partition name and comma-separated list of mount options
ready-only mount is created. When combined with the <option>--mkdir</option> switch, the destination path is first for that partition. The format is the same as the service <option>MountImages=</option>
created before the mount is applied. Note that this option is currently only supported for units that run within a mount setting. When combined with the <option>--read-only</option> switch, a ready-only mount is
namespace (e.g.: with <option>RootImage=</option>, <option>PrivateMounts=</option>, etc.). created. When combined with the <option>--mkdir</option> switch, the destination path is first
Note that the namespace mentioned here, where the image mount will be added to, is the one where the main service created before the mount is applied.</para>
process runs, as other processes run in distinct namespaces (e.g.: <option>ExecReload=</option>,
<option>ExecStartPre=</option>, etc.). Example: <para>Note that this option is currently only supported for units that run within a mount namespace
(i.e. with <option>RootImage=</option>, <option>PrivateMounts=</option>, etc.). Note that the
namespace mentioned here where the image mount will be added to, is the one where the main service
process runs. Note that the namespace mentioned here, where the bind mount will be
added to, is the one where the main service process runs. Other processes (those exececuted by
<option>ExecReload=</option>, <option>ExecStartPre=</option>, etc.) run in distinct namespaces.
</para>
<para>Example:
<programlisting>systemctl mount-image foo.service /tmp/img.raw /var/lib/image root:ro,nosuid</programlisting> <programlisting>systemctl mount-image foo.service /tmp/img.raw /var/lib/image root:ro,nosuid</programlisting>
<programlisting>systemctl mount-image --mkdir bar.service /tmp/img.raw /var/lib/baz/img</programlisting></para></listitem> <programlisting>systemctl mount-image --mkdir bar.service /tmp/img.raw /var/lib/baz/img</programlisting>
</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -2185,9 +2209,9 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>--lines=</option></term> <term><option>--lines=</option></term>
<listitem> <listitem>
<para>When used with <command>status</command>, controls the number of journal lines to show, counting from <para>When used with <command>status</command>, controls the number of journal lines to show,
the most recent ones. Takes a positive integer argument, or 0 to disable journal output. Defaults to counting from the most recent ones. Takes a positive integer argument, or 0 to disable journal
10.</para> output. Defaults to 10.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -2208,8 +2232,9 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>--firmware-setup</option></term> <term><option>--firmware-setup</option></term>
<listitem> <listitem>
<para>When used with the <command>reboot</command> command, indicate to the system's firmware to reboot into <para>When used with the <command>reboot</command> command, indicate to the system's firmware to
the firmware setup interface. Note that this functionality is not available on all systems.</para> reboot into the firmware setup interface. Note that this functionality is not available on all
systems.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -2217,10 +2242,10 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>--boot-loader-menu=</option></term> <term><option>--boot-loader-menu=</option></term>
<listitem> <listitem>
<para>When used with the <command>reboot</command> command, indicate to the system's boot loader to show the <para>When used with the <command>reboot</command> command, indicate to the system's boot loader to
boot loader menu on the following boot. Takes a time value as parameter — indicating the menu timeout. Pass show the boot loader menu on the following boot. Takes a time value as parameter — indicating the
zero in order to disable the menu timeout. Note that not all boot loaders support this menu timeout. Pass zero in order to disable the menu timeout. Note that not all boot loaders
functionality.</para> support this functionality.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -2228,10 +2253,10 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<term><option>--boot-loader-entry=</option></term> <term><option>--boot-loader-entry=</option></term>
<listitem> <listitem>
<para>When used with the <command>reboot</command> command, indicate to the system's boot loader to boot into <para>When used with the <command>reboot</command> command, indicate to the system's boot loader to
a specific boot loader entry on the following boot. Takes a boot loader entry identifier as argument, or boot into a specific boot loader entry on the following boot. Takes a boot loader entry identifier
<literal>help</literal> in order to list available entries. Note that not all boot loaders support this as argument, or <literal>help</literal> in order to list available entries. Note that not all boot
functionality.</para> loaders support this functionality.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -84,7 +84,7 @@
<term><option>--pkcs11-token-uri=</option><replaceable>URI</replaceable></term> <term><option>--pkcs11-token-uri=</option><replaceable>URI</replaceable></term>
<listitem><para>Enroll a PKCS#11 security token or smartcard (e.g. a YubiKey). Expects a PKCS#11 <listitem><para>Enroll a PKCS#11 security token or smartcard (e.g. a YubiKey). Expects a PKCS#11
smart card URI referring to the token. Alternatively the special value <literal>auto</literal> may smartcard URI referring to the token. Alternatively the special value <literal>auto</literal> may
be specified, in order to automatically determine the URI of a currently plugged in security token be specified, in order to automatically determine the URI of a currently plugged in security token
(of which there must be exactly one). The special value <literal>list</literal> may be used to (of which there must be exactly one). The special value <literal>list</literal> may be used to
enumerate all suitable PKCS#11 tokens currently plugged in. The security token must contain an RSA enumerate all suitable PKCS#11 tokens currently plugged in. The security token must contain an RSA

View File

@ -307,7 +307,7 @@
<varlistentry> <varlistentry>
<term><literal>passwd.shell.root</literal></term> <term><literal>passwd.shell.root</literal></term>
<listitem><para>Specifies the shell binary to use for the specified account when creating it. <listitem><para>Specifies the shell binary to use for the specified account.
Equivalent to the credential of the same name defined for the Equivalent to the credential of the same name defined for the
<citerefentry><refentrytitle>systemd-sysusers.service</refentrytitle><manvolnum>8</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd-sysusers.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
service.</para></listitem> service.</para></listitem>

View File

@ -90,7 +90,7 @@
<varlistentry> <varlistentry>
<term><option>--image=<replaceable>path</replaceable></option></term> <term><option>--image=<replaceable>path</replaceable></option></term>
<listitem><para>Takes a path to a device node or refular file as argument. This is similar to <listitem><para>Takes a path to a device node or regular file as argument. This is similar to
<option>--root=</option> as described above, but operates on a disk image instead of a directory <option>--root=</option> as described above, but operates on a disk image instead of a directory
tree.</para></listitem> tree.</para></listitem>
</varlistentry> </varlistentry>

View File

@ -1375,12 +1375,12 @@ After=sys-subsystem-net-devices-ens1.device</programlisting>
</orderedlist> </orderedlist>
<para>The combination of the three operations above ensures that it is possible to log into the <para>The combination of the three operations above ensures that it is possible to log into the
host's user account inside the container as if it was local to the container. The user is only mapped container using the same account information as on the host. The user is only mapped transiently,
transiently, while the container is running and the mapping itself does not result in persistent while the container is running, and the mapping itself does not result in persistent changes to the
changes to the container (except maybe for generated log messages at login time, and similar). Note container (except maybe for log messages generated at login time, and similar). Note that in
that in particular the UID/GID assignment in the container is not made persistently. If the user is particular the UID/GID assignment in the container is not made persistently. If the user is mapped
mapped transiently, it is best to not allow the user to make persistent changes to the container. If transiently, it is best to not allow the user to make persistent changes to the container. If the
the user leaves files or directories owned by the user, and those UIDs/GIDs are recycled during later user leaves files or directories owned by the user, and those UIDs/GIDs are reused during later
container invocations (possibly with a different <option>--bind-user=</option> mapping), those files container invocations (possibly with a different <option>--bind-user=</option> mapping), those files
and directories will be accessible to the "new" user.</para> and directories will be accessible to the "new" user.</para>
@ -1581,9 +1581,9 @@ After=sys-subsystem-net-devices-ens1.device</programlisting>
-b</programlisting> -b</programlisting>
<para>The above command line will invoke the specified image file <filename>image.raw</filename> in <para>The above command line will invoke the specified image file <filename>image.raw</filename> in
volatile mode, i.e with an empty <filename>/etc/</filename> and <filename>/var/</filename>, so that volatile mode, i.e. with empty <filename>/etc/</filename> and <filename>/var/</filename>. The
the container's payload recognizes this as first boot condition, and will invoke container payload will recognize this as a first boot, and will invoke
<filename>systemd-firstboot.service</filename>, which then read the two passed credentials to <filename>systemd-firstboot.service</filename>, which then reads the two passed credentials to
configure the system's initial locale and root password.</para> configure the system's initial locale and root password.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -35,8 +35,8 @@
<para>Most of <command>systemd-portabled</command>'s functionality is accessible through the <para>Most of <command>systemd-portabled</command>'s functionality is accessible through the
<citerefentry><refentrytitle>portablectl</refentrytitle><manvolnum>1</manvolnum></citerefentry> command.</para> <citerefentry><refentrytitle>portablectl</refentrytitle><manvolnum>1</manvolnum></citerefentry> command.</para>
<para>See the <ulink url="https://systemd.io/PORTABLE_SERVICES">Portable <para>See <ulink url="https://systemd.io/PORTABLE_SERVICES">Portable Services</ulink> for details about
Services Documentation</ulink> for details about the concepts this service implements.</para> the concepts this service implements.</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -275,7 +275,7 @@ search foobar.com barbar.com
fragility in both directions: a valid global name could be obscured by a local name, and resolution of fragility in both directions: a valid global name could be obscured by a local name, and resolution of
a relative local name could suddenly break when a new top-level domain is created, or when a new a relative local name could suddenly break when a new top-level domain is created, or when a new
subdomain of a top-level domain in registered. Resolving any given name as either relative or absolute subdomain of a top-level domain in registered. Resolving any given name as either relative or absolute
avoids this ambiguity.)</para></footnote></para></listitem> avoids this ambiguity.</para></footnote></para></listitem>
<listitem><para>This resolver has a notion of the special <literal>.local</literal> domain used for <listitem><para>This resolver has a notion of the special <literal>.local</literal> domain used for
MulticastDNS, and will not route queries with that suffix to unicast DNS servers unless explicitly MulticastDNS, and will not route queries with that suffix to unicast DNS servers unless explicitly

View File

@ -46,7 +46,7 @@
operating system tree. When one or more system extension images are activated, their operating system tree. When one or more system extension images are activated, their
<filename>/usr/</filename> and <filename>/opt/</filename> hierarchies are combined via <filename>/usr/</filename> and <filename>/opt/</filename> hierarchies are combined via
<literal>overlayfs</literal> with the same hierarchies of the host OS, and the host <literal>overlayfs</literal> with the same hierarchies of the host OS, and the host
<filename>/usr/</filename> and <filename>/opt</filename> overmounted with it ("merging"). When they are <filename>/usr/</filename> and <filename>/opt/</filename> overmounted with it ("merging"). When they are
deactivated, the mount point is disassembled — again revealing the unmodified original host version of deactivated, the mount point is disassembled — again revealing the unmodified original host version of
the hierarchy ("unmerging"). Merging thus makes the extension's resources suddenly appear below the the hierarchy ("unmerging"). Merging thus makes the extension's resources suddenly appear below the
<filename>/usr/</filename> and <filename>/opt/</filename> hierarchies as if they were included in the <filename>/usr/</filename> and <filename>/opt/</filename> hierarchies as if they were included in the
@ -71,7 +71,7 @@
<orderedlist> <orderedlist>
<listitem><para>Plain directories or btrfs subvolumes containing the OS tree</para></listitem> <listitem><para>Plain directories or btrfs subvolumes containing the OS tree</para></listitem>
<listitem><para>Disk images with a GPT disk label, following the <ulink <listitem><para>Disk images with a GPT disk label, following the <ulink
url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partition Specification</ulink></para></listitem> url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partitions Specification</ulink></para></listitem>
<listitem><para>Disk images lacking a partition table, with a naked Linux file system (e.g. squashfs or ext4)</para></listitem> <listitem><para>Disk images lacking a partition table, with a naked Linux file system (e.g. squashfs or ext4)</para></listitem>
</orderedlist> </orderedlist>
@ -127,13 +127,15 @@
<title>Uses</title> <title>Uses</title>
<para>The primary use case for system images are immutable environments where debugging and development <para>The primary use case for system images are immutable environments where debugging and development
tools shall optionally be made available, but not included in the immutable base OS image itself tools shall optionally be made available, but not included in the immutable base OS image itself (e.g.
(e.g. <filename>strace</filename> and <filename>gdb</filename> shall be an optionally installable <citerefentry project='man-pages'><refentrytitle>strace</refentrytitle><manvolnum>1</manvolnum></citerefentry>
addition in order to make debugging/development easier). System extension images should not be and
misunderstood as a generic software packaging framework, as no dependency scheme is available: system <citerefentry project='man-pages'><refentrytitle>gdb</refentrytitle><manvolnum>1</manvolnum></citerefentry>
extensions should carry all files they need themselves, except for those already shipped in the shall be an optionally installable addition in order to make debugging/development easier). System
underlying host system image. Typically, system extension images are built at the same time as the base extension images should not be misunderstood as a generic software packaging framework, as no dependency
OS image — within the same build system.</para> scheme is available: system extensions should carry all files they need themselves, except for those
already shipped in the underlying host system image. Typically, system extension images are built at the
same time as the base OS image — within the same build system.</para>
<para>Another use case for the system extension concept is temporarily overriding OS supplied resources <para>Another use case for the system extension concept is temporarily overriding OS supplied resources
with newer ones, for example to install a locally compiled development version of some low-level with newer ones, for example to install a locally compiled development version of some low-level

View File

@ -262,7 +262,7 @@
names in status messages (e.g. <literal>systemd-journald.service</literal>), instead of the longer names in status messages (e.g. <literal>systemd-journald.service</literal>), instead of the longer
and more informative descriptions set with <varname>Description=</varname> (e.g. <literal>Journal and more informative descriptions set with <varname>Description=</varname> (e.g. <literal>Journal
Logging Service</literal>). If <option>combined</option>, the system manager will use both unit names Logging Service</literal>). If <option>combined</option>, the system manager will use both unit names
and descriptions in status messages (e.g. <literal>systemdmd-jouranld.service - Journal Logging and descriptions in status messages (e.g. <literal>systemd-journald.service - Journal Logging
Service</literal>).</para> Service</literal>).</para>
<para>See <para>See

View File

@ -34,14 +34,14 @@
JSON user/group records from classic UNIX/glibc NSS user/group records in order to provide full backwards JSON user/group records from classic UNIX/glibc NSS user/group records in order to provide full backwards
compatibility. It may also pick up statically defined JSON user/group records from drop-in files in compatibility. It may also pick up statically defined JSON user/group records from drop-in files in
<filename>/etc/userdb/</filename>, <filename>/run/userdb/</filename>, <filename>/etc/userdb/</filename>, <filename>/run/userdb/</filename>,
<filename>/run/host/userdb/</filename> and <filename>/use/lib/userdb/</filename>.</para> <filename>/run/host/userdb/</filename> and <filename>/usr/lib/userdb/</filename>.</para>
<para>Most of <command>systemd-userdbd</command>'s functionality is accessible through the <para>Most of <command>systemd-userdbd</command>'s functionality is accessible through the
<citerefentry><refentrytitle>userdbctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> <citerefentry><refentrytitle>userdbctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
command.</para> command.</para>
<para>The user and group records this service provides access to follow the <ulink <para>The user and group records this service provides access to follow the <ulink
url="https://systemd.io/USER_RECORD">JSON User Record</ulink> and <ulink url="https://systemd.io/USER_RECORD">JSON User Records</ulink> and <ulink
url="https://systemd.io/GROUP_RECORD">JSON Group Record</ulink> definitions. This service implements the url="https://systemd.io/GROUP_RECORD">JSON Group Record</ulink> definitions. This service implements the
<ulink url="https://systemd.io/USER_GROUP_API">User/Group Record Lookup API via Varlink</ulink>, and <ulink url="https://systemd.io/USER_GROUP_API">User/Group Record Lookup API via Varlink</ulink>, and
multiplexes access other services implementing this API, too. It is thus both server and client of this multiplexes access other services implementing this API, too. It is thus both server and client of this

View File

@ -241,7 +241,7 @@
<para>This option is supported only for disk images that contain a single file system, without an <para>This option is supported only for disk images that contain a single file system, without an
enveloping partition table. Images that contain a GPT partition table should instead include both enveloping partition table. Images that contain a GPT partition table should instead include both
root file system and matching Verity data in the same image, implementing the <ulink root file system and matching Verity data in the same image, implementing the <ulink
url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partition Specification</ulink>.</para> url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partitions Specification</ulink>.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem> <xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry> </varlistentry>
@ -402,14 +402,15 @@
<term><varname>ExtensionImages=</varname></term> <term><varname>ExtensionImages=</varname></term>
<listitem><para>This setting is similar to <varname>MountImages=</varname> in that it mounts a file <listitem><para>This setting is similar to <varname>MountImages=</varname> in that it mounts a file
system hierarchy from a block device node or loopback file, but instead of providing a destination path, system hierarchy from a block device node or loopback file, but instead of providing a destination
an overlay will be set up. This option expects a whitespace separated list of mount definitions. Each path, an overlay will be set up. This option expects a whitespace separated list of mount
definition consists of a source path, optionally followed by a colon and a list of mount options.</para> definitions. Each definition consists of a source path, optionally followed by a colon and a list of
mount options.</para>
<para>A read-only OverlayFS will be set up on top of <filename>/usr/</filename> and <para>A read-only OverlayFS will be set up on top of <filename>/usr/</filename> and
<filename>/opt/</filename> hierarchies from the root. The order in which the images are listed <filename>/opt/</filename> hierarchies. The order in which the images are listed will determine the
will determine the order in which the overlay is laid down: images specified first to last will result order in which the overlay is laid down: images specified first to last will result in overlayfs
in overlayfs layers bottom to top.</para> layers bottom to top.</para>
<para>Mount options may be defined as a single comma-separated list of options, in which case they <para>Mount options may be defined as a single comma-separated list of options, in which case they
will be implicitly applied to the root partition on the image, or a series of colon-separated tuples will be implicitly applied to the root partition on the image, or a series of colon-separated tuples
@ -2304,7 +2305,7 @@ SystemCallErrorNumber=EPERM</programlisting>
<listitem><para>Sets environment variables for executed processes. Each line is unquoted using the <listitem><para>Sets environment variables for executed processes. Each line is unquoted using the
rules described in "Quoting" section in rules described in "Quoting" section in
<citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>5</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry>
and becomes a list of variable assignments. If you need to assign a value containing spaces or the and becomes a list of variable assignments. If you need to assign a value containing spaces or the
equals sign to a variable, put quotes around the whole assignment. Variable expansion is not equals sign to a variable, put quotes around the whole assignment. Variable expansion is not
performed inside the strings and the <literal>$</literal> character has no special meaning. Specifier performed inside the strings and the <literal>$</literal> character has no special meaning. Specifier

View File

@ -457,7 +457,7 @@
<term><varname>MTUBytes=</varname></term> <term><varname>MTUBytes=</varname></term>
<listitem> <listitem>
<para>The maximum transmission unit in bytes to set for the <para>The maximum transmission unit in bytes to set for the
device. The usual suffixes K, M, G, are supported and are device. The usual suffixes K, M, G are supported and are
understood to the base of 1024.</para> understood to the base of 1024.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -465,7 +465,7 @@
<term><varname>BitsPerSecond=</varname></term> <term><varname>BitsPerSecond=</varname></term>
<listitem> <listitem>
<para>The speed to set for the device, the value is rounded <para>The speed to set for the device, the value is rounded
down to the nearest Mbps. The usual suffixes K, M, G, are down to the nearest Mbps. The usual suffixes K, M, G are
supported and are understood to the base of 1000.</para> supported and are understood to the base of 1000.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -788,7 +788,7 @@
<term><varname>GenericSegmentOffloadMaxBytes=</varname></term> <term><varname>GenericSegmentOffloadMaxBytes=</varname></term>
<listitem> <listitem>
<para>Specifies the maximum size of a Generic Segment Offload (GSO) packet the <para>Specifies the maximum size of a Generic Segment Offload (GSO) packet the
device should accept. The usual suffixes K, M, G, are supported and are device should accept. The usual suffixes K, M, G are supported and are
understood to the base of 1024. An unsigned integer in the range 1…65536. understood to the base of 1024. An unsigned integer in the range 1…65536.
Defaults to unset.</para> Defaults to unset.</para>
</listitem> </listitem>
@ -796,8 +796,8 @@
<varlistentry> <varlistentry>
<term><varname>GenericSegmentOffloadMaxSegments=</varname></term> <term><varname>GenericSegmentOffloadMaxSegments=</varname></term>
<listitem> <listitem>
<para>Specifies the maximum number of a Generic Segment Offload (GSO) segments the device should <para>Specifies the maximum number of Generic Segment Offload (GSO) segments the device should
accept. An unsigned integer in the range 1…65535. Defaults to unset.</para> accept. An unsigned integer in the range 1…65535. Defaults to unset.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -390,7 +390,7 @@
<term><varname>DefaultPVID=</varname></term> <term><varname>DefaultPVID=</varname></term>
<listitem> <listitem>
<para>This specifies the default port VLAN ID of a newly attached bridge port. <para>This specifies the default port VLAN ID of a newly attached bridge port.
Set this to an integer in the range 14094 or <literal>none</literal> to disable the PVID.</para> Set this to an integer in the range 14094 or <literal>none</literal> to disable the PVID.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -460,7 +460,7 @@
<varlistentry> <varlistentry>
<term><varname>Id=</varname></term> <term><varname>Id=</varname></term>
<listitem> <listitem>
<para>The VLAN ID to use. An integer in the range 04094. <para>The VLAN ID to use. An integer in the range 04094.
This setting is compulsory.</para> This setting is compulsory.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -654,7 +654,7 @@
<term><varname>TTL=</varname></term> <term><varname>TTL=</varname></term>
<listitem> <listitem>
<para>A fixed Time To Live N on Virtual eXtensible Local Area Network packets. <para>A fixed Time To Live N on Virtual eXtensible Local Area Network packets.
Takes <literal>inherit</literal> or a number in the range 0255. 0 is a special Takes <literal>inherit</literal> or a number in the range 0255. 0 is a special
value meaning inherit the inner protocol's TTL value. <literal>inherit</literal> value meaning inherit the inner protocol's TTL value. <literal>inherit</literal>
means that it will inherit the outer protocol's TTL value.</para> means that it will inherit the outer protocol's TTL value.</para>
</listitem> </listitem>
@ -913,7 +913,7 @@
<varlistentry> <varlistentry>
<term><varname>TunnelId=</varname></term> <term><varname>TunnelId=</varname></term>
<listitem> <listitem>
<para>Specifies the tunnel identifier. Takes an number in the range 14294967295. The value used <para>Specifies the tunnel identifier. Takes an number in the range 14294967295. The value used
must match the <literal>PeerTunnelId=</literal> value being used at the peer. This setting is must match the <literal>PeerTunnelId=</literal> value being used at the peer. This setting is
compulsory.</para> compulsory.</para>
</listitem> </listitem>
@ -1002,7 +1002,7 @@
<varlistentry> <varlistentry>
<term><varname>SessionId=</varname></term> <term><varname>SessionId=</varname></term>
<listitem> <listitem>
<para>Specifies the session identifier. Takes an number in the range 14294967295. The value used <para>Specifies the session identifier. Takes an number in the range 14294967295. The value used
must match the <literal>SessionId=</literal> value being used at the peer. This setting is must match the <literal>SessionId=</literal> value being used at the peer. This setting is
compulsory.</para> compulsory.</para>
</listitem> </listitem>
@ -1010,7 +1010,7 @@
<varlistentry> <varlistentry>
<term><varname>PeerSessionId=</varname></term> <term><varname>PeerSessionId=</varname></term>
<listitem> <listitem>
<para>Specifies the peer session identifier. Takes an number in the range 14294967295. <para>Specifies the peer session identifier. Takes an number in the range 14294967295.
The value used must match the <literal>PeerSessionId=</literal> value being used at the peer. The value used must match the <literal>PeerSessionId=</literal> value being used at the peer.
This setting is compulsory.</para> This setting is compulsory.</para>
</listitem> </listitem>
@ -1234,7 +1234,7 @@
<term><varname>TTL=</varname></term> <term><varname>TTL=</varname></term>
<listitem> <listitem>
<para>A fixed Time To Live N on tunneled packets. N is a <para>A fixed Time To Live N on tunneled packets. N is a
number in the range 1255. 0 is a special value meaning that number in the range 1255. 0 is a special value meaning that
packets inherit the TTL value. The default value for IPv4 packets inherit the TTL value. The default value for IPv4
tunnels is 0 (inherit). The default value for IPv6 tunnels is tunnels is 0 (inherit). The default value for IPv6 tunnels is
64.</para> 64.</para>
@ -1256,7 +1256,7 @@
It is only used for IPv6 tunnels. It is only used for IPv6 tunnels.
A flow label of zero is used to indicate packets that have A flow label of zero is used to indicate packets that have
not been labeled. not been labeled.
It can be configured to a value in the range 00xFFFFF, or be It can be configured to a value in the range 00xFFFFF, or be
set to <literal>inherit</literal>, in which case the original flowlabel is used.</para> set to <literal>inherit</literal>, in which case the original flowlabel is used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -1673,15 +1673,15 @@
<para>Sets a comma-separated list of IP (v4 or v6) addresses with CIDR masks <para>Sets a comma-separated list of IP (v4 or v6) addresses with CIDR masks
from which this peer is allowed to send incoming traffic and to from which this peer is allowed to send incoming traffic and to
which outgoing traffic for this peer is directed.</para> which outgoing traffic for this peer is directed.</para>
<para>The catch-all 0.0.0.0/0 may be specified for matching all IPv4 addresses, <para>The catch-all 0.0.0.0/0 may be specified for matching all IPv4 addresses,
and ::/0 may be specified for matching all IPv6 addresses.</para> and ::/0 may be specified for matching all IPv6 addresses.</para>
<para>Note that this only affects "routing inside the network interface itself",
as in, which wireguard peer packets with a specific destination address are sent to, <para>Note that this only affects <emphasis>routing inside the network interface itself</emphasis>,
and what source addresses are accepted from which peer.</para> i.e. the packets that pass through the tunnel itself. To cause packets to be sent via the tunnel in
<para>To cause packets to be sent via wireguard in first place, a route needs the first place, an appropriate route needs to be added as well — either in the
to be added, as well - either in the <literal>[Routes]</literal> section on the <literal>[Routes]</literal> section on the <literal>.network</literal> matching the wireguard
<literal>.network</literal> matching the wireguard interface, or outside of networkd. interface, or externally to <filename>systemd-networkd</filename>.</para>
</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -1823,7 +1823,7 @@
<term><varname>AdUserPortKey=</varname></term> <term><varname>AdUserPortKey=</varname></term>
<listitem> <listitem>
<para>Specifies the 802.3ad user defined portion of the port key. Takes a number in the range <para>Specifies the 802.3ad user defined portion of the port key. Takes a number in the range
01023.</para> 01023.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -2036,9 +2036,9 @@
<refsect1> <refsect1>
<title>[BatmanAdvanced] Section Options</title> <title>[BatmanAdvanced] Section Options</title>
<para>The [BatmanAdvanced] section only applies for
netdevs of kind <literal>batadv</literal> and accepts the <para>The [BatmanAdvanced] section only applies for netdevs of kind <literal>batadv</literal> and accepts
following keys:</para> the following keys:</para>
<variablelist class='network-directives'> <variablelist class='network-directives'>
<varlistentry> <varlistentry>

View File

@ -1423,7 +1423,7 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<term><varname>Metric=</varname></term> <term><varname>Metric=</varname></term>
<listitem> <listitem>
<para>The metric of the route. Takes an unsigned integer in the range 0…4294967295. <para>The metric of the route. Takes an unsigned integer in the range 0…4294967295.
Defaluts to unset, and the kernel's default will be used.</para> Defaults to unset, and the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -1615,9 +1615,10 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<term><varname>SendHostname=</varname></term> <term><varname>SendHostname=</varname></term>
<listitem> <listitem>
<para>When true (the default), the machine's hostname (or the value specified with <para>When true (the default), the machine's hostname (or the value specified with
<varname>Hostname=</varname> below) will be sent to the DHCP server. Note that the hostname must <varname>Hostname=</varname>, described below) will be sent to the DHCP server. Note that the
consist only of 7-bit ASCII lower-case characters and no spaces or dots, and be formatted as a hostname must consist only of 7-bit ASCII lower-case characters and no spaces or dots, and be
valid DNS domain name. Otherwise, the hostname is not sent even if this option is true.</para> formatted as a valid DNS domain name. Otherwise, the hostname is not sent even if this option is
true.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -1911,8 +1912,8 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<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 lifetime. <para>Allows to set DHCPv4 lease lifetime when DHCPv4 server does not send the lease lifetime.
Takes one of <literal>forever</literal> or <literal>infinity</literal> means that the address Takes one of <literal>forever</literal> or <literal>infinity</literal>. The latter means that the
never expires. Defaults to unset.</para> address never expires. Defaults to unset.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -2339,9 +2340,9 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<varlistentry> <varlistentry>
<term><varname>ServerAddress=</varname></term> <term><varname>ServerAddress=</varname></term>
<listitem><para>Specifies server address for the DHCP server. Takes an IPv4 address with prefix <listitem><para>Specifies server address for the DHCP server. Takes an IPv4 address with prefix
length, e.g., <literal>192.168.0.1/24</literal>. This setting may be useful when the link which length, for example <literal>192.168.0.1/24</literal>. This setting may be useful when the link on
DHCP server running on has multiple static addresses. When unset, one of static addresses in which the DHCP server is running has multiple static addresses. When unset, one of static addresses
the link will be automatically selected. Defaults to unset.</para></listitem> in the link will be automatically selected. Defaults to unset.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -2521,23 +2522,22 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<refsect1> <refsect1>
<title>[DHCPServerStaticLease] Section Options</title> <title>[DHCPServerStaticLease] Section Options</title>
<para>The <literal>[DHCPServerStaticLease]</literal> section configures a static DHCP lease to <para>The <literal>[DHCPServerStaticLease]</literal> section configures a static DHCP lease to assign a
assign a pre-set IPv4 address to a specific device based on its MAC address. This section can be fixed IPv4 address to a specific device based on its MAC address. This section can be specified multiple
specified multiple times.</para> times.</para>
<variablelist class='network-directives'> <variablelist class='network-directives'>
<varlistentry> <varlistentry>
<term><varname>MACAddress=</varname></term> <term><varname>MACAddress=</varname></term>
<listitem><para>The hardware address of a device which should be assigned IPv4 address <listitem><para>The hardware address of a device to match. This key is mandatory.</para></listitem>
specified in <varname>Address=</varname>. This key is mandatory.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>Address=</varname></term> <term><varname>Address=</varname></term>
<listitem><para>IPv4 address that should be assigned to a device with a hardware address <listitem><para>The IPv4 address that should be assigned to the device that was matched with
specified in <varname>MACAddress=</varname>. This key is mandatory.</para></listitem> <varname>MACAddress=</varname>. This key is mandatory.</para></listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
</refsect1> </refsect1>

View File

@ -202,7 +202,7 @@
capabilities (see capabilities (see
<citerefentry project='man-pages'><refentrytitle>capabilities</refentrytitle><manvolnum>7</manvolnum></citerefentry> <citerefentry project='man-pages'><refentrytitle>capabilities</refentrytitle><manvolnum>7</manvolnum></citerefentry>
for details). The <varname>AmbientCapability=</varname> setting for details). The <varname>AmbientCapability=</varname> setting
specifies capability which will be passed to to started program specifies capability which will be passed to the started program
in the inheritable and ambient capability sets. This will grant in the inheritable and ambient capability sets. This will grant
these capabilities to this process. This setting correspond to these capabilities to this process. This setting correspond to
the <option>--ambient-capability=</option> command line switch. the <option>--ambient-capability=</option> command line switch.

View File

@ -207,7 +207,7 @@ disable *</programlisting>
<citerefentry><refentrytitle>systemd-delta</refentrytitle><manvolnum>1</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd-delta</refentrytitle><manvolnum>1</manvolnum></citerefentry>
</para> </para>
<para><citerefentry><refentrytitle>daemon</refentrytitle><manvolnum>8</manvolnum></citerefentry> <para><citerefentry><refentrytitle>daemon</refentrytitle><manvolnum>7</manvolnum></citerefentry>
has a discussion of packaging scriptlets.</para> has a discussion of packaging scriptlets.</para>
<para>Fedora page introducing the use of presets: <para>Fedora page introducing the use of presets:

View File

@ -1134,7 +1134,7 @@
<literal>\;</literal>.</para> <literal>\;</literal>.</para>
<para>Each command line is unquoted using the rules described in "Quoting" section in <para>Each command line is unquoted using the rules described in "Quoting" section in
<citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The <citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry>. The
first item becomes the command to execute, and the subsequent items the arguments.</para> first item becomes the command to execute, and the subsequent items the arguments.</para>
<para>This syntax is inspired by shell syntax, but only the meta-characters and expansions <para>This syntax is inspired by shell syntax, but only the meta-characters and expansions

View File

@ -1535,7 +1535,7 @@
<varlistentry> <varlistentry>
<term><varname>ConditionControlGroupController=</varname></term> <term><varname>ConditionControlGroupController=</varname></term>
<listitem><para>Check whether given cgroup controllers (eg. <literal>cpu</literal>) are available <listitem><para>Check whether given cgroup controllers (e.g. <literal>cpu</literal>) are available
for use on the system or whether the legacy v1 cgroup or the modern v2 cgroup hierarchy is used. for use on the system or whether the legacy v1 cgroup or the modern v2 cgroup hierarchy is used.
</para> </para>

View File

@ -585,6 +585,17 @@
for --user instances).</para></listitem> for --user instances).</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><constant>SIGRTMIN+25</constant></term>
<listitem><para>Upon receiving this signal the systemd manager will reexecute itself. This
is mostly equivalent to <command>systemctl daemon-reexec</command> except that it will be
done asynchronously.</para>
<para>The systemd system manager treats this signal the same way as
<constant>SIGTERM</constant>.</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><constant>SIGRTMIN+26</constant></term> <term><constant>SIGRTMIN+26</constant></term>

View File

@ -550,6 +550,7 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
<refsect2> <refsect2>
<title>Age</title> <title>Age</title>
<para>The date field, when set, is used to decide what files to <para>The date field, when set, is used to decide what files to
delete when cleaning. If a file or directory is older than the delete when cleaning. If a file or directory is older than the
current time minus the age field, it is deleted. The field current time minus the age field, it is deleted. The field
@ -582,10 +583,9 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
and <varname>X</varname>. If omitted or set to and <varname>X</varname>. If omitted or set to
<literal>-</literal>, no automatic clean-up is done.</para> <literal>-</literal>, no automatic clean-up is done.</para>
<para>If the age field starts with a tilde character <para>If the age field starts with a tilde character <literal>~</literal>, clean-up is only applied to
<literal>~</literal>, the clean-up is only applied to files and files and directories one level inside the directory specified, but not the files and directories
directories one level inside the directory specified, but not immediately inside it.</para>
the files and directories immediately inside it.</para>
<para>The age of a file system entry is determined from its last <para>The age of a file system entry is determined from its last
modification timestamp (mtime), its last access timestamp (atime), modification timestamp (mtime), its last access timestamp (atime),
@ -595,30 +595,25 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
the age field. To restrict the deletion based on particular type the age field. To restrict the deletion based on particular type
of file timestamps, the age-by argument can be used.</para> of file timestamps, the age-by argument can be used.</para>
<para>The age-by argument, when (optionally) specified along <para>The age-by argument overrides the timestamp types to be used for the age check. It can be
with age will check if the file system entry has aged by the specified by prefixing the age argument with a sequence of characters to specify the timestamp types
type of file timestamp(s) provided. It can be specified by and a colon (<literal>:</literal>):
prefixing the age argument with a set of file timestamp types <literal><replaceable>age-by</replaceable>...:<replaceable>cleanup-age</replaceable></literal>. The
followed by a colon character <literal>:</literal>, i.e., argument can consist of <constant>a</constant> (<constant>A</constant> for directories),
<literal><replaceable>age-by</replaceable>:<replaceable>cleanup-age</replaceable></literal>. <constant>b</constant> (<constant>B</constant> for directories), <constant>c</constant>
The argument can be a set of: (<constant>C</constant> for directories), or <constant>m</constant> (<constant>M</constant> for
<constant>a</constant> (<constant>A</constant> for directories), directories). Those respectively indicate access, creation, last status change, and last modification
<constant>b</constant> (<constant>B</constant> for directories), time of a file system entry. The lower-case letter signifies that the given timestamp type should be
<constant>c</constant> (<constant>C</constant> for directories; ignored by default), or considered for files, while the upper-case letter signifies that the given timestamp type should be
<constant>m</constant> (<constant>M</constant> for directories), considered for directories. See <citerefentry
indicating access, creation, last status change, and last project='man-pages'><refentrytitle>statx</refentrytitle><manvolnum>2</manvolnum></citerefentry> file
modification times of a file system entry respectively. See timestamp fields for more details about timestamp types.</para>
<citerefentry project='man-pages'><refentrytitle>statx</refentrytitle><manvolnum>2</manvolnum></citerefentry>
file timestamp fields for more details.</para>
<para>If unspecified, the age-by field defaults to <para>If not specified, the age-by field defaults to <constant>abcmABM</constant>, i.e. by default all
<constant>abcmABM</constant>, file timestamps are taken into consideration, with the exception of the last status change timestamp
i.e., by default all file timestamps are taken into consideration, (ctime) for directories. This is because the aging logic itself will alter the ctime whenever it
with the exception of the last status change timestamp (ctime) for deletes a file inside it. To ensure that running the aging logic does not feed back into the next
directories. This is because the aging logic itself will alter the iteration of itself, ctime for directories is ignored by default.</para>
ctime whenever it deletes a file inside it. To ensure that running
the aging logic does not feed back into the next iteration of it,
ctime for directories is ignored by default.</para>
<para>For example:<programlisting> <para>For example:<programlisting>
# Files created and modified, and directories accessed more than # Files created and modified, and directories accessed more than

View File

@ -42,7 +42,7 @@
url="https://systemd.io/USER_GROUP_API">User/Group Record Lookup API via Varlink</ulink>, and may also url="https://systemd.io/USER_GROUP_API">User/Group Record Lookup API via Varlink</ulink>, and may also
pick up drop-in JSON user and group records from <filename>/etc/userdb/</filename>, pick up drop-in JSON user and group records from <filename>/etc/userdb/</filename>,
<filename>/run/userdb/</filename>, <filename>/run/host/userdb/</filename>, <filename>/run/userdb/</filename>, <filename>/run/host/userdb/</filename>,
<filename>/use/lib/userdb/</filename>.</para> <filename>/usr/lib/userdb/</filename>.</para>
</refsect1> </refsect1>
<refsect1> <refsect1>
@ -104,7 +104,7 @@
<listitem><para>Controls whether to include user/group lookups in the output that are defined using <listitem><para>Controls whether to include user/group lookups in the output that are defined using
drop-in files in <filename>/etc/userdb/</filename>, <filename>/run/userdb/</filename>, drop-in files in <filename>/etc/userdb/</filename>, <filename>/run/userdb/</filename>,
<filename>/run/host/userdb/</filename>, <filename>/use/lib/userdb/</filename>. If <filename>/run/host/userdb/</filename>, <filename>/usr/lib/userdb/</filename>. If
<option>--with-dropin=no</option> is used these records are suppressed. If <option>--with-dropin=no</option> is used these records are suppressed. If
<option>--with-dropin=yes</option> is specified such users/groups are included in the output (which <option>--with-dropin=yes</option> is specified such users/groups are included in the output (which
is the default).</para></listitem> is the default).</para></listitem>
@ -260,7 +260,7 @@
<citerefentry><refentrytitle>systemd-userdbd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd-userdbd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
and picks up JSON user/group records from <filename>/etc/userdb/</filename>, and picks up JSON user/group records from <filename>/etc/userdb/</filename>,
<filename>/run/userdb/</filename>, <filename>/run/host/userdb/</filename>, <filename>/run/userdb/</filename>, <filename>/run/host/userdb/</filename>,
<filename>/use/lib/userdb/</filename>.</para></listitem> <filename>/usr/lib/userdb/</filename>.</para></listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>

View File

@ -101,9 +101,9 @@ conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open')) conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
conf.set('HIGH_RLIMIT_NOFILE', 512*1024) conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
# join_paths ignores the preceding arguments if an absolute component is # Meson ignores the preceding arguments when joining paths if an absolute
# encountered, so this should canonicalize various paths when they are # component is encountered, so this should canonicalize various paths when they
# absolute or relative. # are absolute or relative.
prefixdir = get_option('prefix') prefixdir = get_option('prefix')
if not prefixdir.startswith('/') if not prefixdir.startswith('/')
error('Prefix is not absolute: "@0@"'.format(prefixdir)) error('Prefix is not absolute: "@0@"'.format(prefixdir))
@ -113,105 +113,105 @@ if prefixdir != rootprefixdir and rootprefixdir != '/' and not prefixdir.strip('
rootprefixdir, prefixdir)) rootprefixdir, prefixdir))
endif endif
bindir = join_paths(prefixdir, get_option('bindir')) bindir = prefixdir / get_option('bindir')
libdir = join_paths(prefixdir, get_option('libdir')) libdir = prefixdir / get_option('libdir')
sysconfdir = join_paths(prefixdir, get_option('sysconfdir')) sysconfdir = prefixdir / get_option('sysconfdir')
includedir = join_paths(prefixdir, get_option('includedir')) includedir = prefixdir / get_option('includedir')
datadir = join_paths(prefixdir, get_option('datadir')) datadir = prefixdir / get_option('datadir')
localstatedir = join_paths('/', get_option('localstatedir')) localstatedir = '/' / get_option('localstatedir')
rootbindir = join_paths(rootprefixdir, 'bin') rootbindir = rootprefixdir / 'bin'
rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin') rootsbindir = rootprefixdir / (split_bin ? 'sbin' : 'bin')
rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd') rootlibexecdir = rootprefixdir / 'lib/systemd'
rootlibdir = get_option('rootlibdir') rootlibdir = get_option('rootlibdir')
if rootlibdir == '' if rootlibdir == ''
rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1]) rootlibdir = rootprefixdir / libdir.split('/')[-1]
endif endif
install_sysconfdir = get_option('install-sysconfdir') != 'false' install_sysconfdir = get_option('install-sysconfdir') != 'false'
install_sysconfdir_samples = get_option('install-sysconfdir') == 'true' install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
# Dirs of external packages # Dirs of external packages
pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir') pkgconfigdatadir = get_option('pkgconfigdatadir') != '' ? get_option('pkgconfigdatadir') : datadir / 'pkgconfig'
pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir') pkgconfiglibdir = get_option('pkgconfiglibdir') != '' ? get_option('pkgconfiglibdir') : libdir / 'pkgconfig'
polkitpolicydir = join_paths(datadir, 'polkit-1/actions') polkitpolicydir = datadir / 'polkit-1/actions'
polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d') polkitrulesdir = datadir / 'polkit-1/rules.d'
polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d') polkitpkladir = localstatedir / 'lib/polkit-1/localauthority/10-vendor.d'
xinitrcdir = get_option('xinitrcdir') == '' ? join_paths(sysconfdir, 'X11/xinit/xinitrc.d') : get_option('xinitrcdir') xinitrcdir = get_option('xinitrcdir') != '' ? get_option('xinitrcdir') : sysconfdir / 'X11/xinit/xinitrc.d'
rpmmacrosdir = get_option('rpmmacrosdir') rpmmacrosdir = get_option('rpmmacrosdir')
if rpmmacrosdir != 'no' if rpmmacrosdir != 'no'
rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir) rpmmacrosdir = prefixdir / rpmmacrosdir
endif endif
modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d') modprobedir = rootprefixdir / 'lib/modprobe.d'
# Our own paths # Our own paths
pkgdatadir = join_paths(datadir, 'systemd') pkgdatadir = datadir / 'systemd'
environmentdir = join_paths(prefixdir, 'lib/environment.d') environmentdir = prefixdir / 'lib/environment.d'
pkgsysconfdir = join_paths(sysconfdir, 'systemd') pkgsysconfdir = sysconfdir / 'systemd'
userunitdir = join_paths(prefixdir, 'lib/systemd/user') userunitdir = prefixdir / 'lib/systemd/user'
userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset') userpresetdir = prefixdir / 'lib/systemd/user-preset'
tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d') tmpfilesdir = prefixdir / 'lib/tmpfiles.d'
sysusersdir = join_paths(prefixdir, 'lib/sysusers.d') sysusersdir = prefixdir / 'lib/sysusers.d'
sysctldir = join_paths(prefixdir, 'lib/sysctl.d') sysctldir = prefixdir / 'lib/sysctl.d'
binfmtdir = join_paths(prefixdir, 'lib/binfmt.d') binfmtdir = prefixdir / 'lib/binfmt.d'
modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d') modulesloaddir = prefixdir / 'lib/modules-load.d'
networkdir = join_paths(rootprefixdir, 'lib/systemd/network') networkdir = rootprefixdir / 'lib/systemd/network'
pkgincludedir = join_paths(includedir, 'systemd') pkgincludedir = includedir / 'systemd'
systemgeneratordir = join_paths(rootlibexecdir, 'system-generators') systemgeneratordir = rootlibexecdir / 'system-generators'
usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators') usergeneratordir = prefixdir / 'lib/systemd/user-generators'
systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators') systemenvgeneratordir = prefixdir / 'lib/systemd/system-environment-generators'
userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators') userenvgeneratordir = prefixdir / 'lib/systemd/user-environment-generators'
systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown') systemshutdowndir = rootlibexecdir / 'system-shutdown'
systemsleepdir = join_paths(rootlibexecdir, 'system-sleep') systemsleepdir = rootlibexecdir / 'system-sleep'
systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system') systemunitdir = rootprefixdir / 'lib/systemd/system'
systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset') systempresetdir = rootprefixdir / 'lib/systemd/system-preset'
udevlibexecdir = join_paths(rootprefixdir, 'lib/udev') udevlibexecdir = rootprefixdir / 'lib/udev'
udevrulesdir = join_paths(udevlibexecdir, 'rules.d') udevrulesdir = udevlibexecdir / 'rules.d'
udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d') udevhwdbdir = udevlibexecdir / 'hwdb.d'
catalogdir = join_paths(prefixdir, 'lib/systemd/catalog') catalogdir = prefixdir / 'lib/systemd/catalog'
kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d') kernelinstalldir = prefixdir / 'lib/kernel/install.d'
factorydir = join_paths(datadir, 'factory') factorydir = datadir / 'factory'
bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi') bootlibdir = prefixdir / 'lib/systemd/boot/efi'
testsdir = join_paths(prefixdir, 'lib/systemd/tests') testsdir = prefixdir / 'lib/systemd/tests'
systemdstatedir = join_paths(localstatedir, 'lib/systemd') systemdstatedir = localstatedir / 'lib/systemd'
catalogstatedir = join_paths(systemdstatedir, 'catalog') catalogstatedir = systemdstatedir / 'catalog'
randomseeddir = join_paths(localstatedir, 'lib/systemd') randomseeddir = localstatedir / 'lib/systemd'
profiledir = join_paths(rootlibexecdir, 'portable', 'profile') profiledir = rootlibexecdir / 'portable' / 'profile'
ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d') ntpservicelistdir = rootprefixdir / 'lib/systemd/ntp-units.d'
docdir = get_option('docdir') docdir = get_option('docdir')
if docdir == '' if docdir == ''
docdir = join_paths(datadir, 'doc/systemd') docdir = datadir / 'doc/systemd'
endif endif
dbuspolicydir = get_option('dbuspolicydir') dbuspolicydir = get_option('dbuspolicydir')
if dbuspolicydir == '' if dbuspolicydir == ''
dbuspolicydir = join_paths(datadir, 'dbus-1/system.d') dbuspolicydir = datadir / 'dbus-1/system.d'
endif endif
dbussessionservicedir = get_option('dbussessionservicedir') dbussessionservicedir = get_option('dbussessionservicedir')
if dbussessionservicedir == '' if dbussessionservicedir == ''
dbussessionservicedir = join_paths(datadir, 'dbus-1/services') dbussessionservicedir = datadir / 'dbus-1/services'
endif endif
dbussystemservicedir = get_option('dbussystemservicedir') dbussystemservicedir = get_option('dbussystemservicedir')
if dbussystemservicedir == '' if dbussystemservicedir == ''
dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services') dbussystemservicedir = datadir / 'dbus-1/system-services'
endif endif
pamlibdir = get_option('pamlibdir') pamlibdir = get_option('pamlibdir')
if pamlibdir == '' if pamlibdir == ''
pamlibdir = join_paths(rootlibdir, 'security') pamlibdir = rootlibdir / 'security'
endif endif
pamconfdir = get_option('pamconfdir') pamconfdir = get_option('pamconfdir')
if pamconfdir == '' if pamconfdir == ''
pamconfdir = join_paths(prefixdir, 'lib/pam.d') pamconfdir = prefixdir / 'lib/pam.d'
endif endif
libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir') libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir')
if libcryptsetup_plugins_dir == '' if libcryptsetup_plugins_dir == ''
libcryptsetup_plugins_dir = join_paths(rootlibdir, 'cryptsetup') libcryptsetup_plugins_dir = rootlibdir / 'cryptsetup'
endif endif
memory_accounting_default = get_option('memory-accounting-default') memory_accounting_default = get_option('memory-accounting-default')
@ -219,19 +219,19 @@ status_unit_format_default = get_option('status-unit-format-default')
conf.set_quoted('BINFMT_DIR', binfmtdir) conf.set_quoted('BINFMT_DIR', binfmtdir)
conf.set_quoted('BOOTLIBDIR', bootlibdir) conf.set_quoted('BOOTLIBDIR', bootlibdir)
conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database')) conf.set_quoted('CATALOG_DATABASE', catalogstatedir / 'database')
conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root')) conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
conf.set_quoted('DOC_DIR', docdir) conf.set_quoted('DOC_DIR', docdir)
conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd')) conf.set_quoted('DOCUMENT_ROOT', pkgdatadir / 'gatewayd')
conf.set_quoted('ENVIRONMENT_DIR', environmentdir) conf.set_quoted('ENVIRONMENT_DIR', environmentdir)
conf.set_quoted('INCLUDE_DIR', includedir) conf.set_quoted('INCLUDE_DIR', includedir)
conf.set_quoted('LIBDIR', libdir) conf.set_quoted('LIBDIR', libdir)
conf.set_quoted('MODPROBE_DIR', modprobedir) conf.set_quoted('MODPROBE_DIR', modprobedir)
conf.set_quoted('MODULESLOAD_DIR', modulesloaddir) conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir) conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent')) conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir / 'pkttyagent')
conf.set_quoted('PREFIX', prefixdir) conf.set_quoted('PREFIX', prefixdir)
conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed')) conf.set_quoted('RANDOM_SEED', randomseeddir / 'random-seed')
conf.set_quoted('RANDOM_SEED_DIR', randomseeddir) conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local')) conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
conf.set_quoted('ROOTBINDIR', rootbindir) conf.set_quoted('ROOTBINDIR', rootbindir)
@ -241,29 +241,29 @@ conf.set_quoted('ROOTPREFIX', rootprefixdir)
conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash) conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
conf.set_quoted('SYSCONF_DIR', sysconfdir) conf.set_quoted('SYSCONF_DIR', sysconfdir)
conf.set_quoted('SYSCTL_DIR', sysctldir) conf.set_quoted('SYSCTL_DIR', sysctldir)
conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl')) conf.set_quoted('SYSTEMCTL_BINARY_PATH', rootbindir / 'systemctl')
conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd')) conf.set_quoted('SYSTEMD_BINARY_PATH', rootlibexecdir / 'systemd')
conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir) conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent')) conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', rootlibexecdir / 'systemd-cgroups-agent')
conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup')) conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', rootlibexecdir / 'systemd-cryptsetup')
conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export')) conf.set_quoted('SYSTEMD_EXPORT_PATH', rootlibexecdir / 'systemd-export')
conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck')) conf.set_quoted('SYSTEMD_FSCK_PATH', rootlibexecdir / 'systemd-fsck')
conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs')) conf.set_quoted('SYSTEMD_GROWFS_PATH', rootlibexecdir / 'systemd-growfs')
conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework')) conf.set_quoted('SYSTEMD_HOMEWORK_PATH', rootlibexecdir / 'systemd-homework')
conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs')) conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', rootlibexecdir / 'systemd-import-fs')
conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import')) conf.set_quoted('SYSTEMD_IMPORT_PATH', rootlibexecdir / 'systemd-import')
conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map')) conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir / 'kbd-model-map')
conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map')) conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir / 'language-fallback-map')
conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs')) conf.set_quoted('SYSTEMD_MAKEFS_PATH', rootlibexecdir / 'systemd-makefs')
conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull')) conf.set_quoted('SYSTEMD_PULL_PATH', rootlibexecdir / 'systemd-pull')
conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown')) conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', rootlibexecdir / 'systemd-shutdown')
conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge')) conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', bindir / 'systemd-stdio-bridge')
conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata')) conf.set_quoted('SYSTEMD_TEST_DATA', testsdir / 'testdata')
conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent')) conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', rootbindir / 'systemd-tty-ask-password-agent')
conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', join_paths(rootlibexecdir, 'systemd-update-helper')) conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', rootlibexecdir / 'systemd-update-helper')
conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork')) conf.set_quoted('SYSTEMD_USERWORK_PATH', rootlibexecdir / 'systemd-userwork')
conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', join_paths(rootlibexecdir, 'systemd-veritysetup')) conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', rootlibexecdir / 'systemd-veritysetup')
conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system')) conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system')
conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir) conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir)
conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir) conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir) conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
@ -278,13 +278,13 @@ conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir) conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
conf.set_quoted('UDEV_RULES_DIR', udevrulesdir) conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
conf.set_quoted('UPDATE_HELPER_USER_TIMEOUT', get_option('update-helper-user-timeout')) conf.set_quoted('UPDATE_HELPER_USER_TIMEOUT', get_option('update-helper-user-timeout'))
conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user')) conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir) conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir) conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir) conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg')) conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir / 'import-pubring.gpg')
conf.set_quoted('USER_PRESET_DIR', userpresetdir) conf.set_quoted('USER_PRESET_DIR', userpresetdir)
conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg')) conf.set_quoted('VENDOR_KEYRING_PATH', rootlibexecdir / 'import-pubring.gpg')
conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper()) conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
conf.set10('ENABLE_URLIFY', get_option('urlify')) conf.set10('ENABLE_URLIFY', get_option('urlify'))
@ -1857,7 +1857,7 @@ foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
module = tuple[0] module = tuple[0]
sym = 'src/nss-@0@/nss-@0@.sym'.format(module) sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
version_script_arg = join_paths(project_source_root, sym) version_script_arg = project_source_root / sym
sources = ['src/nss-@0@/nss-@0@.c'.format(module)] sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
if tuple.length() > 2 if tuple.length() > 2
@ -1922,8 +1922,8 @@ executable(
install_dir : rootlibexecdir) install_dir : rootlibexecdir)
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(rootlibexecdir, 'systemd'), rootlibexecdir / 'systemd',
join_paths(rootsbindir, 'init')) rootsbindir / 'init')
public_programs += executable( public_programs += executable(
'systemd-analyze', 'systemd-analyze',
@ -2028,8 +2028,8 @@ if conf.get('ENABLE_ENVIRONMENT_D') == 1
install_dir : userenvgeneratordir) install_dir : userenvgeneratordir)
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(sysconfdir, 'environment'), sysconfdir / 'environment',
join_paths(environmentdir, '99-environment.conf')) environmentdir / '99-environment.conf')
endif endif
if conf.get('ENABLE_HIBERNATE') == 1 if conf.get('ENABLE_HIBERNATE') == 1
@ -2100,12 +2100,12 @@ if conf.get('ENABLE_RESOLVE') == 1
install : true) install : true)
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(bindir, 'resolvectl'), bindir / 'resolvectl',
join_paths(rootsbindir, 'resolvconf')) rootsbindir / 'resolvconf')
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(bindir, 'resolvectl'), bindir / 'resolvectl',
join_paths(bindir, 'systemd-resolve')) bindir / 'systemd-resolve')
endif endif
if conf.get('ENABLE_LOGIND') == 1 if conf.get('ENABLE_LOGIND') == 1
@ -2144,7 +2144,7 @@ if conf.get('ENABLE_LOGIND') == 1
install_dir : rootbindir) install_dir : rootbindir)
if conf.get('HAVE_PAM') == 1 if conf.get('HAVE_PAM') == 1
version_script_arg = join_paths(project_source_root, pam_systemd_sym) version_script_arg = project_source_root / pam_systemd_sym
pam_systemd = shared_library( pam_systemd = shared_library(
'pam_systemd', 'pam_systemd',
pam_systemd_c, pam_systemd_c,
@ -2362,7 +2362,7 @@ if conf.get('ENABLE_HOMED') == 1
install_dir : rootbindir) install_dir : rootbindir)
if conf.get('HAVE_PAM') == 1 if conf.get('HAVE_PAM') == 1
version_script_arg = join_paths(project_source_root, pam_systemd_home_sym) version_script_arg = project_source_root / pam_systemd_home_sym
pam_systemd = shared_library( pam_systemd = shared_library(
'pam_systemd_home', 'pam_systemd_home',
pam_systemd_home_c, pam_systemd_home_c,
@ -2385,13 +2385,13 @@ endif
foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] + foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
(conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : [])) (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(rootbindir, 'systemctl'), rootbindir / 'systemctl',
join_paths(rootsbindir, alias)) rootsbindir / alias)
endforeach endforeach
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(rootbindir, 'udevadm'), rootbindir / 'udevadm',
join_paths(rootlibexecdir, 'systemd-udevd')) rootlibexecdir / 'systemd-udevd')
if conf.get('ENABLE_BACKLIGHT') == 1 if conf.get('ENABLE_BACKLIGHT') == 1
executable( executable(
@ -2828,7 +2828,7 @@ if conf.get('ENABLE_BINFMT') == 1
mkdir_p.format(binfmtdir)) mkdir_p.format(binfmtdir))
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'binfmt.d'))) mkdir_p.format(sysconfdir / 'binfmt.d'))
endif endif
endif endif
@ -3105,7 +3105,7 @@ public_programs += executable(
install : true) install : true)
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
'systemd-mount', join_paths(bindir, 'systemd-umount')) 'systemd-mount', bindir / 'systemd-umount')
public_programs += executable( public_programs += executable(
'systemd-run', 'systemd-run',
@ -3307,7 +3307,7 @@ if conf.get('HAVE_KMOD') == 1
mkdir_p.format(modulesloaddir)) mkdir_p.format(modulesloaddir))
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'modules-load.d'))) mkdir_p.format(sysconfdir / 'modules-load.d'))
endif endif
endif endif
@ -3387,8 +3387,8 @@ custom_target(
output : 'systemd-runtest.env', output : 'systemd-runtest.env',
command : [sh, '-c', command : [sh, '-c',
'{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format( '{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format(
join_paths(project_source_root, 'test'), project_source_root / 'test',
join_paths(project_build_root, 'catalog'))], project_build_root / 'catalog')],
build_by_default : true) build_by_default : true)
test_cflags = ['-DTEST_CODE=1'] test_cflags = ['-DTEST_CODE=1']
@ -3430,7 +3430,7 @@ foreach tuple : tests
build_by_default : want_tests != 'false', build_by_default : want_tests != 'false',
install_rpath : rootlibexecdir, install_rpath : rootlibexecdir,
install : install_tests, install : install_tests,
install_dir : join_paths(testsdir, type)) install_dir : testsdir / type)
if type == 'manual' if type == 'manual'
message('@0@ is a manual test'.format(name)) message('@0@ is a manual test'.format(name))
@ -3546,16 +3546,13 @@ foreach tuple : fuzzers
if b == name if b == name
test('@0@_@1@'.format(b, c), test('@0@_@1@'.format(b, c),
exe, exe,
args : [join_paths(project_source_root, p)]) args : [project_source_root / p])
endif endif
endforeach endforeach
endif endif
endforeach endforeach
run_target( alias_target('fuzzers', fuzzer_exes)
'fuzzers',
depends : fuzzer_exes,
command : ['true'])
############################################################ ############################################################
@ -3608,8 +3605,8 @@ if get_option('mode') == 'developer' and want_tests != 'false' and jekyll.found(
test('github-pages', test('github-pages',
jekyll, jekyll,
args : ['build', args : ['build',
'--source', join_paths(project_source_root, 'docs'), '--source', project_source_root / 'docs',
'--destination', join_paths(project_build_root, '_site')]) '--destination', project_build_root / '_site'])
endif endif
############################################################ ############################################################
@ -3659,7 +3656,7 @@ foreach tuple : sanitizers
output : name, output : name,
depends : build, depends : build,
command : [ln, '-fs', command : [ln, '-fs',
join_paths(build.full_path(), b), build.full_path() / b,
'@OUTPUT@'], '@OUTPUT@'],
build_by_default : true) build_by_default : true)
else else
@ -3674,7 +3671,7 @@ foreach tuple : sanitizers
env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'], env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
timeout : 60, timeout : 60,
args : [exe.full_path(), args : [exe.full_path(),
join_paths(project_source_root, p)]) project_source_root / p])
endif endif
endforeach endforeach
endif endif
@ -3734,101 +3731,67 @@ run_target(
depends : [man, libsystemd, libudev], depends : [man, libsystemd, libudev],
command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()]) command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
############################################################ alias_target('update-dbus-docs', update_dbus_docs)
alias_target('update-man-rules', update_man_rules)
if dbus_docs.length() > 0
custom_target(
'update-dbus-docs',
output : 'update-dbus-docs',
command : [update_dbus_docs_py,
'--build-dir=@0@'.format(project_build_root),
'@INPUT@'],
input : dbus_docs)
if conf.get('BUILD_MODE_DEVELOPER') == 1
test('dbus-docs-fresh',
update_dbus_docs_py,
args : ['--build-dir=@0@'.format(project_build_root),
'--test'] + dbus_docs)
endif
endif
custom_target(
'update-man-rules',
output : 'update-man-rules',
command : [sh, '-c',
'cd @0@ && '.format(meson.build_root()) +
'python3 @0@/tools/update-man-rules.py $(find @0@ -wholename "*/man/*.xml") >t && '.format(project_source_root) +
'mv t @0@/man/rules/meson.build'.format(meson.current_source_dir())],
depends : custom_entities_ent)
############################################################ ############################################################
watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
status = [
'@0@ @1@'.format(meson.project_name(), meson.project_version()),
'build mode: @0@'.format(get_option('mode')),
'split /usr: @0@'.format(split_usr),
'split bin-sbin: @0@'.format(split_bin),
'prefix directory: @0@'.format(prefixdir),
'rootprefix directory: @0@'.format(rootprefixdir),
'sysconf directory: @0@'.format(sysconfdir),
'include directory: @0@'.format(includedir),
'lib directory: @0@'.format(libdir),
'rootlib directory: @0@'.format(rootlibdir),
'SysV init scripts: @0@'.format(sysvinit_path),
'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
'PAM modules directory: @0@'.format(pamlibdir),
'PAM configuration directory: @0@'.format(pamconfdir),
'libcryptsetup plugins directory: @0@'.format(libcryptsetup_plugins_dir),
'RPM macros directory: @0@'.format(rpmmacrosdir),
'modprobe.d directory: @0@'.format(modprobedir),
'D-Bus policy directory: @0@'.format(dbuspolicydir),
'D-Bus session directory: @0@'.format(dbussessionservicedir),
'D-Bus system directory: @0@'.format(dbussystemservicedir),
'bash completions directory: @0@'.format(bashcompletiondir),
'zsh completions directory: @0@'.format(zshcompletiondir),
'extra start script: @0@'.format(get_option('rc-local')),
'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
get_option('debug-tty')),
'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
conf.get('SYSTEM_ALLOC_UID_MIN')),
'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
conf.get('SYSTEM_ALLOC_GID_MIN')),
'dynamic UIDs: @0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
'container UID bases: @0@…@1@'.format(container_uid_base_min, container_uid_base_max),
'static UID/GID allocations: @0@'.format(' '.join(static_ugids)),
'/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
'render group access mode: @0@'.format(get_option('group-render-mode')),
'certificate root directory: @0@'.format(get_option('certificate-root')),
'support URL: @0@'.format(support_url),
'nobody user name: @0@'.format(nobody_user),
'nobody group name: @0@'.format(nobody_group),
'fallback hostname: @0@'.format(get_option('fallback-hostname')),
'default DNSSEC mode: @0@'.format(default_dnssec),
'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
'default mDNS mode: @0@'.format(default_mdns),
'default LLMNR mode: @0@'.format(default_llmnr),
'default cgroup hierarchy: @0@'.format(default_hierarchy),
'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
'default KillUserProcesses setting: @0@'.format(kill_user_processes),
'default locale: @0@'.format(default_locale),
'default user $PATH: @0@'.format(
default_user_path != '' ? default_user_path : '(same as system services)'),
'systemd service watchdog: @0@'.format(watchdog_opt)]
alt_dns_servers = '\n '.join(dns_servers.split(' '))
alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
status += [
'default DNS servers: @0@'.format(alt_dns_servers),
'default NTP servers: @0@'.format(alt_ntp_servers)]
alt_time_epoch = run_command('date', '-Is', '-u', '-d', alt_time_epoch = run_command('date', '-Is', '-u', '-d',
'@@0@'.format(time_epoch)).stdout().strip() '@@0@'.format(time_epoch)).stdout().strip()
status += [
'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)] summary({
'build mode' : get_option('mode'),
'split /usr' : split_usr,
'split bin-sbin' : split_bin,
'prefix directory' : prefixdir,
'rootprefix directory' : rootprefixdir,
'sysconf directory' : sysconfdir,
'include directory' : includedir,
'lib directory' : libdir,
'rootlib directory' : rootlibdir,
'SysV init scripts' : sysvinit_path,
'SysV rc?.d directories' : sysvrcnd_path,
'PAM modules directory' : pamlibdir,
'PAM configuration directory' : pamconfdir,
'libcryptsetup plugins directory' : libcryptsetup_plugins_dir,
'RPM macros directory' : rpmmacrosdir,
'modprobe.d directory' : modprobedir,
'D-Bus policy directory' : dbuspolicydir,
'D-Bus session directory' : dbussessionservicedir,
'D-Bus system directory' : dbussystemservicedir,
'bash completions directory' : bashcompletiondir,
'zsh completions directory' : zshcompletiondir,
'extra start script' : get_option('rc-local'),
'debug shell' : '@0@ @ @1@'.format(get_option('debug-shell'),
get_option('debug-tty')),
'system UIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
conf.get('SYSTEM_ALLOC_UID_MIN')),
'system GIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
conf.get('SYSTEM_ALLOC_GID_MIN')),
'dynamic UIDs' : '@0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
'container UID bases' : '@0@…@1@'.format(container_uid_base_min, container_uid_base_max),
'static UID/GID allocations' : ' '.join(static_ugids),
'/dev/kvm access mode' : get_option('dev-kvm-mode'),
'render group access mode' : get_option('group-render-mode'),
'certificate root directory' : get_option('certificate-root'),
'support URL' : support_url,
'nobody user name' : nobody_user,
'nobody group name' : nobody_group,
'fallback hostname' : get_option('fallback-hostname'),
'default DNSSEC mode' : default_dnssec,
'default DNS-over-TLS mode' : default_dns_over_tls,
'default mDNS mode' : default_mdns,
'default LLMNR mode' : default_llmnr,
'default DNS servers' : dns_servers.split(' '),
'default NTP servers' : ntp_servers.split(' '),
'default cgroup hierarchy' : default_hierarchy,
'default net.naming-scheme value' : default_net_naming_scheme,
'default KillUserProcesses value' : kill_user_processes,
'default locale' : default_locale,
'default user $PATH' :
default_user_path != '' ? default_user_path : '(same as system services)',
'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
'time epoch' : '@0@ (@1@)'.format(time_epoch, alt_time_epoch)})
# TODO: # TODO:
# CFLAGS: ${OUR_CFLAGS} ${CFLAGS} # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
@ -3836,15 +3799,17 @@ status += [
# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS} # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
if conf.get('ENABLE_EFI') == 1 if conf.get('ENABLE_EFI') == 1
status += 'efi arch: @0@'.format(efi_arch) summary({'efi arch' : efi_arch},
section : 'Extensible Firmware Interface')
if have_gnu_efi if have_gnu_efi
status += [ summary({
'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME), 'EFI machine type' : EFI_MACHINE_TYPE_NAME,
'EFI CC @0@'.format(' '.join(efi_cc)), 'EFI CC' : '@0@'.format(' '.join(efi_cc)),
'EFI lds: @0@'.format(efi_lds), 'EFI lds' : efi_lds,
'EFI crt0: @0@'.format(efi_crt0), 'EFI crt0' : efi_crt0,
'EFI include directory: @0@'.format(efi_incdir)] 'EFI include directory' : efi_incdir},
section : 'Extensible Firmware Interface')
endif endif
endif endif
@ -3999,13 +3964,10 @@ else
missing += 'DNS-over-TLS' missing += 'DNS-over-TLS'
endif endif
status += [ summary({
'', 'enabled' : ', '.join(found),
'enabled features: @0@'.format(', '.join(found)), 'disabled' : ', '.join(missing)},
'', section : 'Features')
'disabled features: @0@'.format(', '.join(missing)),
'']
message('\n '.join(status))
if rootprefixdir != rootprefix_default if rootprefixdir != rootprefix_default
warning('\n' + warning('\n' +

View File

@ -12,7 +12,7 @@ if conf.get('ENABLE_NETWORKD') == 1
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'systemd/network'))) mkdir_p.format(sysconfdir / 'systemd/network'))
endif endif
endif endif

View File

@ -6,7 +6,7 @@ if bashcompletiondir == ''
if bash_completion.found() if bash_completion.found()
bashcompletiondir = bash_completion.get_pkgconfig_variable('completionsdir') bashcompletiondir = bash_completion.get_pkgconfig_variable('completionsdir')
else else
bashcompletiondir = join_paths(datadir, 'bash-completion/completions') bashcompletiondir = datadir / 'bash-completion/completions'
endif endif
endif endif

View File

@ -2,7 +2,7 @@
zshcompletiondir = get_option('zshcompletiondir') zshcompletiondir = get_option('zshcompletiondir')
if zshcompletiondir == '' if zshcompletiondir == ''
zshcompletiondir = join_paths(datadir, 'zsh/site-functions') zshcompletiondir = datadir / 'zsh/site-functions'
endif endif
custom_target( custom_target(

View File

@ -71,14 +71,14 @@ if conf.get('ENABLE_EFI') == 1 and get_option('gnu-efi') != 'false'
efi_libdir = get_option('efi-libdir') efi_libdir = get_option('efi-libdir')
if efi_libdir == '' if efi_libdir == ''
# New location first introduced with gnu-efi 3.0.11 # New location first introduced with gnu-efi 3.0.11
efi_libdir = join_paths('/usr/lib/gnuefi', EFI_MACHINE_TYPE_NAME) efi_libdir = '/usr/lib/gnuefi' / EFI_MACHINE_TYPE_NAME
cmd = run_command(test, '-e', efi_libdir) cmd = run_command(test, '-e', efi_libdir)
if cmd.returncode() != 0 if cmd.returncode() != 0
# Fall back to the old approach # Fall back to the old approach
cmd = run_command(efi_cc + ['-print-multi-os-directory']) cmd = run_command(efi_cc + ['-print-multi-os-directory'])
if cmd.returncode() == 0 if cmd.returncode() == 0
path = join_paths('/usr/lib', cmd.stdout().strip()) path = '/usr/lib' / cmd.stdout().strip()
cmd = run_command(env, 'realpath', '-e', path) cmd = run_command(env, 'realpath', '-e', path)
if cmd.returncode() == 0 if cmd.returncode() == 0
efi_libdir = cmd.stdout().strip() efi_libdir = cmd.stdout().strip()
@ -148,13 +148,13 @@ if have_gnu_efi
efi_location_map = [ efi_location_map = [
# New locations first introduced with gnu-efi 3.0.11 # New locations first introduced with gnu-efi 3.0.11
[join_paths(efi_libdir, 'efi.lds'), [efi_libdir / 'efi.lds',
join_paths(efi_libdir, 'crt0.o')], efi_libdir / 'crt0.o'],
# Older locations... # Older locations...
[join_paths(efi_libdir, 'gnuefi', 'elf_@0@_efi.lds'.format(gnu_efi_path_arch)), [efi_libdir / 'gnuefi' / 'elf_@0@_efi.lds'.format(gnu_efi_path_arch),
join_paths(efi_libdir, 'gnuefi', 'crt0-efi-@0@.o'.format(gnu_efi_path_arch))], efi_libdir / 'gnuefi' / 'crt0-efi-@0@.o'.format(gnu_efi_path_arch)],
[join_paths(efi_libdir, 'elf_@0@_efi.lds'.format(gnu_efi_path_arch)), [efi_libdir / 'elf_@0@_efi.lds'.format(gnu_efi_path_arch),
join_paths(efi_libdir, 'crt0-efi-@0@.o'.format(gnu_efi_path_arch))]] efi_libdir / 'crt0-efi-@0@.o'.format(gnu_efi_path_arch)]]
efi_lds = '' efi_lds = ''
foreach location : efi_location_map foreach location : efi_location_map
if efi_lds == '' if efi_lds == ''
@ -191,7 +191,7 @@ if have_gnu_efi
'-nostdlib', '-nostdlib',
'-std=gnu99', '-std=gnu99',
'-isystem', efi_incdir, '-isystem', efi_incdir,
'-isystem', join_paths(efi_incdir, gnu_efi_path_arch), '-isystem', efi_incdir / gnu_efi_path_arch,
'-I', fundamental_path, '-I', fundamental_path,
'-DSD_BOOT', '-DSD_BOOT',
'-include', efi_config_h, '-include', efi_config_h,

View File

@ -578,8 +578,7 @@ static int manager_setup_signals(Manager *m) {
SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */ SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
SIGRTMIN+23, /* systemd: set log level to LOG_INFO */ SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
SIGRTMIN+24, /* systemd: Immediate exit (--user only) */ SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
SIGRTMIN+25, /* systemd: reexecute manager */
/* .. one free signal here ... */
/* Apparently Linux on hppa had fewer RT signals until v3.18, /* Apparently Linux on hppa had fewer RT signals until v3.18,
* SIGRTMAX was SIGRTMIN+25, and then SIGRTMIN was lowered, * SIGRTMAX was SIGRTMIN+25, and then SIGRTMIN was lowered,
@ -2846,6 +2845,10 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
/* This is a nop on init */ /* This is a nop on init */
break; break;
case 25:
m->objective = MANAGER_REEXECUTE;
break;
case 26: case 26:
case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */ case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
manager_restore_original_log_target(m); manager_restore_original_log_target(m);

View File

@ -210,9 +210,9 @@ meson.add_install_script('sh', '-c', mkdir_p.format(systemgeneratordir))
meson.add_install_script('sh', '-c', mkdir_p.format(usergeneratordir)) meson.add_install_script('sh', '-c', mkdir_p.format(usergeneratordir))
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', mkdir_p.format(join_paths(pkgsysconfdir, 'system'))) meson.add_install_script('sh', '-c', mkdir_p.format(pkgsysconfdir / 'system'))
meson.add_install_script('sh', '-c', mkdir_p.format(join_paths(pkgsysconfdir, 'user'))) meson.add_install_script('sh', '-c', mkdir_p.format(pkgsysconfdir / 'user'))
meson.add_install_script('sh', '-c', mkdir_p.format(join_paths(sysconfdir, 'xdg/systemd'))) meson.add_install_script('sh', '-c', mkdir_p.format(sysconfdir / 'xdg/systemd'))
endif endif
############################################################ ############################################################

View File

@ -5,7 +5,7 @@ if conf.get('HAVE_LIBCRYPTSETUP_PLUGINS') == 1
cryptsetup_token_c_args = ['-fvisibility=hidden'] cryptsetup_token_c_args = ['-fvisibility=hidden']
cryptsetup_token_sym = files('cryptsetup-token.sym') cryptsetup_token_sym = files('cryptsetup-token.sym')
cryptsetup_token_sym_path = join_paths(meson.current_source_dir(), 'cryptsetup-token.sym') cryptsetup_token_sym_path = meson.current_source_dir() / 'cryptsetup-token.sym'
if conf.get('HAVE_TPM2') == 1 if conf.get('HAVE_TPM2') == 1
cryptsetup_token_systemd_tpm2_sources = files(''' cryptsetup_token_systemd_tpm2_sources = files('''

View File

@ -14,8 +14,8 @@ sources = '''
# for sd-boot # for sd-boot
fundamental_source_paths = [] fundamental_source_paths = []
foreach s : sources foreach source : sources
fundamental_source_paths += join_paths(meson.current_source_dir(), s) fundamental_source_paths += meson.current_source_dir() / source
endforeach endforeach
# for libbasic # for libbasic

View File

@ -62,7 +62,7 @@ endforeach
if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
install_data('browse.html', install_data('browse.html',
install_dir : join_paths(pkgdatadir, 'gatewayd')) install_dir : pkgdatadir / 'gatewayd')
if get_option('create-log-dirs') if get_option('create-log-dirs')
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',

View File

@ -15,7 +15,7 @@ if want_kernel_install
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'kernel/install.d'))) mkdir_p.format(sysconfdir / 'kernel/install.d'))
endif endif
endif endif

View File

@ -171,7 +171,7 @@ libsystemd_static = static_library(
c_args : libsystemd_c_args) c_args : libsystemd_c_args)
libsystemd_sym = files('libsystemd.sym') libsystemd_sym = files('libsystemd.sym')
libsystemd_sym_path = join_paths(meson.current_source_dir(), 'libsystemd.sym') libsystemd_sym_path = meson.current_source_dir() / 'libsystemd.sym'
static_libsystemd = get_option('static-libsystemd') static_libsystemd = get_option('static-libsystemd')
static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic' static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'

View File

@ -19,10 +19,10 @@ libudev_sources = files(
libudev_includes = [includes, include_directories('.')] libudev_includes = [includes, include_directories('.')]
libudev_sym = files('libudev.sym') libudev_sym = files('libudev.sym')
libudev_sym_path = join_paths(meson.current_source_dir(), 'libudev.sym') libudev_sym_path = meson.current_source_dir() / 'libudev.sym'
install_headers('libudev.h') install_headers('libudev.h')
libudev_h_path = join_paths(meson.current_source_dir(), 'libudev.h') libudev_h_path = meson.current_source_dir() / 'libudev.h'
libudev_basic = static_library( libudev_basic = static_library(
'udev-basic', 'udev-basic',

View File

@ -20,8 +20,8 @@ endif
# If you know a way that allows the same variables to be used # If you know a way that allows the same variables to be used
# in sources list and concatenated to a string for test_env, # in sources list and concatenated to a string for test_env,
# let me know. # let me know.
kbd_model_map = join_paths(meson.current_source_dir(), 'kbd-model-map') kbd_model_map = meson.current_source_dir() / 'kbd-model-map'
language_fallback_map = join_paths(meson.current_source_dir(), 'language-fallback-map') language_fallback_map = meson.current_source_dir() / 'language-fallback-map'
if conf.get('ENABLE_LOCALED') == 1 if conf.get('ENABLE_LOCALED') == 1
install_data('kbd-model-map', install_data('kbd-model-map',

View File

@ -279,12 +279,28 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
} }
} else if (ev.type == EV_KEY && ev.value == 0) { } else if (ev.type == EV_KEY && ev.value == 0) {
if (ev.code == KEY_RESTART) {
if (b->manager->reboot_key_long_press_event_source) { switch (ev.code) {
case KEY_POWER:
case KEY_POWER2:
if (b->manager->power_key_long_press_event_source) {
/* Long press event timer is still pending and key release /* Long press event timer is still pending and key release
event happened. This means that key press duration was event happened. This means that key press duration was
insufficient to trigger a long press event insufficient to trigger a long press event
*/ */
log_struct(LOG_INFO,
LOG_MESSAGE("Power key pressed short."),
"MESSAGE_ID=" SD_MESSAGE_POWER_KEY_STR);
b->manager->power_key_long_press_event_source = sd_event_source_unref(b->manager->power_key_long_press_event_source);
manager_handle_action(b->manager, INHIBIT_HANDLE_POWER_KEY, b->manager->handle_power_key, b->manager->power_key_ignore_inhibited, true);
}
break;
case KEY_RESTART:
if (b->manager->reboot_key_long_press_event_source) {
log_struct(LOG_INFO, log_struct(LOG_INFO,
LOG_MESSAGE("Reboot key pressed short."), LOG_MESSAGE("Reboot key pressed short."),
"MESSAGE_ID=" SD_MESSAGE_REBOOT_KEY_STR); "MESSAGE_ID=" SD_MESSAGE_REBOOT_KEY_STR);
@ -293,6 +309,30 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
manager_handle_action(b->manager, INHIBIT_HANDLE_REBOOT_KEY, b->manager->handle_reboot_key, b->manager->reboot_key_ignore_inhibited, true); manager_handle_action(b->manager, INHIBIT_HANDLE_REBOOT_KEY, b->manager->handle_reboot_key, b->manager->reboot_key_ignore_inhibited, true);
} }
break;
case KEY_SLEEP:
if (b->manager->suspend_key_long_press_event_source) {
log_struct(LOG_INFO,
LOG_MESSAGE("Suspend key pressed short."),
"MESSAGE_ID=" SD_MESSAGE_SUSPEND_KEY_STR);
b->manager->suspend_key_long_press_event_source = sd_event_source_unref(b->manager->suspend_key_long_press_event_source);
manager_handle_action(b->manager, INHIBIT_HANDLE_SUSPEND_KEY, b->manager->handle_suspend_key, b->manager->suspend_key_ignore_inhibited, true);
}
break;
case KEY_SUSPEND:
if (b->manager->hibernate_key_long_press_event_source) {
log_struct(LOG_INFO,
LOG_MESSAGE("Hibernate key pressed short."),
"MESSAGE_ID=" SD_MESSAGE_HIBERNATE_KEY_STR);
b->manager->hibernate_key_long_press_event_source = sd_event_source_unref(b->manager->hibernate_key_long_press_event_source);
manager_handle_action(b->manager, INHIBIT_HANDLE_HIBERNATE_KEY, b->manager->handle_hibernate_key, b->manager->hibernate_key_ignore_inhibited, true);
}
break;
} }
} else if (ev.type == EV_SW && ev.value > 0) { } else if (ev.type == EV_SW && ev.value > 0) {

View File

@ -22,8 +22,8 @@ if conf.get('ENABLE_PORTABLED') == 1
install_data('org.freedesktop.portable1.policy', install_data('org.freedesktop.portable1.policy',
install_dir : polkitpolicydir) install_dir : polkitpolicydir)
install_data('profile/default/service.conf', install_dir : join_paths(profiledir, 'default')) install_data('profile/default/service.conf', install_dir : profiledir / 'default')
install_data('profile/nonetwork/service.conf', install_dir : join_paths(profiledir, 'nonetwork')) install_data('profile/nonetwork/service.conf', install_dir : profiledir / 'nonetwork')
install_data('profile/strict/service.conf', install_dir : join_paths(profiledir, 'strict')) install_data('profile/strict/service.conf', install_dir : profiledir / 'strict')
install_data('profile/trusted/service.conf', install_dir : join_paths(profiledir, 'trusted')) install_data('profile/trusted/service.conf', install_dir : profiledir / 'trusted')
endif endif

View File

@ -77,7 +77,7 @@ foreach header : _systemd_headers + _not_installed_headers + [libudev_h_path]
check_compilation_sh, check_compilation_sh,
args : cc.cmd_array() + ['-c', '-x'] + opt + args : cc.cmd_array() + ['-c', '-x'] + opt +
['-Werror', '-include', ['-Werror', '-include',
join_paths(meson.current_source_dir(), header)]) meson.current_source_dir() / header])
endif endif
endforeach endforeach
endforeach endforeach

View File

@ -153,7 +153,7 @@ endforeach
if install_sysconfdir_samples if install_sysconfdir_samples
install_data('udev.conf', install_data('udev.conf',
install_dir : join_paths(sysconfdir, 'udev')) install_dir : sysconfdir / 'udev')
endif endif
custom_target( custom_target(
@ -167,7 +167,7 @@ custom_target(
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'udev/rules.d'))) mkdir_p.format(sysconfdir / 'udev/rules.d'))
endif endif
fuzzers += [ fuzzers += [

View File

@ -23,5 +23,5 @@ custom_target(
if install_sysconfdir if install_sysconfdir
meson.add_install_script('sh', '-c', meson.add_install_script('sh', '-c',
mkdir_p.format(join_paths(sysconfdir, 'sysctl.d'))) mkdir_p.format(sysconfdir / 'sysctl.d'))
endif endif

View File

@ -140,7 +140,7 @@ if want_tests != 'false' and dmi_arches.contains(host_machine.cpu_family())
endif endif
foreach p : out.stdout().split() foreach p : out.stdout().split()
source = join_paths(project_source_root, p) source = project_source_root / p
name = 'dmidecode_' + p.split('/')[-1].split('.')[0] name = 'dmidecode_' + p.split('/')[-1].split('.')[0]
test(name, test(name,

View File

@ -52,6 +52,5 @@ endforeach
if enable_tmpfiles and install_sysconfdir if enable_tmpfiles and install_sysconfdir
meson.add_install_script( meson.add_install_script(
'sh', '-c', 'sh', '-c', mkdir_p.format(sysconfdir / 'tmpfiles.d'))
mkdir_p.format(join_paths(sysconfdir, 'tmpfiles.d')))
endif endif

View File

@ -307,17 +307,17 @@ install_data('user-.slice.d/10-defaults.conf',
if install_sysconfdir if install_sysconfdir
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(pkgsysconfdir, 'user'), pkgsysconfdir / 'user',
join_paths(sysconfdir, 'xdg/systemd/user')) sysconfdir / 'xdg/systemd/user')
endif endif
meson.add_install_script(meson_make_symlink, meson.add_install_script(meson_make_symlink,
join_paths(dbussystemservicedir, 'org.freedesktop.systemd1.service'), dbussystemservicedir / 'org.freedesktop.systemd1.service',
join_paths(dbussessionservicedir, 'org.freedesktop.systemd1.service')) dbussessionservicedir / 'org.freedesktop.systemd1.service')
if conf.get('HAVE_SYSV_COMPAT') == 1 if conf.get('HAVE_SYSV_COMPAT') == 1
foreach i : [1, 2, 3, 4, 5] foreach i : [1, 2, 3, 4, 5]
meson.add_install_script( meson.add_install_script(
'sh', '-c', 'sh', '-c',
mkdir_p.format(join_paths(systemunitdir, 'runlevel@0@.target.wants'.format(i)))) mkdir_p.format(systemunitdir / 'runlevel@0@.target.wants'.format(i)))
endforeach endforeach
endif endif