summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/add-git-hook.sh13
-rwxr-xr-xtools/analyze-dump-sort.py80
-rwxr-xr-xtools/catalog-report.py84
-rwxr-xr-xtools/check-api-docs.sh44
-rwxr-xr-xtools/check-help.sh47
-rwxr-xr-xtools/check-includes.py32
-rw-r--r--tools/check-version-history.py135
-rwxr-xr-xtools/check-version.sh36
-rw-r--r--tools/chromiumos/gen_autosuspend_rules.py402
-rw-r--r--tools/command_ignorelist527
-rwxr-xr-xtools/coverity.sh62
-rwxr-xr-xtools/dbus_exporter.py43
-rw-r--r--tools/dbus_ignorelist2174
-rwxr-xr-xtools/debug-sd-boot.sh85
-rw-r--r--tools/dump-auxv.py141
-rwxr-xr-xtools/elf2efi.py699
-rwxr-xr-xtools/find-build-dir.sh33
-rwxr-xr-xtools/find-double-newline.sh43
-rwxr-xr-xtools/find-tabs.sh43
-rw-r--r--tools/function_ignorelist34
-rw-r--r--tools/gdb-sd_dump_hashmaps.py78
-rwxr-xr-xtools/generate-gperfs.py29
-rwxr-xr-xtools/git-contrib.sh15
-rw-r--r--tools/list-discoverable-partitions.py193
-rwxr-xr-xtools/make-autosuspend-rules.py24
-rwxr-xr-xtools/make-directive-index.py175
-rwxr-xr-xtools/make-man-index.py112
-rwxr-xr-xtools/meson-build.sh21
-rwxr-xr-xtools/meson-render-jinja2.py44
-rwxr-xr-xtools/meson-vcs-tag.sh33
-rwxr-xr-xtools/oss-fuzz.sh143
-rwxr-xr-xtools/sync-docs.py151
-rwxr-xr-xtools/update-dbus-docs.py365
-rwxr-xr-xtools/update-hwdb-autosuspend.sh17
-rwxr-xr-xtools/update-hwdb.sh33
-rwxr-xr-xtools/update-man-rules.py101
-rwxr-xr-xtools/update-syscall-tables.sh11
-rwxr-xr-xtools/xml_helper.py26
38 files changed, 6328 insertions, 0 deletions
diff --git a/tools/add-git-hook.sh b/tools/add-git-hook.sh
new file mode 100755
index 0000000..8cff62e
--- /dev/null
+++ b/tools/add-git-hook.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+
+cd "${MESON_SOURCE_ROOT:?}"
+
+if [ ! -f .git/hooks/pre-commit.sample ] || [ -f .git/hooks/pre-commit ]; then
+ exit 2 # not needed
+fi
+
+cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit
+chmod +x .git/hooks/pre-commit
+echo 'Activated pre-commit hook'
diff --git a/tools/analyze-dump-sort.py b/tools/analyze-dump-sort.py
new file mode 100755
index 0000000..cc9a9fc
--- /dev/null
+++ b/tools/analyze-dump-sort.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# pylint: disable=consider-using-with
+
+"""
+A helper to compare 'systemd-analyze dump' outputs.
+
+systemd-analyze dump >/var/tmp/dump1
+(reboot)
+tools/analyze-dump-sort.py /var/tmp/dump1 → this does a diff from dump1 to current
+
+systemd-analyze dump >/var/tmp/dump2
+tools/analyze-dump-sort.py /var/tmp/{dump1,dump2} → this does a diff from dump1 to dump2
+"""
+
+import argparse
+import subprocess
+import tempfile
+
+
+def sort_dump(sourcefile, destfile=None):
+ if destfile is None:
+ destfile = tempfile.NamedTemporaryFile('wt')
+
+ units = {}
+ unit = []
+
+ same = []
+
+ for line in sourcefile:
+ line = line.rstrip()
+
+ header = line.split(':')[0]
+ if 'Timestamp' in header or 'Invocation ID' in header or 'PID' in header:
+ line = header + ': …'
+
+ if line.startswith('->'):
+ if unit:
+ units[unit[0]] = unit
+ unit = [line]
+ elif line.startswith('\t'):
+ assert unit
+
+ if same and same[0].startswith(header):
+ same.append(line)
+ else:
+ unit.extend(sorted(same, key=str.lower))
+ same = [line]
+ else:
+ print(line, file=destfile)
+
+ if unit:
+ units[unit[0]] = unit
+
+ for unit in sorted(units.values()):
+ print('\n'.join(unit), file=destfile)
+
+ destfile.flush()
+ return destfile
+
+def parse_args():
+ p = argparse.ArgumentParser(description=__doc__)
+ p.add_argument('one')
+ p.add_argument('two', nargs='?')
+ p.add_argument('--user', action='store_true')
+ return p.parse_args()
+
+if __name__ == '__main__':
+ opts = parse_args()
+
+ one = sort_dump(open(opts.one))
+ if opts.two:
+ two = sort_dump(open(opts.two))
+ else:
+ user = ['--user'] if opts.user else []
+ two = subprocess.run(['systemd-analyze', 'dump', *user],
+ capture_output=True, text=True, check=True)
+ two = sort_dump(two.stdout.splitlines())
+ with subprocess.Popen(['diff', '-U10', one.name, two.name], stdout=subprocess.PIPE) as diff:
+ subprocess.Popen(['less'], stdin=diff.stdout)
diff --git a/tools/catalog-report.py b/tools/catalog-report.py
new file mode 100755
index 0000000..060b1aa
--- /dev/null
+++ b/tools/catalog-report.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: MIT
+#
+# This file is distributed under the MIT license, see below.
+#
+# The MIT License (MIT)
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""
+Prints out journal entries with no or bad catalog explanations.
+"""
+
+import re
+
+from systemd import id128, journal
+
+
+# pylint: disable=consider-using-f-string
+def log_entry(entry):
+ if 'CODE_FILE' in entry:
+ # some of our code was using 'CODE_FUNCTION' instead of 'CODE_FUNC'
+ print('{}:{} {}'.format(entry.get('CODE_FILE', '???'),
+ entry.get('CODE_LINE', '???'),
+ entry.get('CODE_FUNC', None) or entry.get('CODE_FUNCTION', '???')))
+ print(' {}'.format(entry.get('MESSAGE', 'no message!')))
+ for k, v in entry.items():
+ if k.startswith('CODE_') or k in {'MESSAGE_ID', 'MESSAGE'}:
+ continue
+ print(f' {k}={v}')
+ print()
+
+if __name__ == '__main__':
+ j = journal.Reader()
+ logged = set()
+ pattern = re.compile('@[A-Z0-9_]+@')
+
+ mids = { v:k for k,v in id128.__dict__.items() if k.startswith('SD_MESSAGE') }
+
+ for i, x in enumerate(j):
+ if i % 1000 == 0:
+ print(i, end='\r')
+
+ try:
+ mid = x['MESSAGE_ID']
+ except KeyError:
+ continue
+ name = mids.get(mid, 'unknown')
+
+ try:
+ desc = journal.get_catalog(mid)
+ except FileNotFoundError:
+ if mid in logged:
+ continue
+
+ print(f'{name} {mid.hex}: no catalog entry')
+ log_entry(x)
+ logged.add(mid)
+ continue
+
+ fields = [field[1:-1] for field in pattern.findall(desc)]
+ for field in fields:
+ index = (mid, field)
+ if field in x or index in logged:
+ continue
+ print(f'{name} {mid.hex}: no field {field}')
+ log_entry(x)
+ logged.add(index)
diff --git a/tools/check-api-docs.sh b/tools/check-api-docs.sh
new file mode 100755
index 0000000..2e973a0
--- /dev/null
+++ b/tools/check-api-docs.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+set -o pipefail
+
+sd_good=0
+sd_total=0
+udev_good=0
+udev_total=0
+
+deprecated=(
+ -e sd_bus_try_close
+ -e sd_bus_process_priority
+ -e sd_bus_message_get_priority
+ -e sd_bus_message_set_priority
+ -e sd_seat_can_multi_session
+ -e sd_journal_open_container
+)
+
+for symbol in $(nm -g --defined-only "$@" | grep " T " | cut -d" " -f3 | grep -wv "${deprecated[@]}" | sort -u); do
+ if test -f "${MESON_BUILD_ROOT:?}/man/$symbol.3"; then
+ echo "✓ Symbol $symbol() is documented."
+ good=1
+ else
+ echo -e " \x1b[1;31mSymbol $symbol() lacks documentation.\x1b[0m"
+ good=0
+ fi
+
+ case "$symbol" in
+ sd_*)
+ ((sd_good+=good))
+ ((sd_total+=1))
+ ;;
+ udev_*)
+ ((udev_good+=good))
+ ((udev_total+=1))
+ ;;
+ *)
+ echo 'unknown symbol prefix'
+ exit 1
+ esac
+done
+
+echo "libsystemd: $sd_good/$sd_total libudev: $udev_good/$udev_total"
diff --git a/tools/check-help.sh b/tools/check-help.sh
new file mode 100755
index 0000000..f974293
--- /dev/null
+++ b/tools/check-help.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+set -o pipefail
+
+# Note: 'grep ... >/dev/null' instead of just 'grep -q' is used intentionally
+# here, since 'grep -q' exits on the first match causing SIGPIPE being
+# sent to the sender.
+
+BINARY="${1:?}"
+export SYSTEMD_LOG_LEVEL=info
+
+if [[ ! -x "$BINARY" ]]; then
+ echo "$BINARY is not an executable"
+ exit 1
+fi
+
+# output width
+if "$BINARY" --help | grep -v 'default:' | grep -E '.{80}.' >/dev/null; then
+ echo "$(basename "$BINARY") --help output is too wide:"
+ "$BINARY" --help | awk 'length > 80' | grep -E --color=yes '.{80}'
+ exit 1
+fi
+
+# --help prints something. Also catches case where args are ignored.
+if ! "$BINARY" --help | grep . >/dev/null; then
+ echo "$(basename "$BINARY") --help output is empty"
+ exit 2
+fi
+
+# no --help output to stderr
+if "$BINARY" --help 2>&1 1>/dev/null | grep .; then
+ echo "$(basename "$BINARY") --help prints to stderr"
+ exit 3
+fi
+
+# error output to stderr
+if ! ("$BINARY" --no-such-parameter 2>&1 1>/dev/null || :) | grep . >/dev/null; then
+ echo "$(basename "$BINARY") with an unknown parameter does not print to stderr"
+ exit 4
+fi
+
+# --help and -h are equivalent
+if ! diff <("$BINARY" -h) <("$BINARY" --help); then
+ echo "$(basename "$BINARY") --help and -h are not identical"
+ exit 5
+fi
diff --git a/tools/check-includes.py b/tools/check-includes.py
new file mode 100755
index 0000000..5d5b39f
--- /dev/null
+++ b/tools/check-includes.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# pylint: disable=consider-using-with
+
+import os
+import pathlib
+import re
+import sys
+
+PROJECT_ROOT = pathlib.Path(os.getenv('PROJECT_SOURCE_ROOT', '.'))
+
+def check_file(filename):
+ seen = set()
+ good = True
+ for n, line in enumerate(open(filename)):
+ m = re.match(r'^\s*#\s*include\s*[<"](\S*)[>"]', line)
+ if m:
+ include = m.group(1)
+ if include in seen:
+ try:
+ filename = pathlib.Path(filename).resolve().relative_to(PROJECT_ROOT)
+ except ValueError:
+ pass
+ print(f'{filename}:{n}: {line.strip()}')
+ good = False
+ seen.add(include)
+ return good
+
+if __name__ == '__main__':
+ all_good = all(check_file(name) for name in sys.argv[1:])
+ sys.exit(0 if all_good else 1)
diff --git a/tools/check-version-history.py b/tools/check-version-history.py
new file mode 100644
index 0000000..c4d4b3e
--- /dev/null
+++ b/tools/check-version-history.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import os
+import sys
+import lxml.etree as tree
+
+_parser = tree.XMLParser(resolve_entities=False)
+tree.set_default_parser(_parser)
+
+
+def find_undocumented_functions(pages, ignorelist):
+ undocumented = []
+ for page in pages:
+ filename = os.path.basename(page)
+ pagetree = tree.parse(page)
+
+ assert pagetree.getroot().tag == "refentry"
+
+ hist_section = pagetree.find("refsect1[title='History']")
+ for func in pagetree.findall("//funcprototype/funcdef/function"):
+ path = f"/refsynopsisdiv/funcsynopsis/funcprototype/funcdef/function[.='{func.text}']"
+ assert pagetree.findall(path) == [func]
+
+ if (
+ hist_section is None
+ or hist_section.find(f"para/function[.='{func.text}()']") is None
+ ):
+ if func.text not in ignorelist:
+ undocumented.append((filename, func.text))
+ return undocumented
+
+
+def construct_path(element):
+ tag = element.tag
+
+ if tag == "refentry":
+ return ""
+
+ predicate = ""
+ if tag == "varlistentry":
+ text = "".join(element.find("term").itertext())
+ predicate = f'[term="{text}"]'
+ elif tag.startswith("refsect"):
+ text = "".join(element.find("title").itertext())
+ predicate = f'[title="{text}"]'
+ elif tag == "variablelist":
+ varlists = element.getparent().findall(tag)
+ if len(varlists) > 1:
+ predicate = f"[{varlists.index(element)+1}]"
+
+ return construct_path(element.getparent()) + "/" + tag + predicate
+
+
+def find_undocumented_commands(pages, ignorelist):
+ undocumented = []
+ for page in pages:
+ filename = os.path.basename(page)
+
+ pagetree = tree.parse(page)
+ if pagetree.getroot().tag != "refentry":
+ continue
+
+ for varlistentry in pagetree.findall("*//variablelist/varlistentry"):
+ path = construct_path(varlistentry)
+
+ assert pagetree.findall(path) == [varlistentry]
+
+ listitem = varlistentry.find("listitem")
+ parent = listitem if listitem is not None else varlistentry
+
+ rev = parent.getchildren()[-1]
+ if rev.get("href") != "version-info.xml":
+ if (filename, path) not in ignorelist:
+ undocumented.append((filename, path))
+ return undocumented
+
+
+def process_pages(pages):
+ command_pages = []
+ function_pages = []
+
+ for page in pages:
+ filename = os.path.basename(page)
+ if filename.startswith("org.freedesktop."): # dbus
+ continue
+
+ if (
+ filename.startswith("sd_")
+ or filename.startswith("sd-")
+ or filename.startswith("udev_")
+ ):
+ function_pages.append(page)
+ continue
+
+ command_pages.append(page)
+
+ undocumented_commands = find_undocumented_commands(
+ command_pages, command_ignorelist
+ )
+ undocumented_functions = find_undocumented_functions(
+ function_pages, function_ignorelist
+ )
+
+ return undocumented_commands, undocumented_functions
+
+
+if __name__ == "__main__":
+ with open(os.path.join(os.path.dirname(__file__), "command_ignorelist")) as f:
+ command_ignorelist = []
+ for l in f.read().splitlines():
+ if l.startswith("#"):
+ continue
+ fname, path = l.split(" ", 1)
+ path = path.replace("\\n", "\n")
+ command_ignorelist.append((fname, path))
+ with open(os.path.join(os.path.dirname(__file__), "function_ignorelist")) as f:
+ function_ignorelist = f.read().splitlines()
+
+ undocumented_commands, undocumented_functions = process_pages(sys.argv[1:])
+
+ if undocumented_commands or undocumented_functions:
+ for filename, func in undocumented_functions:
+ print(
+ f"Function {func}() in {filename} isn't documented in the History section."
+ )
+ for filename, path in undocumented_commands:
+ print(filename, path, "is undocumented")
+ if undocumented_commands:
+ print(
+ "Hint: if you reorganized this part of the documentation, "
+ "please update tools/commands_ignorelist."
+ )
+
+ sys.exit(1)
diff --git a/tools/check-version.sh b/tools/check-version.sh
new file mode 100755
index 0000000..faefb46
--- /dev/null
+++ b/tools/check-version.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+set -o pipefail
+
+# Note: 'grep ... >/dev/null' instead of just 'grep -q' is used intentionally
+# here, since 'grep -q' exits on the first match causing SIGPIPE being
+# sent to the sender.
+
+BINARY="${1:?}"
+VERSION="${2:?}"
+export SYSTEMD_LOG_LEVEL=info
+
+if [[ ! -x "$BINARY" ]]; then
+ echo "$BINARY is not an executable"
+ exit 1
+fi
+
+# --version prints something. Also catches case where args are ignored.
+if ! "$BINARY" --version | grep . >/dev/null; then
+ echo "$(basename "$BINARY") --version output is empty"
+ exit 2
+fi
+
+# no --version output to stderr
+if "$BINARY" --version 2>&1 1>/dev/null | grep .; then
+ echo "$(basename "$BINARY") --version prints to stderr"
+ exit 3
+fi
+
+# project version appears in version output
+out="$("$BINARY" --version)"
+if ! grep -F "$VERSION" >/dev/null <<<"$out"; then
+ echo "$(basename "$BINARY") --version output does not match '$VERSION': $out"
+ exit 4
+fi
diff --git a/tools/chromiumos/gen_autosuspend_rules.py b/tools/chromiumos/gen_autosuspend_rules.py
new file mode 100644
index 0000000..76b166a
--- /dev/null
+++ b/tools/chromiumos/gen_autosuspend_rules.py
@@ -0,0 +1,402 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: BSD-3-Clause
+# -*- coding: utf-8 -*-
+
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSES/BSD-3-Clause.txt file.
+
+"""Autosuspend udev rule generator
+
+This script is executed at build time to generate udev rules. The
+resulting rules file is installed on the device, the script itself
+is not.
+"""
+
+# List of USB devices (vendorid:productid) for which it is safe to enable
+# autosuspend.
+USB_IDS = []
+
+# Host Controllers and internal hubs
+USB_IDS += [
+ # Linux Host Controller (UHCI) (most older x86 boards)
+ "1d6b:0001",
+ # Linux Host Controller (EHCI) (all boards)
+ "1d6b:0002",
+ # Linux Host Controller (XHCI) (most newer boards)
+ "1d6b:0003",
+ # SMSC (Internal HSIC Hub) (most Exynos boards)
+ "0424:3503",
+ # Intel (Rate Matching Hub) (all x86 boards)
+ "05e3:0610",
+ # Intel (Internal Hub?) (peppy, falco)
+ "8087:0024",
+ # Genesys Logic (Internal Hub) (rambi)
+ "8087:8000",
+ # Microchip (Composite HID + CDC) (kefka)
+ "04d8:0b28",
+]
+
+# Webcams
+USB_IDS += [
+ # Chicony (zgb)
+ "04f2:b1d8",
+ # Chicony (mario)
+ "04f2:b262",
+ # Chicony (stout)
+ "04f2:b2fe",
+ # Chicony (butterfly)
+ "04f2:b35f",
+ # Chicony (rambi)
+ "04f2:b443",
+ # Chicony (glados)
+ "04f2:b552",
+ # LiteOn (spring)
+ "058f:b001",
+ # Foxlink? (butterfly)
+ "05c8:0351",
+ # Foxlink? (butterfly)
+ "05c8:0355",
+ # Cheng Uei? (falco)
+ "05c8:036e",
+ # SuYin (parrot)
+ "064e:d251",
+ # Realtek (falco)
+ "0bda:571c",
+ # IMC Networks (squawks)
+ "13d3:5657",
+ # Sunplus (parrot)
+ "1bcf:2c17",
+ # (C-13HDO10B39N) (alex)
+ "2232:1013",
+ # (C-10HDP11538N) (lumpy)
+ "2232:1017",
+ # (Namuga) (link)
+ "2232:1033",
+ # (C-03FFM12339N) (daisy)
+ "2232:1037",
+ # (C-10HDO13531N) (peach)
+ "2232:1056",
+ # (NCM-G102) (samus)
+ "2232:6001",
+ # Acer (stout)
+ "5986:0299",
+]
+
+# Bluetooth Host Controller
+USB_IDS += [
+ # Hon-hai (parrot)
+ "0489:e04e",
+ # Hon-hai (peppy)
+ "0489:e056",
+ # Hon-hai (Kahlee)
+ "0489:e09f",
+ # QCA6174A (delan)
+ "0489:e0a2",
+ # LiteOn (parrot)
+ "04ca:3006",
+ # LiteOn (aleena)
+ "04ca:3016",
+ # LiteOn (scarlet)
+ "04ca:301a",
+ # Realtek (blooglet)
+ "0bda:b00c",
+ # Atheros (stumpy, stout)
+ "0cf3:3004",
+ # Atheros (AR3011) (mario, alex, zgb)
+ "0cf3:3005",
+ # Atheros (stumyp)
+ "0cf3:3007",
+ # Atheros (butterfly)
+ "0cf3:311e",
+ # Atheros (scarlet)
+ "0cf3:e300",
+ # Marvell (rambi)
+ "1286:2046",
+ # Marvell (gru)
+ "1286:204e",
+ # Intel (rambi, samus)
+ "8087:07dc",
+ # Intel (strago, glados)
+ "8087:0a2a",
+ # Intel (octopus)
+ "8087:0aaa",
+ # Intel (hatch)
+ "8087:0026",
+ # Intel (atlas)
+ "8087:0025",
+]
+
+# WWAN (LTE)
+USB_IDS += [
+ # Huawei (ME936) (kip)
+ "12d1:15bb",
+ # Fibocom (L850-GL) (coral, nautilus, sarien)
+ "2cb7:0007",
+ # Fibocom (NL668, NL652)
+ "2cb7:01a0",
+ # Fibocom (FM101-GL) (mbim)
+ "2cb7:01a2",
+ # Fibocom (FM101-GL) (adb)
+ "2cb7:01a4",
+]
+
+# Mass Storage
+USB_IDS += [
+ # Genesys (SD card reader) (lumpy, link, peppy)
+ "05e3:0727",
+ # Realtek (SD card reader) (mario, alex)
+ "0bda:0138",
+ # Realtek (SD card reader) (helios)
+ "0bda:0136",
+ # Realtek (SD card reader) (falco)
+ "0bda:0177",
+ # Realtek (SD card reader) (pirrha)
+ "0bda:0129",
+]
+
+# Security Key
+USB_IDS += [
+ # Yubico.com
+ "1050:0211",
+ # Yubico.com (HID firmware)
+ "1050:0200",
+ # Google Titan key
+ "18d1:5026",
+]
+
+# USB Audio devices
+USB_IDS += [
+ # Google USB-C to 3.5mm Digital Headphone Jack Adapter 'Mir'
+ "18d1:5025",
+ # Google USB-C to 3.5mm Digital Headphone Jack Adapter 'Mir' (HID only)
+ "18d1:5029",
+ # Google USB-C to 3.5mm Digital Headphone Jack Adapter 2018 'Condor'
+ "18d1:5034",
+ # Google Pixel USB-C Earbuds 'Blackbird'
+ "18d1:5033",
+ # Libratone Q Adapt In-Ear USB-C Earphones, Made for Google
+ "03eb:2433",
+ # Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google
+ "282b:48f0",
+ # Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google (HID only)
+ "282b:0026",
+ # AiAiAi TMA-2 C60 Cable, Made for Google
+ "0572:1a08",
+ # Apple USB-C to 3.5mm Headphone Jack Adapter
+ "05ac:110a",
+]
+
+# RGB Keyboard
+USB_IDS += [
+ # Google Prism
+ "18d1:5022",
+]
+
+# List of PCI devices (vendorid:deviceid) for which it is safe to enable
+# autosuspend.
+PCI_IDS = []
+
+# Intel
+PCI_IDS += [
+ # Host bridge
+ "8086:590c",
+ # i915
+ "8086:591e",
+ # proc_thermal
+ "8086:1903",
+ # SPT PCH xHCI controller
+ "8086:9d2f",
+ # CNP PCH xHCI controller
+ "8086:9ded",
+ # intel_pmc_core
+ "8086:9d21",
+ # i801_smbus
+ "8086:9d23",
+ # iwlwifi
+ "8086:095a",
+ # GMM
+ "8086:1911",
+ # Thermal
+ "8086:9d31",
+ # MME
+ "8086:9d3a",
+ # CrOS EC
+ "8086:9d4b",
+ # PCH SPI
+ "8086:9d24",
+ # SATA
+ "8086:02d3",
+ # RAM memory
+ "8086:02ef",
+ # ISA bridge
+ "8086:0284",
+ # Communication controller
+ "8086:02e0",
+ # Network controller
+ "8086:02f0",
+ # Serial bus controller
+ "8086:02a4",
+ # USB controller
+ "8086:02ed",
+ # JSL xHCI controller
+ "8086:4ded",
+ # Volteer xHCI controller
+ "8086:a0ed",
+ # Brya xHCI controller
+ "8086:51ed",
+ # ADL-N PCH xHCI controller
+ "8086:54ed",
+ # Graphics
+ "8086:9b41",
+ # DSP
+ "8086:02f9",
+ # Host bridge
+ "8086:9b61",
+ # Host bridge
+ "8086:9b71",
+ # PCI Bridge
+ "8086:02b0",
+ # i915 (atlas)
+ "8086:591c",
+ # iwlwifi (atlas)
+ "8086:2526",
+ # i915 (kefka)
+ "8086:22b1",
+ # proc_thermal (kefka)
+ "8086:22dc",
+ # xchi_hdc (kefka)
+ "8086:22b5",
+ # snd_hda (kefka)
+ "8086:2284",
+ # pcieport (kefka)
+ "8086:22c8",
+ "8086:22cc",
+ # lpc_ich (kefka)
+ "8086:229c",
+ # iosf_mbi_pci (kefka)
+ "8086:2280",
+ # Host bridge (nami)
+ "8086:5904",
+ "8086:5914",
+ # Graphics (nami)
+ "8086:5906",
+ "8086:5917",
+ # ISA bridge (nami)
+ "8086:9d4e",
+ # wifi 7265 (nami)
+ "8086:095b",
+ # Graphics (brya)
+ "8086:46a8",
+ # Core 12G GNA (brya)
+ "8086:464f",
+ # PCH Shared SRAM (brya)
+ "8086:51ef",
+ # PCH eSPI (brya)
+ "8086:5182",
+ "8086:4601",
+ # Core 12G DTT (brya)
+ "8086:461d",
+ # Wifi (Brya)
+ "8086:51f0",
+ # PCH SPI (brya)
+ "8086:51a4",
+]
+
+# Samsung
+PCI_IDS += [
+ # NVMe KUS030205M-B001
+ "144d:a806",
+ # NVMe MZVLB256HAHQ
+ "144d:a808",
+ # NVMe MZ9LQ256HBJD-00BH1 (brya)
+ "144d:a809",
+]
+
+# Lite-on
+PCI_IDS += [
+ # 3C07110288
+ "14a4:9100",
+]
+
+# Seagate
+PCI_IDS += [
+ # ZP256CM30011
+ "7089:5012",
+]
+
+# Kingston
+PCI_IDS += [
+ # RBUSNS8154P3128GJ3
+ "2646:5008",
+]
+
+# Genesys Logic
+PCI_IDS += [
+ # SD Host Controller (brya)
+ "17a0:9755",
+]
+
+# Phison
+PCI_IDS += [
+ # E13 NVMe Controller (redrix)
+ '1987:5013',
+ # E18 PCIe4 NVMe Controller (vell)
+ '1987:5018',
+]
+
+# Do not edit below this line. #################################################
+
+UDEV_RULE = """\
+ACTION!="add", GOTO="autosuspend_end"
+SUBSYSTEM!="i2c|pci|usb", GOTO="autosuspend_end"
+
+SUBSYSTEM=="i2c", GOTO="autosuspend_i2c"
+SUBSYSTEM=="pci", GOTO="autosuspend_pci"
+SUBSYSTEM=="usb", GOTO="autosuspend_usb"
+
+# I2C rules
+LABEL="autosuspend_i2c"
+ATTR{name}=="cyapa", ATTR{power/control}="on", GOTO="autosuspend_end"
+GOTO="autosuspend_end"
+
+# PCI rules
+LABEL="autosuspend_pci"
+%(pci_rules)s\
+GOTO="autosuspend_end"
+
+# USB rules
+LABEL="autosuspend_usb"
+%(usb_rules)s\
+GOTO="autosuspend_end"
+
+# Enable autosuspend
+LABEL="autosuspend_enable"
+TEST=="power/control", ATTR{power/control}="auto", GOTO="autosuspend_end"
+
+LABEL="autosuspend_end"
+"""
+
+
+def main():
+ pci_rules = ""
+ for dev_ids in PCI_IDS:
+ vendor, device = dev_ids.split(":")
+ pci_rules += (
+ 'ATTR{vendor}=="0x%s", ATTR{device}=="0x%s", '
+ 'GOTO="autosuspend_enable"\n' % (vendor, device)
+ )
+
+ usb_rules = ""
+ for dev_ids in USB_IDS:
+ vid, pid = dev_ids.split(":")
+ usb_rules += (
+ 'ATTR{idVendor}=="%s", ATTR{idProduct}=="%s", '
+ 'GOTO="autosuspend_enable"\n' % (vid, pid)
+ )
+
+ print(UDEV_RULE % {"pci_rules": pci_rules, "usb_rules": usb_rules})
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/command_ignorelist b/tools/command_ignorelist
new file mode 100644
index 0000000..186136d
--- /dev/null
+++ b/tools/command_ignorelist
@@ -0,0 +1,527 @@
+# The format for this file is "filename xpath" separated by a space, where the xpath is in a format
+# supported by the `find` method of ElemenTree.
+# To reduce the need to change the xpaths when items are added or removed, we use predicates depending
+# on the contents: `title` for sections (refsect1 and refsect2) and `term` for varlistentry.
+# Wherever said contents contain a newline, it is replaced by "\n".
+# If you change the title of a section, you need to change the corresponding title in this file.
+journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-a"]
+journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-f"]
+journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-n"]
+journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="--no-tail"]
+journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-o"]
+journalctl.xml /refsect1[title="Output Options"]/variablelist/varlistentry[term="-q"]
+journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Compress="]
+journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RateLimitIntervalSec="]
+journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="SystemMaxUse="]
+journald.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ForwardToSyslog="]
+loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"]
+loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-a"]
+loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-ask-password"]
+loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--kill-whom="]
+loginctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-s"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="list-sessions"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="session-status ID…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="show-session ID…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="activate ID"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="lock-session ID…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="terminate-session ID…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Session Commands"]/variablelist/varlistentry[term="kill-session ID…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="list-users"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="user-status USER…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="show-user USER…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="enable-linger USER…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="terminate-user USER…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="User Commands"]/variablelist/varlistentry[term="kill-user USER…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="list-seats"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="seat-status NAME…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="show-seat NAME…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="attach NAME DEVICE…"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="flush-devices"]
+loginctl.xml /refsect1[title="Commands"]/refsect2[title="Seat Commands"]/variablelist/varlistentry[term="terminate-seat NAME…"]
+logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="NAutoVTs="]
+logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KillUserProcesses="]
+logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KillOnlyUsers="]
+logind.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="InhibitDelayMaxSec="]
+machine-info.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PRETTY_HOSTNAME="]
+machine-info.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ICON_NAME="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="NAME="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="Information about the version of the operating system"]/variablelist/varlistentry[term="VERSION="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="ID="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="ID_LIKE="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="Information about the version of the operating system"]/variablelist/varlistentry[term="VERSION_ID="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="PRETTY_NAME="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="Presentation information and links"]/variablelist/varlistentry[term="ANSI_COLOR="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="General information identifying the operating system"]/variablelist/varlistentry[term="CPE_NAME="]
+os-release.xml /refsect1[title="Options"]/refsect2[title="Presentation information and links"]/variablelist/varlistentry[term="HOME_URL="]
+pam_systemd.xml /refsect1[title="Options"]/variablelist/varlistentry[term="debug="]
+pam_systemd.xml /refsect1[title="Environment"]/variablelist[1]/varlistentry[term="$XDG_SESSION_ID"]
+pam_systemd.xml /refsect1[title="Environment"]/variablelist[1]/varlistentry[term="$XDG_RUNTIME_DIR"]
+runlevel.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--help"]
+runlevel.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$RUNLEVEL"]
+runlevel.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$PREVLEVEL"]
+runlevel.xml /refsect1[title="Files"]/variablelist/varlistentry[term="/run/utmp"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--help"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-H"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-P"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-r"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-h"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-k"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-wall"]
+shutdown.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-c"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-a"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-l"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-q"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-block"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-wall"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--global"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-reload"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-ask-password"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--kill-whom="]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-f"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--root="]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--runtime"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-n"]
+systemctl.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-o"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="list-units PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="start PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="stop PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="reload PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="restart PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="try-restart PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="reload-or-restart PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="isolate UNIT"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="kill PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="is-active PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="status PATTERN…|PID…]"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="show PATTERN…|JOB…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit Commands (Introspection and Modification)"]/variablelist/varlistentry[term="reset-failed [PATTERN…]"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="list-unit-files PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="enable UNIT…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="is-enabled UNIT…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="reenable UNIT…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="preset UNIT…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="mask UNIT…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="unmask UNIT…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Unit File Commands"]/variablelist/varlistentry[term="link PATH…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Job Commands"]/variablelist/varlistentry[term="list-jobs PATTERN…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Job Commands"]/variablelist/varlistentry[term="cancel JOB…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Manager State Commands"]/variablelist/varlistentry[term="daemon-reload"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Manager State Commands"]/variablelist/varlistentry[term="daemon-reexec"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Environment Commands"]/variablelist/varlistentry[term="show-environment"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Environment Commands"]/variablelist/varlistentry[term="set-environment VARIABLE=VALUE…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="Environment Commands"]/variablelist/varlistentry[term="unset-environment VARIABLE…"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="default"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="rescue"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="emergency"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="halt"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="poweroff"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="reboot"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="kexec"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="exit EXIT_CODE"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="suspend"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="hibernate"]
+systemctl.xml /refsect1[title="Commands"]/refsect2[title="System Commands"]/variablelist/varlistentry[term="switch-root ROOT INIT"]
+systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--icon="]
+systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--timeout="]
+systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--no-tty"]
+systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--accept-cached"]
+systemd-ask-password.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--multiple"]
+systemd-cat.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]
+systemd-cat.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"]
+systemd-cat.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--level-prefix="]
+systemd-cgls.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--all"]
+systemd-cgls.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-k"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-p"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-c"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-m"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-i"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-d"]
+systemd-cgtop.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--depth="]
+systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="h"]
+systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="q"]
+systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="p"]
+systemd-cgtop.xml /refsect1[title="Keys"]/variablelist/varlistentry[term="+"]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--diff="]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="masked"]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="equivalent"]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="redirected"]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="overridden"]
+systemd-delta.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-t"]/listitem/para/variablelist/varlistentry[term="unchanged"]
+systemd-detect-virt.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-c"]
+systemd-detect-virt.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-v"]
+systemd-detect-virt.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-q"]
+systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--what="]
+systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--who="]
+systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--why="]
+systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--mode="]
+systemd-inhibit.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--list"]
+systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--ready"]
+systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--pid="]
+systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--status="]
+systemd-notify.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--booted"]
+systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Image Options"]/variablelist/varlistentry[term="-D"]
+systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Execution Options"]/variablelist/varlistentry[term="-b"]
+systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Execution Options"]/variablelist/varlistentry[term="-u"]
+systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="System Identity Options"]/variablelist/varlistentry[term="--uuid="]
+systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Networking Options"]/variablelist/varlistentry[term="--private-network"]
+systemd-nspawn.xml /refsect1[title="Options"]/refsect2[title="Image Options"]/variablelist/varlistentry[term="--read-only"]
+systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--create"]
+systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--clean"]
+systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--remove"]
+systemd-tmpfiles.xml /refsect1[title="Options"]/variablelist/varlistentry[term="--prefix=path"]
+systemd.automount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Where="]
+systemd.automount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="]
+systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="SYSTEMD_WANTS="]
+systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="SYSTEMD_ALIAS="]
+systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="SYSTEMD_READY="]
+systemd.device.xml /refsect1[title="The udev Database"]/variablelist/varlistentry[term="ID_MODEL_FROM_DATABASE="]
+systemd.exec.xml /refsect1[title="Paths"]/variablelist/varlistentry[term="WorkingDirectory="]
+systemd.exec.xml /refsect1[title="Paths"]/variablelist/varlistentry[term="RootDirectory="]
+systemd.exec.xml /refsect1[title="User/Group Identity"]/variablelist/varlistentry[term="User="]
+systemd.exec.xml /refsect1[title="User/Group Identity"]/variablelist/varlistentry[term="SupplementaryGroups="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="Nice="]
+systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="OOMScoreAdjust="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="IOSchedulingClass="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="IOSchedulingPriority="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUSchedulingPolicy="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUSchedulingPriority="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUSchedulingResetOnFork="]
+systemd.exec.xml /refsect1[title="Scheduling"]/variablelist/varlistentry[term="CPUAffinity="]
+systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="UMask="]
+systemd.exec.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="Environment="]
+systemd.exec.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="EnvironmentFile="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="StandardInput="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="StandardOutput="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="StandardError="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYPath="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYReset="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYVHangup="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="TTYVTDisallocate="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogIdentifier="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogFacility="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogLevel="]
+systemd.exec.xml /refsect1[title="Logging and Standard Input/Output"]/variablelist/varlistentry[term="SyslogLevelPrefix="]
+systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="TimerSlackNSec="]
+systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="LimitCPU="]
+systemd.exec.xml /refsect1[title="User/Group Identity"]/variablelist/varlistentry[term="PAMName="]
+systemd.exec.xml /refsect1[title="Capabilities"]/variablelist/varlistentry[term="CapabilityBoundingSet="]
+systemd.exec.xml /refsect1[title="Security"]/variablelist/varlistentry[term="SecureBits="]
+systemd.exec.xml /refsect1[title="Sandboxing"]/variablelist/varlistentry[term="PrivateTmp="]
+systemd.exec.xml /refsect1[title="Sandboxing"]/variablelist/varlistentry[term="PrivateNetwork="]
+systemd.exec.xml /refsect1[title="Sandboxing"]/variablelist/varlistentry[term="MountFlags="]
+systemd.exec.xml /refsect1[title="System V Compatibility"]/variablelist/varlistentry[term="UtmpIdentifier="]
+systemd.exec.xml /refsect1[title="Process Properties"]/variablelist/varlistentry[term="IgnoreSIGPIPE="]
+systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="MESSAGE="]
+systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="MESSAGE_ID="]
+systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="PRIORITY="]
+systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="CODE_FILE="]
+systemd.journal-fields.xml /refsect1[title="User Journal Fields"]/variablelist/varlistentry[term="SYSLOG_FACILITY="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_PID="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_COMM="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_AUDIT_SESSION="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_SYSTEMD_CGROUP="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_SELINUX_CONTEXT="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_SOURCE_REALTIME_TIMESTAMP="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_BOOT_ID="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_MACHINE_ID="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_HOSTNAME="]
+systemd.journal-fields.xml /refsect1[title="Trusted Journal Fields"]/variablelist/varlistentry[term="_TRANSPORT="]
+systemd.journal-fields.xml /refsect1[title="Address Fields"]/variablelist/varlistentry[term="__CURSOR="]
+systemd.journal-fields.xml /refsect1[title="Address Fields"]/variablelist/varlistentry[term="__REALTIME_TIMESTAMP="]
+systemd.journal-fields.xml /refsect1[title="Address Fields"]/variablelist/varlistentry[term="__MONOTONIC_TIMESTAMP="]
+systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="What="]
+systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Where="]
+systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Type="]
+systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Options="]
+systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="]
+systemd.mount.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="]
+systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PathExists="]
+systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Unit="]
+systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="MakeDirectory="]
+systemd.path.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Type="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RemainAfterExit="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="GuessMainPID="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PIDFile="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="BusName="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStart="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStartPre="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecReload="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStop="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStopPost="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RestartSec="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="WatchdogSec="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Restart="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="RootDirectoryStartOnly="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="NonBlocking="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="NotifyAccess="]
+systemd.service.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Sockets="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenStream="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenFIFO="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenSpecial="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenNetlink="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ListenMessageQueue="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="BindIPv6Only="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Backlog="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="BindToDevice="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="DirectoryMode="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="SocketMode="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Accept="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="MaxConnections="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KeepAlive="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Priority="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ReceiveBuffer="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="IPTOS="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="IPTTL="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Mark="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PipeSize="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="MessageQueueMaxMessages=,\n MessageQueueMessageSize="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="FreeBind="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Transparent="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Broadcast="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PassCredentials="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="PassSecurity="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TCPCongestion="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStartPre="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="ExecStopPre="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="]
+systemd.socket.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Service="]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="basic.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="bluetooth.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="ctrl-alt-del.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="cryptsetup.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="dbus.service"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="dbus.socket"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="default.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="display-manager.service"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="emergency.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="final.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="getty.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="graphical.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="hibernate.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="halt.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="kbrequest.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="kexec.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="local-fs.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="local-fs-pre.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="multi-user.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="network.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="nss-lookup.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="nss-user-lookup.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="poweroff.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="printer.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="reboot.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="remote-fs.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="remote-fs-pre.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="rescue.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="rpcbind.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="runlevel2.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="shutdown.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sigpwr.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sleep.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="smartcard.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sockets.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units for Devices"]/variablelist/varlistentry[term="sound.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="suspend.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="swap.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="sysinit.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="syslog.socket"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special Passive System Units "]/variablelist/varlistentry[term="time-sync.target"]
+systemd.special.xml /refsect1[title="Units managed by the system service manager"]/refsect2[title="Special System Units"]/variablelist/varlistentry[term="umount.target"]
+systemd.swap.xml /refsect1[title="Options"]/variablelist/varlistentry[term="What="]
+systemd.swap.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Priority="]
+systemd.swap.xml /refsect1[title="Options"]/variablelist/varlistentry[term="TimeoutSec="]
+systemd.timer.xml /refsect1[title="Options"]/variablelist/varlistentry[term="OnActiveSec="]
+systemd.timer.xml /refsect1[title="Options"]/variablelist/varlistentry[term="Unit="]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Introspection and debugging options"]/variablelist/varlistentry[term="--test"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Introspection and debugging options"]/variablelist/varlistentry[term="--dump-configuration-items"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--unit="]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Introspection and debugging options"]/variablelist/varlistentry[term="--system"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--dump-core"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--crash-shell"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--confirm-spawn"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--show-status"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-target="]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-level="]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-color"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--log-location"]
+systemd.xml /refsect1[title="Options"]/refsect2[title="Options that duplicate kernel command line settings"]/variablelist/varlistentry[term="--default-standard-output="]
+systemd.xml /refsect1[title="Directories"]/variablelist[1]/varlistentry[term="System unit directories"]
+systemd.xml /refsect1[title="Directories"]/variablelist[2]/varlistentry[term="User unit directories"]
+systemd.xml /refsect1[title="Directories"]/variablelist[3]/varlistentry[term="SysV init scripts directory"]
+systemd.xml /refsect1[title="Directories"]/variablelist[4]/varlistentry[term="SysV runlevel link farm directory"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGTERM"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGINT"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGWINCH"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGPWR"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGUSR1"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGUSR2"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGHUP"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+0"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+1"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+2"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+3"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+4"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+5"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+6"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+13"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+14"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+15"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+16"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+20"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+21"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+22"]
+systemd.xml /refsect1[title="Signals"]/variablelist/varlistentry[term="SIGRTMIN+26"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_LEVEL"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_TARGET"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_COLOR"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_LOG_LOCATION"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$XDG_CONFIG_HOME"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$SYSTEMD_UNIT_PATH"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$LISTEN_PID"]
+systemd.xml /refsect1[title="Environment"]/variablelist/varlistentry[term="$NOTIFY_SOCKET"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.unit="]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.dump_core"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.crash_shell"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.crash_chvt"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.confirm_spawn"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.show_status"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.log_color"]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.default_standard_output="]
+systemd.xml /refsect1[title="Kernel Command Line"]/variablelist/varlistentry[term="systemd.setenv="]
+systemd.xml /refsect1[title="Sockets and FIFOs"]/variablelist/varlistentry[term="/run/systemd/notify"]
+systemd.xml /refsect1[title="Sockets and FIFOs"]/variablelist/varlistentry[term="/run/systemd/private"]
+systemd.xml /refsect1[title="Sockets and FIFOs"]/variablelist/varlistentry[term="/dev/initctl"]
+telinit.xml /refsect1[title="Options"]/variablelist[1]/varlistentry[term="--help"]
+telinit.xml /refsect1[title="Options"]/variablelist[1]/varlistentry[term="--no-wall"]
+telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="0"]
+telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="6"]
+telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="2"]
+telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="1"]
+telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="q"]
+telinit.xml /refsect1[title="Options"]/variablelist[2]/varlistentry[term="u"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="f"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="w"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="d"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="D"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="p"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="L"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="c"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="b"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="x"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="r"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="R"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="z"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="Z"]
+tmpfiles.d.xml /refsect1[title="Configuration File Format"]/refsect2[title="Type"]/variablelist/varlistentry[term="h"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="=="]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="!="]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="="]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term="+="]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Operators"]/variablelist/varlistentry[term=":="]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ACTION"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="DEVPATH"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="KERNEL"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="NAME"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="SYMLINK"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="SUBSYSTEM"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="DRIVER"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ATTR{filename}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="KERNELS"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="SUBSYSTEMS"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="DRIVERS"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ATTRS{filename}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="TAGS"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="ENV{key}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="TAG"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="TEST{octal mode mask}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="PROGRAM"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[1]/varlistentry[term="RESULT"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[2]/varlistentry[term="*"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[2]/varlistentry[term="?"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[2]/varlistentry[term="[]"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="NAME"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="SYMLINK"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OWNER, GROUP, MODE"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="ATTR{key}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="ENV{key}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="TAG"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="RUN{type}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="LABEL"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="GOTO"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="RUN{type}"]/listitem/variablelist/varlistentry[term="program"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="file"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="db"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="cmdline"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="IMPORT{type}"]/listitem/variablelist/varlistentry[term="parent"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="link_priority=value"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="string_escape=none|replace"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="static_node="]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="watch"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[3]/varlistentry[term="OPTIONS"]/listitem/variablelist/varlistentry[term="nowatch"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$kernel, %k"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$number, %n"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$devpath, %p"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$id, %b"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$driver"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$attr{file}, %s{file}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$env{key}, %E{key}"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$major, %M"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$minor, %m"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$result, %c"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$parent, %P"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$name"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$links"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$root, %r"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$sys, %S"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$devnode, %N"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="%%"]
+udev.xml /refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$$"]
+udevadm.xml /refsect1[title="Options"]/variablelist/varlistentry[term="-d"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-q"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-p"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-n"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-r"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-a"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-x"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-P"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-d"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-e"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm info\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-c"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-v"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-n"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-t"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-c"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-s"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-S"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-a"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-A"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-p"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-g"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-y"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm trigger\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-b"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm settle\n options\n "]/variablelist/varlistentry[term="-t"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm settle\n options\n "]/variablelist/varlistentry[term="-E"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-e"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-l"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-s"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-S"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-R"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-p"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-m"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm control option"]/variablelist/varlistentry[term="-t"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-k"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-u"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-p"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-s"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm monitor\n options\n "]/variablelist/varlistentry[term="-t"]
+udevadm.xml /refsect1[title="Options"]/refsect2[title="udevadm test\n options\n devpath|file|unit\n "]/variablelist/varlistentry[term="-a"]
+vconsole.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="KEYMAP="]
+vconsole.conf.xml /refsect1[title="Options"]/variablelist/varlistentry[term="FONT="]
diff --git a/tools/coverity.sh b/tools/coverity.sh
new file mode 100755
index 0000000..361376f
--- /dev/null
+++ b/tools/coverity.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -eux
+
+COVERITY_SCAN_TOOL_BASE="/tmp/coverity-scan-analysis"
+COVERITY_SCAN_PROJECT_NAME="systemd/systemd"
+
+function coverity_install_script {
+ local platform tool_url tool_archive
+
+ platform=$(uname)
+ tool_url="https://scan.coverity.com/download/${platform}"
+ tool_archive="/tmp/cov-analysis-${platform}.tgz"
+
+ set +x # this is supposed to hide COVERITY_SCAN_TOKEN
+ echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m"
+ wget -nv -O "$tool_archive" "$tool_url" --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=${COVERITY_SCAN_TOKEN:?}"
+ set -x
+
+ mkdir -p "$COVERITY_SCAN_TOOL_BASE"
+ pushd "$COVERITY_SCAN_TOOL_BASE"
+ tar xzf "$tool_archive"
+ popd
+}
+
+function run_coverity {
+ local results_dir tool_dir results_archive sha response status_code
+
+ results_dir="cov-int"
+ tool_dir=$(find "$COVERITY_SCAN_TOOL_BASE" -type d -name 'cov-analysis*')
+ results_archive="analysis-results.tgz"
+ sha=$(git rev-parse --short HEAD)
+
+ meson -Dman=false build
+ COVERITY_UNSUPPORTED=1 "$tool_dir/bin/cov-build" --dir "$results_dir" sh -c "ninja -C ./build -v"
+ "$tool_dir/bin/cov-import-scm" --dir "$results_dir" --scm git --log "$results_dir/scm_log.txt"
+
+ tar czf "$results_archive" "$results_dir"
+
+ set +x # this is supposed to hide COVERITY_SCAN_TOKEN
+ echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m"
+ response=$(curl \
+ --silent --write-out "\n%{http_code}\n" \
+ --form project="$COVERITY_SCAN_PROJECT_NAME" \
+ --form token="${COVERITY_SCAN_TOKEN:?}" \
+ --form email="${COVERITY_SCAN_NOTIFICATION_EMAIL:?}" \
+ --form file="@$results_archive" \
+ --form version="$sha" \
+ --form description="Daily build" \
+ https://scan.coverity.com/builds)
+ printf "\033[33;1mThe response is\033[0m\n%s\n" "$response"
+ status_code=$(echo "$response" | sed -n '$p')
+ if [ "$status_code" != "200" ]; then
+ echo -e "\033[33;1mCoverity Scan upload failed: $(echo "$response" | sed '$d').\033[0m"
+ return 1
+ fi
+ set -x
+}
+
+coverity_install_script
+run_coverity
diff --git a/tools/dbus_exporter.py b/tools/dbus_exporter.py
new file mode 100755
index 0000000..819584d
--- /dev/null
+++ b/tools/dbus_exporter.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+from argparse import ArgumentParser
+from pathlib import Path
+from subprocess import PIPE, run
+
+
+def extract_interfaces_xml(output_dir, executable):
+ proc = run(
+ args=[executable.absolute(), '--bus-introspect', 'list'],
+ stdout=PIPE,
+ check=True,
+ universal_newlines=True)
+
+ interface_names = (x.split()[1] for x in proc.stdout.splitlines())
+
+ for interface_name in interface_names:
+ proc = run(
+ args=[executable.absolute(), '--bus-introspect', interface_name],
+ stdout=PIPE,
+ check=True,
+ universal_newlines=True)
+
+ interface_file_name = output_dir / (interface_name + '.xml')
+ interface_file_name.write_text(proc.stdout)
+ interface_file_name.chmod(0o644)
+
+def main():
+ parser = ArgumentParser()
+ parser.add_argument('output',
+ type=Path)
+ parser.add_argument('executables',
+ nargs='+',
+ type=Path)
+
+ args = parser.parse_args()
+
+ args.output.mkdir(exist_ok=True)
+ for exe in args.executables:
+ extract_interfaces_xml(args.output, exe)
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/dbus_ignorelist b/tools/dbus_ignorelist
new file mode 100644
index 0000000..d0c2150
--- /dev/null
+++ b/tools/dbus_ignorelist
@@ -0,0 +1,2174 @@
+org.freedesktop.LogControl1.LogLevel
+org.freedesktop.LogControl1.LogTarget
+org.freedesktop.LogControl1.SyslogIdentifier
+org.freedesktop.home1.Home.Acquire()
+org.freedesktop.home1.Home.Activate()
+org.freedesktop.home1.Home.Authenticate()
+org.freedesktop.home1.Home.ChangePassword()
+org.freedesktop.home1.Home.Deactivate()
+org.freedesktop.home1.Home.Fixate()
+org.freedesktop.home1.Home.Lock()
+org.freedesktop.home1.Home.Realize()
+org.freedesktop.home1.Home.Ref()
+org.freedesktop.home1.Home.Release()
+org.freedesktop.home1.Home.Remove()
+org.freedesktop.home1.Home.Resize()
+org.freedesktop.home1.Home.State
+org.freedesktop.home1.Home.UID
+org.freedesktop.home1.Home.UnixRecord
+org.freedesktop.home1.Home.Unlock()
+org.freedesktop.home1.Home.Unregister()
+org.freedesktop.home1.Home.Update()
+org.freedesktop.home1.Home.UserName
+org.freedesktop.home1.Home.UserRecord
+org.freedesktop.home1.Manager.AcquireHome()
+org.freedesktop.home1.Manager.ActivateHome()
+org.freedesktop.home1.Manager.AuthenticateHome()
+org.freedesktop.home1.Manager.AutoLogin
+org.freedesktop.home1.Manager.ChangePasswordHome()
+org.freedesktop.home1.Manager.CreateHome()
+org.freedesktop.home1.Manager.DeactivateAllHomes()
+org.freedesktop.home1.Manager.DeactivateHome()
+org.freedesktop.home1.Manager.FixateHome()
+org.freedesktop.home1.Manager.GetHomeByName()
+org.freedesktop.home1.Manager.GetHomeByUID()
+org.freedesktop.home1.Manager.GetUserRecordByName()
+org.freedesktop.home1.Manager.GetUserRecordByUID()
+org.freedesktop.home1.Manager.ListHomes()
+org.freedesktop.home1.Manager.LockAllHomes()
+org.freedesktop.home1.Manager.LockHome()
+org.freedesktop.home1.Manager.RealizeHome()
+org.freedesktop.home1.Manager.Rebalance()
+org.freedesktop.home1.Manager.RefHome()
+org.freedesktop.home1.Manager.RegisterHome()
+org.freedesktop.home1.Manager.ReleaseHome()
+org.freedesktop.home1.Manager.RemoveHome()
+org.freedesktop.home1.Manager.ResizeHome()
+org.freedesktop.home1.Manager.UnlockHome()
+org.freedesktop.home1.Manager.UnregisterHome()
+org.freedesktop.home1.Manager.UpdateHome()
+org.freedesktop.hostname1.Chassis
+org.freedesktop.hostname1.DefaultHostname
+org.freedesktop.hostname1.Deployment
+org.freedesktop.hostname1.Describe()
+org.freedesktop.hostname1.GetProductUUID()
+org.freedesktop.hostname1.HardwareModel
+org.freedesktop.hostname1.HardwareVendor
+org.freedesktop.hostname1.HomeURL
+org.freedesktop.hostname1.Hostname
+org.freedesktop.hostname1.HostnameSource
+org.freedesktop.hostname1.IconName
+org.freedesktop.hostname1.KernelName
+org.freedesktop.hostname1.KernelRelease
+org.freedesktop.hostname1.KernelVersion
+org.freedesktop.hostname1.Location
+org.freedesktop.hostname1.OperatingSystemCPEName
+org.freedesktop.hostname1.OperatingSystemPrettyName
+org.freedesktop.hostname1.PrettyHostname
+org.freedesktop.hostname1.SetChassis()
+org.freedesktop.hostname1.SetDeployment()
+org.freedesktop.hostname1.SetHostname()
+org.freedesktop.hostname1.SetIconName()
+org.freedesktop.hostname1.SetLocation()
+org.freedesktop.hostname1.SetPrettyHostname()
+org.freedesktop.hostname1.SetStaticHostname()
+org.freedesktop.hostname1.StaticHostname
+org.freedesktop.import1.Manager.CancelTransfer()
+org.freedesktop.import1.Manager.ExportRaw()
+org.freedesktop.import1.Manager.ExportTar()
+org.freedesktop.import1.Manager.ImportFileSystem()
+org.freedesktop.import1.Manager.ImportRaw()
+org.freedesktop.import1.Manager.ImportTar()
+org.freedesktop.import1.Manager.ListTransfers()
+org.freedesktop.import1.Manager.PullRaw()
+org.freedesktop.import1.Manager.PullTar()
+org.freedesktop.import1.Manager.TransferNew
+org.freedesktop.import1.Manager.TransferRemoved
+org.freedesktop.import1.Transfer.Cancel()
+org.freedesktop.import1.Transfer.Id
+org.freedesktop.import1.Transfer.Local
+org.freedesktop.import1.Transfer.LogMessage
+org.freedesktop.import1.Transfer.Progress
+org.freedesktop.import1.Transfer.Remote
+org.freedesktop.import1.Transfer.Type
+org.freedesktop.import1.Transfer.Verify
+org.freedesktop.locale1.Locale
+org.freedesktop.locale1.SetLocale()
+org.freedesktop.locale1.SetVConsoleKeyboard()
+org.freedesktop.locale1.SetX11Keyboard()
+org.freedesktop.locale1.VConsoleKeymap
+org.freedesktop.locale1.VConsoleKeymapToggle
+org.freedesktop.locale1.X11Layout
+org.freedesktop.locale1.X11Model
+org.freedesktop.locale1.X11Options
+org.freedesktop.locale1.X11Variant
+org.freedesktop.login1.Manager.ActivateSession()
+org.freedesktop.login1.Manager.ActivateSessionOnSeat()
+org.freedesktop.login1.Manager.AttachDevice()
+org.freedesktop.login1.Manager.BlockInhibited
+org.freedesktop.login1.Manager.BootLoaderEntries
+org.freedesktop.login1.Manager.CanHalt()
+org.freedesktop.login1.Manager.CanHibernate()
+org.freedesktop.login1.Manager.CanHybridSleep()
+org.freedesktop.login1.Manager.CanPowerOff()
+org.freedesktop.login1.Manager.CanReboot()
+org.freedesktop.login1.Manager.CanRebootParameter()
+org.freedesktop.login1.Manager.CanRebootToBootLoaderEntry()
+org.freedesktop.login1.Manager.CanRebootToBootLoaderMenu()
+org.freedesktop.login1.Manager.CanRebootToFirmwareSetup()
+org.freedesktop.login1.Manager.CanSuspend()
+org.freedesktop.login1.Manager.CanSuspendThenHibernate()
+org.freedesktop.login1.Manager.CancelScheduledShutdown()
+org.freedesktop.login1.Manager.CreateSession()
+org.freedesktop.login1.Manager.DelayInhibited
+org.freedesktop.login1.Manager.Docked
+org.freedesktop.login1.Manager.EnableWallMessages
+org.freedesktop.login1.Manager.FlushDevices()
+org.freedesktop.login1.Manager.GetSeat()
+org.freedesktop.login1.Manager.GetSession()
+org.freedesktop.login1.Manager.GetSessionByPID()
+org.freedesktop.login1.Manager.GetUser()
+org.freedesktop.login1.Manager.GetUserByPID()
+org.freedesktop.login1.Manager.Halt()
+org.freedesktop.login1.Manager.HaltWithFlags()
+org.freedesktop.login1.Manager.HandleHibernateKey
+org.freedesktop.login1.Manager.HandleLidSwitch
+org.freedesktop.login1.Manager.HandleLidSwitchDocked
+org.freedesktop.login1.Manager.HandleLidSwitchExternalPower
+org.freedesktop.login1.Manager.HandlePowerKey
+org.freedesktop.login1.Manager.HandleSuspendKey
+org.freedesktop.login1.Manager.Hibernate()
+org.freedesktop.login1.Manager.HibernateWithFlags()
+org.freedesktop.login1.Manager.HoldoffTimeoutUSec
+org.freedesktop.login1.Manager.HybridSleep()
+org.freedesktop.login1.Manager.HybridSleepWithFlags()
+org.freedesktop.login1.Manager.IdleAction
+org.freedesktop.login1.Manager.IdleActionUSec
+org.freedesktop.login1.Manager.IdleHint
+org.freedesktop.login1.Manager.IdleSinceHint
+org.freedesktop.login1.Manager.IdleSinceHintMonotonic
+org.freedesktop.login1.Manager.Inhibit()
+org.freedesktop.login1.Manager.InhibitDelayMaxUSec
+org.freedesktop.login1.Manager.InhibitorsMax
+org.freedesktop.login1.Manager.KillExcludeUsers
+org.freedesktop.login1.Manager.KillOnlyUsers
+org.freedesktop.login1.Manager.KillSession()
+org.freedesktop.login1.Manager.KillUser()
+org.freedesktop.login1.Manager.KillUserProcesses
+org.freedesktop.login1.Manager.LidClosed
+org.freedesktop.login1.Manager.ListInhibitors()
+org.freedesktop.login1.Manager.ListSeats()
+org.freedesktop.login1.Manager.ListSessions()
+org.freedesktop.login1.Manager.ListUsers()
+org.freedesktop.login1.Manager.LockSession()
+org.freedesktop.login1.Manager.LockSessions()
+org.freedesktop.login1.Manager.NAutoVTs
+org.freedesktop.login1.Manager.NCurrentInhibitors
+org.freedesktop.login1.Manager.NCurrentSessions
+org.freedesktop.login1.Manager.OnExternalPower
+org.freedesktop.login1.Manager.PowerOff()
+org.freedesktop.login1.Manager.PowerOffWithFlags()
+org.freedesktop.login1.Manager.PrepareForShutdown
+org.freedesktop.login1.Manager.PrepareForSleep
+org.freedesktop.login1.Manager.PreparingForShutdown
+org.freedesktop.login1.Manager.PreparingForSleep
+org.freedesktop.login1.Manager.Reboot()
+org.freedesktop.login1.Manager.RebootParameter
+org.freedesktop.login1.Manager.RebootToBootLoaderEntry
+org.freedesktop.login1.Manager.RebootToBootLoaderMenu
+org.freedesktop.login1.Manager.RebootToFirmwareSetup
+org.freedesktop.login1.Manager.RebootWithFlags()
+org.freedesktop.login1.Manager.ReleaseSession()
+org.freedesktop.login1.Manager.RemoveIPC
+org.freedesktop.login1.Manager.RuntimeDirectoryInodesMax
+org.freedesktop.login1.Manager.RuntimeDirectorySize
+org.freedesktop.login1.Manager.ScheduleShutdown()
+org.freedesktop.login1.Manager.ScheduledShutdown
+org.freedesktop.login1.Manager.SeatNew
+org.freedesktop.login1.Manager.SeatRemoved
+org.freedesktop.login1.Manager.SessionNew
+org.freedesktop.login1.Manager.SessionRemoved
+org.freedesktop.login1.Manager.SessionsMax
+org.freedesktop.login1.Manager.SetRebootParameter()
+org.freedesktop.login1.Manager.SetRebootToBootLoaderEntry()
+org.freedesktop.login1.Manager.SetRebootToBootLoaderMenu()
+org.freedesktop.login1.Manager.SetRebootToFirmwareSetup()
+org.freedesktop.login1.Manager.SetUserLinger()
+org.freedesktop.login1.Manager.SetWallMessage()
+org.freedesktop.login1.Manager.Suspend()
+org.freedesktop.login1.Manager.SuspendThenHibernate()
+org.freedesktop.login1.Manager.SuspendThenHibernateWithFlags()
+org.freedesktop.login1.Manager.SuspendWithFlags()
+org.freedesktop.login1.Manager.TerminateSeat()
+org.freedesktop.login1.Manager.TerminateSession()
+org.freedesktop.login1.Manager.TerminateUser()
+org.freedesktop.login1.Manager.UnlockSession()
+org.freedesktop.login1.Manager.UnlockSessions()
+org.freedesktop.login1.Manager.UserNew
+org.freedesktop.login1.Manager.UserRemoved
+org.freedesktop.login1.Manager.UserStopDelayUSec
+org.freedesktop.login1.Manager.WallMessage
+org.freedesktop.login1.Seat.ActivateSession()
+org.freedesktop.login1.Seat.ActiveSession
+org.freedesktop.login1.Seat.CanGraphical
+org.freedesktop.login1.Seat.CanTTY
+org.freedesktop.login1.Seat.Id
+org.freedesktop.login1.Seat.IdleHint
+org.freedesktop.login1.Seat.IdleSinceHint
+org.freedesktop.login1.Seat.IdleSinceHintMonotonic
+org.freedesktop.login1.Seat.Sessions
+org.freedesktop.login1.Seat.SwitchTo()
+org.freedesktop.login1.Seat.SwitchToNext()
+org.freedesktop.login1.Seat.SwitchToPrevious()
+org.freedesktop.login1.Seat.Terminate()
+org.freedesktop.login1.Session.Activate()
+org.freedesktop.login1.Session.Active
+org.freedesktop.login1.Session.Audit
+org.freedesktop.login1.Session.Class
+org.freedesktop.login1.Session.Desktop
+org.freedesktop.login1.Session.Display
+org.freedesktop.login1.Session.Id
+org.freedesktop.login1.Session.IdleHint
+org.freedesktop.login1.Session.IdleSinceHint
+org.freedesktop.login1.Session.IdleSinceHintMonotonic
+org.freedesktop.login1.Session.Kill()
+org.freedesktop.login1.Session.Leader
+org.freedesktop.login1.Session.Lock
+org.freedesktop.login1.Session.Lock()
+org.freedesktop.login1.Session.LockedHint
+org.freedesktop.login1.Session.Name
+org.freedesktop.login1.Session.PauseDevice
+org.freedesktop.login1.Session.PauseDeviceComplete()
+org.freedesktop.login1.Session.ReleaseControl()
+org.freedesktop.login1.Session.ReleaseDevice()
+org.freedesktop.login1.Session.Remote
+org.freedesktop.login1.Session.RemoteHost
+org.freedesktop.login1.Session.RemoteUser
+org.freedesktop.login1.Session.ResumeDevice
+org.freedesktop.login1.Session.Scope
+org.freedesktop.login1.Session.Seat
+org.freedesktop.login1.Session.Service
+org.freedesktop.login1.Session.SetBrightness()
+org.freedesktop.login1.Session.SetIdleHint()
+org.freedesktop.login1.Session.SetLockedHint()
+org.freedesktop.login1.Session.SetType()
+org.freedesktop.login1.Session.State
+org.freedesktop.login1.Session.TTY
+org.freedesktop.login1.Session.TakeControl()
+org.freedesktop.login1.Session.TakeDevice()
+org.freedesktop.login1.Session.Terminate()
+org.freedesktop.login1.Session.Timestamp
+org.freedesktop.login1.Session.TimestampMonotonic
+org.freedesktop.login1.Session.Type
+org.freedesktop.login1.Session.Unlock
+org.freedesktop.login1.Session.Unlock()
+org.freedesktop.login1.Session.User
+org.freedesktop.login1.Session.VTNr
+org.freedesktop.login1.User.Display
+org.freedesktop.login1.User.GID
+org.freedesktop.login1.User.IdleHint
+org.freedesktop.login1.User.IdleSinceHint
+org.freedesktop.login1.User.IdleSinceHintMonotonic
+org.freedesktop.login1.User.Kill()
+org.freedesktop.login1.User.Linger
+org.freedesktop.login1.User.Name
+org.freedesktop.login1.User.RuntimePath
+org.freedesktop.login1.User.Service
+org.freedesktop.login1.User.Sessions
+org.freedesktop.login1.User.Slice
+org.freedesktop.login1.User.State
+org.freedesktop.login1.User.Terminate()
+org.freedesktop.login1.User.Timestamp
+org.freedesktop.login1.User.TimestampMonotonic
+org.freedesktop.login1.User.UID
+org.freedesktop.machine1.Image.Clone()
+org.freedesktop.machine1.Image.CreationTimestamp
+org.freedesktop.machine1.Image.GetHostname()
+org.freedesktop.machine1.Image.GetMachineID()
+org.freedesktop.machine1.Image.GetMachineInfo()
+org.freedesktop.machine1.Image.GetOSRelease()
+org.freedesktop.machine1.Image.Limit
+org.freedesktop.machine1.Image.LimitExclusive
+org.freedesktop.machine1.Image.MarkReadOnly()
+org.freedesktop.machine1.Image.ModificationTimestamp
+org.freedesktop.machine1.Image.Name
+org.freedesktop.machine1.Image.Path
+org.freedesktop.machine1.Image.ReadOnly
+org.freedesktop.machine1.Image.Remove()
+org.freedesktop.machine1.Image.Rename()
+org.freedesktop.machine1.Image.SetLimit()
+org.freedesktop.machine1.Image.Type
+org.freedesktop.machine1.Image.Usage
+org.freedesktop.machine1.Image.UsageExclusive
+org.freedesktop.machine1.Machine.BindMount()
+org.freedesktop.machine1.Machine.Class
+org.freedesktop.machine1.Machine.CopyFrom()
+org.freedesktop.machine1.Machine.CopyTo()
+org.freedesktop.machine1.Machine.GetAddresses()
+org.freedesktop.machine1.Machine.GetOSRelease()
+org.freedesktop.machine1.Machine.GetUIDShift()
+org.freedesktop.machine1.Machine.Id
+org.freedesktop.machine1.Machine.Kill()
+org.freedesktop.machine1.Machine.Leader
+org.freedesktop.machine1.Machine.Name
+org.freedesktop.machine1.Machine.NetworkInterfaces
+org.freedesktop.machine1.Machine.OpenLogin()
+org.freedesktop.machine1.Machine.OpenPTY()
+org.freedesktop.machine1.Machine.OpenRootDirectory()
+org.freedesktop.machine1.Machine.OpenShell()
+org.freedesktop.machine1.Machine.RootDirectory
+org.freedesktop.machine1.Machine.Service
+org.freedesktop.machine1.Machine.State
+org.freedesktop.machine1.Machine.Terminate()
+org.freedesktop.machine1.Machine.Timestamp
+org.freedesktop.machine1.Machine.TimestampMonotonic
+org.freedesktop.machine1.Machine.Unit
+org.freedesktop.machine1.Manager.BindMountMachine()
+org.freedesktop.machine1.Manager.CleanPool()
+org.freedesktop.machine1.Manager.CloneImage()
+org.freedesktop.machine1.Manager.CopyFromMachine()
+org.freedesktop.machine1.Manager.CopyToMachine()
+org.freedesktop.machine1.Manager.CreateMachine()
+org.freedesktop.machine1.Manager.CreateMachineWithNetwork()
+org.freedesktop.machine1.Manager.GetImage()
+org.freedesktop.machine1.Manager.GetImageHostname()
+org.freedesktop.machine1.Manager.GetImageMachineID()
+org.freedesktop.machine1.Manager.GetImageMachineInfo()
+org.freedesktop.machine1.Manager.GetImageOSRelease()
+org.freedesktop.machine1.Manager.GetMachine()
+org.freedesktop.machine1.Manager.GetMachineAddresses()
+org.freedesktop.machine1.Manager.GetMachineByPID()
+org.freedesktop.machine1.Manager.GetMachineOSRelease()
+org.freedesktop.machine1.Manager.GetMachineUIDShift()
+org.freedesktop.machine1.Manager.KillMachine()
+org.freedesktop.machine1.Manager.ListImages()
+org.freedesktop.machine1.Manager.ListMachines()
+org.freedesktop.machine1.Manager.MachineNew
+org.freedesktop.machine1.Manager.MachineRemoved
+org.freedesktop.machine1.Manager.MapFromMachineGroup()
+org.freedesktop.machine1.Manager.MapFromMachineUser()
+org.freedesktop.machine1.Manager.MapToMachineGroup()
+org.freedesktop.machine1.Manager.MapToMachineUser()
+org.freedesktop.machine1.Manager.MarkImageReadOnly()
+org.freedesktop.machine1.Manager.OpenMachineLogin()
+org.freedesktop.machine1.Manager.OpenMachinePTY()
+org.freedesktop.machine1.Manager.OpenMachineRootDirectory()
+org.freedesktop.machine1.Manager.OpenMachineShell()
+org.freedesktop.machine1.Manager.PoolLimit
+org.freedesktop.machine1.Manager.PoolPath
+org.freedesktop.machine1.Manager.PoolUsage
+org.freedesktop.machine1.Manager.RegisterMachine()
+org.freedesktop.machine1.Manager.RegisterMachineWithNetwork()
+org.freedesktop.machine1.Manager.RemoveImage()
+org.freedesktop.machine1.Manager.RenameImage()
+org.freedesktop.machine1.Manager.SetImageLimit()
+org.freedesktop.machine1.Manager.SetPoolLimit()
+org.freedesktop.machine1.Manager.TerminateMachine()
+org.freedesktop.machine1.Manager.UnregisterMachine()
+org.freedesktop.network1.DHCPServer.Leases
+org.freedesktop.network1.Link.AddressState
+org.freedesktop.network1.Link.AdministrativeState
+org.freedesktop.network1.Link.BitRates
+org.freedesktop.network1.Link.CarrierState
+org.freedesktop.network1.Link.Describe()
+org.freedesktop.network1.Link.ForceRenew()
+org.freedesktop.network1.Link.IPv4AddressState
+org.freedesktop.network1.Link.IPv6AddressState
+org.freedesktop.network1.Link.OnlineState
+org.freedesktop.network1.Link.OperationalState
+org.freedesktop.network1.Link.Reconfigure()
+org.freedesktop.network1.Link.Renew()
+org.freedesktop.network1.Link.RevertDNS()
+org.freedesktop.network1.Link.RevertNTP()
+org.freedesktop.network1.Link.SetDNS()
+org.freedesktop.network1.Link.SetDNSEx()
+org.freedesktop.network1.Link.SetDNSOverTLS()
+org.freedesktop.network1.Link.SetDNSSEC()
+org.freedesktop.network1.Link.SetDNSSECNegativeTrustAnchors()
+org.freedesktop.network1.Link.SetDefaultRoute()
+org.freedesktop.network1.Link.SetDomains()
+org.freedesktop.network1.Link.SetLLMNR()
+org.freedesktop.network1.Link.SetMulticastDNS()
+org.freedesktop.network1.Link.SetNTP()
+org.freedesktop.network1.Manager.AddressState
+org.freedesktop.network1.Manager.CarrierState
+org.freedesktop.network1.Manager.Describe()
+org.freedesktop.network1.Manager.DescribeLink()
+org.freedesktop.network1.Manager.ForceRenewLink()
+org.freedesktop.network1.Manager.GetLinkByIndex()
+org.freedesktop.network1.Manager.GetLinkByName()
+org.freedesktop.network1.Manager.IPv4AddressState
+org.freedesktop.network1.Manager.IPv6AddressState
+org.freedesktop.network1.Manager.ListLinks()
+org.freedesktop.network1.Manager.NamespaceId
+org.freedesktop.network1.Manager.OnlineState
+org.freedesktop.network1.Manager.OperationalState
+org.freedesktop.network1.Manager.ReconfigureLink()
+org.freedesktop.network1.Manager.Reload()
+org.freedesktop.network1.Manager.RenewLink()
+org.freedesktop.network1.Manager.RevertLinkDNS()
+org.freedesktop.network1.Manager.RevertLinkNTP()
+org.freedesktop.network1.Manager.SetLinkDNS()
+org.freedesktop.network1.Manager.SetLinkDNSEx()
+org.freedesktop.network1.Manager.SetLinkDNSOverTLS()
+org.freedesktop.network1.Manager.SetLinkDNSSEC()
+org.freedesktop.network1.Manager.SetLinkDNSSECNegativeTrustAnchors()
+org.freedesktop.network1.Manager.SetLinkDefaultRoute()
+org.freedesktop.network1.Manager.SetLinkDomains()
+org.freedesktop.network1.Manager.SetLinkLLMNR()
+org.freedesktop.network1.Manager.SetLinkMulticastDNS()
+org.freedesktop.network1.Manager.SetLinkNTP()
+org.freedesktop.network1.Network.Description
+org.freedesktop.network1.Network.MatchDriver
+org.freedesktop.network1.Network.MatchMAC
+org.freedesktop.network1.Network.MatchName
+org.freedesktop.network1.Network.MatchPath
+org.freedesktop.network1.Network.MatchType
+org.freedesktop.network1.Network.SourcePath
+org.freedesktop.oom1.Manager.DumpByFileDescriptor()
+org.freedesktop.portable1.Image.Attach()
+org.freedesktop.portable1.Image.AttachWithExtensions()
+org.freedesktop.portable1.Image.CreationTimestamp
+org.freedesktop.portable1.Image.Detach()
+org.freedesktop.portable1.Image.DetachWithExtensions()
+org.freedesktop.portable1.Image.GetMetadata()
+org.freedesktop.portable1.Image.GetMetadataWithExtensions()
+org.freedesktop.portable1.Image.GetOSRelease()
+org.freedesktop.portable1.Image.GetState()
+org.freedesktop.portable1.Image.Limit
+org.freedesktop.portable1.Image.LimitExclusive
+org.freedesktop.portable1.Image.MarkReadOnly()
+org.freedesktop.portable1.Image.ModificationTimestamp
+org.freedesktop.portable1.Image.Name
+org.freedesktop.portable1.Image.Path
+org.freedesktop.portable1.Image.ReadOnly
+org.freedesktop.portable1.Image.Reattach()
+org.freedesktop.portable1.Image.ReattacheWithExtensions()
+org.freedesktop.portable1.Image.Remove()
+org.freedesktop.portable1.Image.SetLimit()
+org.freedesktop.portable1.Image.Type
+org.freedesktop.portable1.Image.Usage
+org.freedesktop.portable1.Image.UsageExclusive
+org.freedesktop.portable1.Manager.AttachImage()
+org.freedesktop.portable1.Manager.AttachImageWithExtensions()
+org.freedesktop.portable1.Manager.DetachImage()
+org.freedesktop.portable1.Manager.DetachImageWithExtensions()
+org.freedesktop.portable1.Manager.GetImage()
+org.freedesktop.portable1.Manager.GetImageMetadata()
+org.freedesktop.portable1.Manager.GetImageMetadataWithExtensions()
+org.freedesktop.portable1.Manager.GetImageOSRelease()
+org.freedesktop.portable1.Manager.GetImageState()
+org.freedesktop.portable1.Manager.ListImages()
+org.freedesktop.portable1.Manager.MarkImageReadOnly()
+org.freedesktop.portable1.Manager.PoolLimit
+org.freedesktop.portable1.Manager.PoolPath
+org.freedesktop.portable1.Manager.PoolUsage
+org.freedesktop.portable1.Manager.Profiles
+org.freedesktop.portable1.Manager.ReattachImage()
+org.freedesktop.portable1.Manager.ReattachImageWithExtensions()
+org.freedesktop.portable1.Manager.RemoveImage()
+org.freedesktop.portable1.Manager.SetImageLimit()
+org.freedesktop.portable1.Manager.SetPoolLimit()
+org.freedesktop.resolve1.DnssdService.Conflicted
+org.freedesktop.resolve1.DnssdService.Unregister()
+org.freedesktop.resolve1.Link.CurrentDNSServer
+org.freedesktop.resolve1.Link.CurrentDNSServerEx
+org.freedesktop.resolve1.Link.DNS
+org.freedesktop.resolve1.Link.DNSEx
+org.freedesktop.resolve1.Link.DNSOverTLS
+org.freedesktop.resolve1.Link.DNSSEC
+org.freedesktop.resolve1.Link.DNSSECNegativeTrustAnchors
+org.freedesktop.resolve1.Link.DNSSECSupported
+org.freedesktop.resolve1.Link.DefaultRoute
+org.freedesktop.resolve1.Link.Domains
+org.freedesktop.resolve1.Link.LLMNR
+org.freedesktop.resolve1.Link.MulticastDNS
+org.freedesktop.resolve1.Link.Revert()
+org.freedesktop.resolve1.Link.ScopesMask
+org.freedesktop.resolve1.Link.SetDNS()
+org.freedesktop.resolve1.Link.SetDNSEx()
+org.freedesktop.resolve1.Link.SetDNSOverTLS()
+org.freedesktop.resolve1.Link.SetDNSSEC()
+org.freedesktop.resolve1.Link.SetDNSSECNegativeTrustAnchors()
+org.freedesktop.resolve1.Link.SetDefaultRoute()
+org.freedesktop.resolve1.Link.SetDomains()
+org.freedesktop.resolve1.Link.SetLLMNR()
+org.freedesktop.resolve1.Link.SetMulticastDNS()
+org.freedesktop.resolve1.Manager.CacheStatistics
+org.freedesktop.resolve1.Manager.CurrentDNSServer
+org.freedesktop.resolve1.Manager.CurrentDNSServerEx
+org.freedesktop.resolve1.Manager.DNS
+org.freedesktop.resolve1.Manager.DNSEx
+org.freedesktop.resolve1.Manager.DNSOverTLS
+org.freedesktop.resolve1.Manager.DNSSEC
+org.freedesktop.resolve1.Manager.DNSSECNegativeTrustAnchors
+org.freedesktop.resolve1.Manager.DNSSECStatistics
+org.freedesktop.resolve1.Manager.DNSSECSupported
+org.freedesktop.resolve1.Manager.DNSStubListener
+org.freedesktop.resolve1.Manager.Domains
+org.freedesktop.resolve1.Manager.FallbackDNS
+org.freedesktop.resolve1.Manager.FallbackDNSEx
+org.freedesktop.resolve1.Manager.FlushCaches()
+org.freedesktop.resolve1.Manager.GetLink()
+org.freedesktop.resolve1.Manager.LLMNR
+org.freedesktop.resolve1.Manager.LLMNRHostname
+org.freedesktop.resolve1.Manager.MulticastDNS
+org.freedesktop.resolve1.Manager.RegisterService()
+org.freedesktop.resolve1.Manager.ResetServerFeatures()
+org.freedesktop.resolve1.Manager.ResetStatistics()
+org.freedesktop.resolve1.Manager.ResolvConfMode
+org.freedesktop.resolve1.Manager.ResolveAddress()
+org.freedesktop.resolve1.Manager.ResolveHostname()
+org.freedesktop.resolve1.Manager.ResolveRecord()
+org.freedesktop.resolve1.Manager.ResolveService()
+org.freedesktop.resolve1.Manager.RevertLink()
+org.freedesktop.resolve1.Manager.SetLinkDNS()
+org.freedesktop.resolve1.Manager.SetLinkDNSEx()
+org.freedesktop.resolve1.Manager.SetLinkDNSOverTLS()
+org.freedesktop.resolve1.Manager.SetLinkDNSSEC()
+org.freedesktop.resolve1.Manager.SetLinkDNSSECNegativeTrustAnchors()
+org.freedesktop.resolve1.Manager.SetLinkDefaultRoute()
+org.freedesktop.resolve1.Manager.SetLinkDomains()
+org.freedesktop.resolve1.Manager.SetLinkLLMNR()
+org.freedesktop.resolve1.Manager.SetLinkMulticastDNS()
+org.freedesktop.resolve1.Manager.TransactionStatistics
+org.freedesktop.resolve1.Manager.UnregisterService()
+org.freedesktop.systemd1.Automount.DirectoryMode
+org.freedesktop.systemd1.Automount.ExtraOptions
+org.freedesktop.systemd1.Automount.Result
+org.freedesktop.systemd1.Automount.TimeoutIdleUSec
+org.freedesktop.systemd1.Automount.Where
+org.freedesktop.systemd1.Device.SysFSPath
+org.freedesktop.systemd1.Job.Cancel()
+org.freedesktop.systemd1.Job.GetAfter()
+org.freedesktop.systemd1.Job.GetBefore()
+org.freedesktop.systemd1.Job.Id
+org.freedesktop.systemd1.Job.JobType
+org.freedesktop.systemd1.Job.State
+org.freedesktop.systemd1.Job.Unit
+org.freedesktop.systemd1.Manager.AbandonScope()
+org.freedesktop.systemd1.Manager.AddDependencyUnitFiles()
+org.freedesktop.systemd1.Manager.Architecture
+org.freedesktop.systemd1.Manager.AttachProcessesToUnit()
+org.freedesktop.systemd1.Manager.BindMountUnit()
+org.freedesktop.systemd1.Manager.CancelJob()
+org.freedesktop.systemd1.Manager.CleanUnit()
+org.freedesktop.systemd1.Manager.ClearJobs()
+org.freedesktop.systemd1.Manager.ConfirmSpawn
+org.freedesktop.systemd1.Manager.ControlGroup
+org.freedesktop.systemd1.Manager.CtrlAltDelBurstAction
+org.freedesktop.systemd1.Manager.DefaultBlockIOAccounting
+org.freedesktop.systemd1.Manager.DefaultCPUAccounting
+org.freedesktop.systemd1.Manager.DefaultLimitAS
+org.freedesktop.systemd1.Manager.DefaultLimitASSoft
+org.freedesktop.systemd1.Manager.DefaultLimitCORE
+org.freedesktop.systemd1.Manager.DefaultLimitCORESoft
+org.freedesktop.systemd1.Manager.DefaultLimitCPU
+org.freedesktop.systemd1.Manager.DefaultLimitCPUSoft
+org.freedesktop.systemd1.Manager.DefaultLimitDATA
+org.freedesktop.systemd1.Manager.DefaultLimitDATASoft
+org.freedesktop.systemd1.Manager.DefaultLimitFSIZE
+org.freedesktop.systemd1.Manager.DefaultLimitFSIZESoft
+org.freedesktop.systemd1.Manager.DefaultLimitLOCKS
+org.freedesktop.systemd1.Manager.DefaultLimitLOCKSSoft
+org.freedesktop.systemd1.Manager.DefaultLimitMEMLOCK
+org.freedesktop.systemd1.Manager.DefaultLimitMEMLOCKSoft
+org.freedesktop.systemd1.Manager.DefaultLimitMSGQUEUE
+org.freedesktop.systemd1.Manager.DefaultLimitMSGQUEUESoft
+org.freedesktop.systemd1.Manager.DefaultLimitNICE
+org.freedesktop.systemd1.Manager.DefaultLimitNICESoft
+org.freedesktop.systemd1.Manager.DefaultLimitNOFILE
+org.freedesktop.systemd1.Manager.DefaultLimitNOFILESoft
+org.freedesktop.systemd1.Manager.DefaultLimitNPROC
+org.freedesktop.systemd1.Manager.DefaultLimitNPROCSoft
+org.freedesktop.systemd1.Manager.DefaultLimitRSS
+org.freedesktop.systemd1.Manager.DefaultLimitRSSSoft
+org.freedesktop.systemd1.Manager.DefaultLimitRTPRIO
+org.freedesktop.systemd1.Manager.DefaultLimitRTPRIOSoft
+org.freedesktop.systemd1.Manager.DefaultLimitRTTIME
+org.freedesktop.systemd1.Manager.DefaultLimitRTTIMESoft
+org.freedesktop.systemd1.Manager.DefaultLimitSIGPENDING
+org.freedesktop.systemd1.Manager.DefaultLimitSIGPENDINGSoft
+org.freedesktop.systemd1.Manager.DefaultLimitSTACK
+org.freedesktop.systemd1.Manager.DefaultLimitSTACKSoft
+org.freedesktop.systemd1.Manager.DefaultMemoryAccounting
+org.freedesktop.systemd1.Manager.DefaultOOMPolicy
+org.freedesktop.systemd1.Manager.DefaultOOMScoreAdjust
+org.freedesktop.systemd1.Manager.DefaultRestartUSec
+org.freedesktop.systemd1.Manager.DefaultStandardError
+org.freedesktop.systemd1.Manager.DefaultStandardOutput
+org.freedesktop.systemd1.Manager.DefaultStartLimitBurst
+org.freedesktop.systemd1.Manager.DefaultStartLimitIntervalUSec
+org.freedesktop.systemd1.Manager.DefaultTasksAccounting
+org.freedesktop.systemd1.Manager.DefaultTasksMax
+org.freedesktop.systemd1.Manager.DefaultTimeoutAbortUSec
+org.freedesktop.systemd1.Manager.DefaultTimeoutStartUSec
+org.freedesktop.systemd1.Manager.DefaultTimeoutStopUSec
+org.freedesktop.systemd1.Manager.DefaultTimerAccuracyUSec
+org.freedesktop.systemd1.Manager.DisableUnitFiles()
+org.freedesktop.systemd1.Manager.DisableUnitFilesWithFlags()
+org.freedesktop.systemd1.Manager.Dump()
+org.freedesktop.systemd1.Manager.DumpByFileDescriptor()
+org.freedesktop.systemd1.Manager.EnableUnitFiles()
+org.freedesktop.systemd1.Manager.EnableUnitFilesWithFlags()
+org.freedesktop.systemd1.Manager.EnqueueMarkedJobs()
+org.freedesktop.systemd1.Manager.EnqueueUnitJob()
+org.freedesktop.systemd1.Manager.Environment
+org.freedesktop.systemd1.Manager.Exit()
+org.freedesktop.systemd1.Manager.ExitCode
+org.freedesktop.systemd1.Manager.Features
+org.freedesktop.systemd1.Manager.FinishTimestamp
+org.freedesktop.systemd1.Manager.FinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.FirmwareTimestamp
+org.freedesktop.systemd1.Manager.FirmwareTimestampMonotonic
+org.freedesktop.systemd1.Manager.FreezeUnit()
+org.freedesktop.systemd1.Manager.GeneratorsFinishTimestamp
+org.freedesktop.systemd1.Manager.GeneratorsFinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.GeneratorsStartTimestamp
+org.freedesktop.systemd1.Manager.GeneratorsStartTimestampMonotonic
+org.freedesktop.systemd1.Manager.GetDefaultTarget()
+org.freedesktop.systemd1.Manager.GetDynamicUsers()
+org.freedesktop.systemd1.Manager.GetJob()
+org.freedesktop.systemd1.Manager.GetJobAfter()
+org.freedesktop.systemd1.Manager.GetJobBefore()
+org.freedesktop.systemd1.Manager.GetUnit()
+org.freedesktop.systemd1.Manager.GetUnitByControlGroup()
+org.freedesktop.systemd1.Manager.GetUnitByInvocationID()
+org.freedesktop.systemd1.Manager.GetUnitByPID()
+org.freedesktop.systemd1.Manager.GetUnitFileLinks()
+org.freedesktop.systemd1.Manager.GetUnitFileState()
+org.freedesktop.systemd1.Manager.GetUnitProcesses()
+org.freedesktop.systemd1.Manager.Halt()
+org.freedesktop.systemd1.Manager.InitRDGeneratorsFinishTimestamp
+org.freedesktop.systemd1.Manager.InitRDGeneratorsFinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.InitRDGeneratorsStartTimestamp
+org.freedesktop.systemd1.Manager.InitRDGeneratorsStartTimestampMonotonic
+org.freedesktop.systemd1.Manager.InitRDSecurityFinishTimestamp
+org.freedesktop.systemd1.Manager.InitRDSecurityFinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.InitRDSecurityStartTimestamp
+org.freedesktop.systemd1.Manager.InitRDSecurityStartTimestampMonotonic
+org.freedesktop.systemd1.Manager.InitRDTimestamp
+org.freedesktop.systemd1.Manager.InitRDTimestampMonotonic
+org.freedesktop.systemd1.Manager.InitRDUnitsLoadFinishTimestamp
+org.freedesktop.systemd1.Manager.InitRDUnitsLoadFinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.InitRDUnitsLoadStartTimestamp
+org.freedesktop.systemd1.Manager.InitRDUnitsLoadStartTimestampMonotonic
+org.freedesktop.systemd1.Manager.JobNew
+org.freedesktop.systemd1.Manager.JobRemoved
+org.freedesktop.systemd1.Manager.KExec()
+org.freedesktop.systemd1.Manager.KExecWatchdogUSec
+org.freedesktop.systemd1.Manager.KernelTimestamp
+org.freedesktop.systemd1.Manager.KernelTimestampMonotonic
+org.freedesktop.systemd1.Manager.KillUnit()
+org.freedesktop.systemd1.Manager.LinkUnitFiles()
+org.freedesktop.systemd1.Manager.ListJobs()
+org.freedesktop.systemd1.Manager.ListUnitFiles()
+org.freedesktop.systemd1.Manager.ListUnitFilesByPatterns()
+org.freedesktop.systemd1.Manager.ListUnits()
+org.freedesktop.systemd1.Manager.ListUnitsByNames()
+org.freedesktop.systemd1.Manager.ListUnitsByPatterns()
+org.freedesktop.systemd1.Manager.ListUnitsFiltered()
+org.freedesktop.systemd1.Manager.LoadUnit()
+org.freedesktop.systemd1.Manager.LoaderTimestamp
+org.freedesktop.systemd1.Manager.LoaderTimestampMonotonic
+org.freedesktop.systemd1.Manager.LogLevel
+org.freedesktop.systemd1.Manager.LogTarget
+org.freedesktop.systemd1.Manager.LookupDynamicUserByName()
+org.freedesktop.systemd1.Manager.LookupDynamicUserByUID()
+org.freedesktop.systemd1.Manager.MaskUnitFiles()
+org.freedesktop.systemd1.Manager.MountImageUnit()
+org.freedesktop.systemd1.Manager.NFailedJobs
+org.freedesktop.systemd1.Manager.NFailedUnits
+org.freedesktop.systemd1.Manager.NInstalledJobs
+org.freedesktop.systemd1.Manager.NJobs
+org.freedesktop.systemd1.Manager.NNames
+org.freedesktop.systemd1.Manager.PowerOff()
+org.freedesktop.systemd1.Manager.PresetAllUnitFiles()
+org.freedesktop.systemd1.Manager.PresetUnitFiles()
+org.freedesktop.systemd1.Manager.PresetUnitFilesWithMode()
+org.freedesktop.systemd1.Manager.Progress
+org.freedesktop.systemd1.Manager.Reboot()
+org.freedesktop.systemd1.Manager.RebootWatchdogUSec
+org.freedesktop.systemd1.Manager.ReenableUnitFiles()
+org.freedesktop.systemd1.Manager.Reexecute()
+org.freedesktop.systemd1.Manager.RefUnit()
+org.freedesktop.systemd1.Manager.Reload()
+org.freedesktop.systemd1.Manager.ReloadOrRestartUnit()
+org.freedesktop.systemd1.Manager.ReloadOrTryRestartUnit()
+org.freedesktop.systemd1.Manager.ReloadUnit()
+org.freedesktop.systemd1.Manager.Reloading
+org.freedesktop.systemd1.Manager.ResetFailed()
+org.freedesktop.systemd1.Manager.ResetFailedUnit()
+org.freedesktop.systemd1.Manager.RestartUnit()
+org.freedesktop.systemd1.Manager.RevertUnitFiles()
+org.freedesktop.systemd1.Manager.RuntimeWatchdogUSec
+org.freedesktop.systemd1.Manager.SecurityFinishTimestamp
+org.freedesktop.systemd1.Manager.SecurityFinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.SecurityStartTimestamp
+org.freedesktop.systemd1.Manager.SecurityStartTimestampMonotonic
+org.freedesktop.systemd1.Manager.ServiceWatchdogs
+org.freedesktop.systemd1.Manager.SetDefaultTarget()
+org.freedesktop.systemd1.Manager.SetEnvironment()
+org.freedesktop.systemd1.Manager.SetExitCode()
+org.freedesktop.systemd1.Manager.SetShowStatus()
+org.freedesktop.systemd1.Manager.SetUnitProperties()
+org.freedesktop.systemd1.Manager.ShowStatus
+org.freedesktop.systemd1.Manager.StartTransientUnit()
+org.freedesktop.systemd1.Manager.StartUnit()
+org.freedesktop.systemd1.Manager.StartUnitReplace()
+org.freedesktop.systemd1.Manager.StartUnitWithFlags()
+org.freedesktop.systemd1.Manager.StartupFinished
+org.freedesktop.systemd1.Manager.StopUnit()
+org.freedesktop.systemd1.Manager.Subscribe()
+org.freedesktop.systemd1.Manager.SwitchRoot()
+org.freedesktop.systemd1.Manager.SystemState
+org.freedesktop.systemd1.Manager.Tainted
+org.freedesktop.systemd1.Manager.ThawUnit()
+org.freedesktop.systemd1.Manager.TimerSlackNSec
+org.freedesktop.systemd1.Manager.TryRestartUnit()
+org.freedesktop.systemd1.Manager.UnitFilesChanged
+org.freedesktop.systemd1.Manager.UnitNew
+org.freedesktop.systemd1.Manager.UnitPath
+org.freedesktop.systemd1.Manager.UnitRemoved
+org.freedesktop.systemd1.Manager.UnitsLoadFinishTimestamp
+org.freedesktop.systemd1.Manager.UnitsLoadFinishTimestampMonotonic
+org.freedesktop.systemd1.Manager.UnitsLoadStartTimestamp
+org.freedesktop.systemd1.Manager.UnitsLoadStartTimestampMonotonic
+org.freedesktop.systemd1.Manager.UnitsLoadTimestamp
+org.freedesktop.systemd1.Manager.UnitsLoadTimestampMonotonic
+org.freedesktop.systemd1.Manager.UnmaskUnitFiles()
+org.freedesktop.systemd1.Manager.UnrefUnit()
+org.freedesktop.systemd1.Manager.UnsetAndSetEnvironment()
+org.freedesktop.systemd1.Manager.UnsetEnvironment()
+org.freedesktop.systemd1.Manager.Unsubscribe()
+org.freedesktop.systemd1.Manager.UserspaceTimestamp
+org.freedesktop.systemd1.Manager.UserspaceTimestampMonotonic
+org.freedesktop.systemd1.Manager.Version
+org.freedesktop.systemd1.Manager.Virtualization
+org.freedesktop.systemd1.Mount.AllowedCPUs
+org.freedesktop.systemd1.Mount.AllowedMemoryNodes
+org.freedesktop.systemd1.Mount.AmbientCapabilities
+org.freedesktop.systemd1.Mount.AppArmorProfile
+org.freedesktop.systemd1.Mount.AttachProcesses()
+org.freedesktop.systemd1.Mount.BPFProgram
+org.freedesktop.systemd1.Mount.BindPaths
+org.freedesktop.systemd1.Mount.BindReadOnlyPaths
+org.freedesktop.systemd1.Mount.BlockIOAccounting
+org.freedesktop.systemd1.Mount.BlockIODeviceWeight
+org.freedesktop.systemd1.Mount.BlockIOReadBandwidth
+org.freedesktop.systemd1.Mount.BlockIOWeight
+org.freedesktop.systemd1.Mount.BlockIOWriteBandwidth
+org.freedesktop.systemd1.Mount.CPUAccounting
+org.freedesktop.systemd1.Mount.CPUAffinity
+org.freedesktop.systemd1.Mount.CPUAffinityFromNUMA
+org.freedesktop.systemd1.Mount.CPUQuotaPerSecUSec
+org.freedesktop.systemd1.Mount.CPUQuotaPeriodUSec
+org.freedesktop.systemd1.Mount.CPUSchedulingPolicy
+org.freedesktop.systemd1.Mount.CPUSchedulingPriority
+org.freedesktop.systemd1.Mount.CPUSchedulingResetOnFork
+org.freedesktop.systemd1.Mount.CPUShares
+org.freedesktop.systemd1.Mount.CPUUsageNSec
+org.freedesktop.systemd1.Mount.CPUWeight
+org.freedesktop.systemd1.Mount.CacheDirectory
+org.freedesktop.systemd1.Mount.CacheDirectoryMode
+org.freedesktop.systemd1.Mount.CacheDirectorySymlink
+org.freedesktop.systemd1.Mount.CapabilityBoundingSet
+org.freedesktop.systemd1.Mount.ConfigurationDirectory
+org.freedesktop.systemd1.Mount.ConfigurationDirectoryMode
+org.freedesktop.systemd1.Mount.ControlGroup
+org.freedesktop.systemd1.Mount.ControlPID
+org.freedesktop.systemd1.Mount.CoredumpFilter
+org.freedesktop.systemd1.Mount.DefaultMemoryLow
+org.freedesktop.systemd1.Mount.DefaultMemoryMin
+org.freedesktop.systemd1.Mount.Delegate
+org.freedesktop.systemd1.Mount.DelegateControllers
+org.freedesktop.systemd1.Mount.DeviceAllow
+org.freedesktop.systemd1.Mount.DevicePolicy
+org.freedesktop.systemd1.Mount.DirectoryMode
+org.freedesktop.systemd1.Mount.DisableControllers
+org.freedesktop.systemd1.Mount.DynamicUser
+org.freedesktop.systemd1.Mount.EffectiveCPUs
+org.freedesktop.systemd1.Mount.EffectiveMemoryNodes
+org.freedesktop.systemd1.Mount.Environment
+org.freedesktop.systemd1.Mount.EnvironmentFiles
+org.freedesktop.systemd1.Mount.ExecMount
+org.freedesktop.systemd1.Mount.ExecPaths
+org.freedesktop.systemd1.Mount.ExecRemount
+org.freedesktop.systemd1.Mount.ExecSearchPath
+org.freedesktop.systemd1.Mount.ExecUnmount
+org.freedesktop.systemd1.Mount.ExtensionImages
+org.freedesktop.systemd1.Mount.FinalKillSignal
+org.freedesktop.systemd1.Mount.ForceUnmount
+org.freedesktop.systemd1.Mount.GID
+org.freedesktop.systemd1.Mount.GetProcesses()
+org.freedesktop.systemd1.Mount.Group
+org.freedesktop.systemd1.Mount.IOAccounting
+org.freedesktop.systemd1.Mount.IODeviceLatencyTargetUSec
+org.freedesktop.systemd1.Mount.IODeviceWeight
+org.freedesktop.systemd1.Mount.IOReadBandwidthMax
+org.freedesktop.systemd1.Mount.IOReadBytes
+org.freedesktop.systemd1.Mount.IOReadIOPSMax
+org.freedesktop.systemd1.Mount.IOReadOperations
+org.freedesktop.systemd1.Mount.IOSchedulingClass
+org.freedesktop.systemd1.Mount.IOSchedulingPriority
+org.freedesktop.systemd1.Mount.IOWeight
+org.freedesktop.systemd1.Mount.IOWriteBandwidthMax
+org.freedesktop.systemd1.Mount.IOWriteBytes
+org.freedesktop.systemd1.Mount.IOWriteIOPSMax
+org.freedesktop.systemd1.Mount.IOWriteOperations
+org.freedesktop.systemd1.Mount.IPAccounting
+org.freedesktop.systemd1.Mount.IPAddressAllow
+org.freedesktop.systemd1.Mount.IPAddressDeny
+org.freedesktop.systemd1.Mount.IPCNamespacePath
+org.freedesktop.systemd1.Mount.IPEgressBytes
+org.freedesktop.systemd1.Mount.IPEgressFilterPath
+org.freedesktop.systemd1.Mount.IPEgressPackets
+org.freedesktop.systemd1.Mount.IPIngressBytes
+org.freedesktop.systemd1.Mount.IPIngressFilterPath
+org.freedesktop.systemd1.Mount.IPIngressPackets
+org.freedesktop.systemd1.Mount.IgnoreSIGPIPE
+org.freedesktop.systemd1.Mount.InaccessiblePaths
+org.freedesktop.systemd1.Mount.KeyringMode
+org.freedesktop.systemd1.Mount.KillMode
+org.freedesktop.systemd1.Mount.KillSignal
+org.freedesktop.systemd1.Mount.LazyUnmount
+org.freedesktop.systemd1.Mount.LimitAS
+org.freedesktop.systemd1.Mount.LimitASSoft
+org.freedesktop.systemd1.Mount.LimitCORE
+org.freedesktop.systemd1.Mount.LimitCORESoft
+org.freedesktop.systemd1.Mount.LimitCPU
+org.freedesktop.systemd1.Mount.LimitCPUSoft
+org.freedesktop.systemd1.Mount.LimitDATA
+org.freedesktop.systemd1.Mount.LimitDATASoft
+org.freedesktop.systemd1.Mount.LimitFSIZE
+org.freedesktop.systemd1.Mount.LimitFSIZESoft
+org.freedesktop.systemd1.Mount.LimitLOCKS
+org.freedesktop.systemd1.Mount.LimitLOCKSSoft
+org.freedesktop.systemd1.Mount.LimitMEMLOCK
+org.freedesktop.systemd1.Mount.LimitMEMLOCKSoft
+org.freedesktop.systemd1.Mount.LimitMSGQUEUE
+org.freedesktop.systemd1.Mount.LimitMSGQUEUESoft
+org.freedesktop.systemd1.Mount.LimitNICE
+org.freedesktop.systemd1.Mount.LimitNICESoft
+org.freedesktop.systemd1.Mount.LimitNOFILE
+org.freedesktop.systemd1.Mount.LimitNOFILESoft
+org.freedesktop.systemd1.Mount.LimitNPROC
+org.freedesktop.systemd1.Mount.LimitNPROCSoft
+org.freedesktop.systemd1.Mount.LimitRSS
+org.freedesktop.systemd1.Mount.LimitRSSSoft
+org.freedesktop.systemd1.Mount.LimitRTPRIO
+org.freedesktop.systemd1.Mount.LimitRTPRIOSoft
+org.freedesktop.systemd1.Mount.LimitRTTIME
+org.freedesktop.systemd1.Mount.LimitRTTIMESoft
+org.freedesktop.systemd1.Mount.LimitSIGPENDING
+org.freedesktop.systemd1.Mount.LimitSIGPENDINGSoft
+org.freedesktop.systemd1.Mount.LimitSTACK
+org.freedesktop.systemd1.Mount.LimitSTACKSoft
+org.freedesktop.systemd1.Mount.LoadCredential
+org.freedesktop.systemd1.Mount.LoadCredentialEncrypted
+org.freedesktop.systemd1.Mount.LockPersonality
+org.freedesktop.systemd1.Mount.LogExtraFields
+org.freedesktop.systemd1.Mount.LogLevelMax
+org.freedesktop.systemd1.Mount.LogNamespace
+org.freedesktop.systemd1.Mount.LogRateLimitBurst
+org.freedesktop.systemd1.Mount.LogRateLimitIntervalUSec
+org.freedesktop.systemd1.Mount.LogsDirectory
+org.freedesktop.systemd1.Mount.LogsDirectoryMode
+org.freedesktop.systemd1.Mount.LogsDirectorySymlink
+org.freedesktop.systemd1.Mount.ManagedOOMMemoryPressure
+org.freedesktop.systemd1.Mount.ManagedOOMMemoryPressureLimit
+org.freedesktop.systemd1.Mount.ManagedOOMPreference
+org.freedesktop.systemd1.Mount.ManagedOOMSwap
+org.freedesktop.systemd1.Mount.MemoryAccounting
+org.freedesktop.systemd1.Mount.MemoryAvailable
+org.freedesktop.systemd1.Mount.MemoryCurrent
+org.freedesktop.systemd1.Mount.MemoryDenyWriteExecute
+org.freedesktop.systemd1.Mount.MemoryHigh
+org.freedesktop.systemd1.Mount.MemoryLimit
+org.freedesktop.systemd1.Mount.MemoryLow
+org.freedesktop.systemd1.Mount.MemoryMax
+org.freedesktop.systemd1.Mount.MemoryMin
+org.freedesktop.systemd1.Mount.MemorySwapMax
+org.freedesktop.systemd1.Mount.MountAPIVFS
+org.freedesktop.systemd1.Mount.MountFlags
+org.freedesktop.systemd1.Mount.MountImages
+org.freedesktop.systemd1.Mount.NUMAMask
+org.freedesktop.systemd1.Mount.NUMAPolicy
+org.freedesktop.systemd1.Mount.NetworkNamespacePath
+org.freedesktop.systemd1.Mount.Nice
+org.freedesktop.systemd1.Mount.NoExecPaths
+org.freedesktop.systemd1.Mount.NoNewPrivileges
+org.freedesktop.systemd1.Mount.NonBlocking
+org.freedesktop.systemd1.Mount.OOMScoreAdjust
+org.freedesktop.systemd1.Mount.Options
+org.freedesktop.systemd1.Mount.PAMName
+org.freedesktop.systemd1.Mount.PassEnvironment
+org.freedesktop.systemd1.Mount.Personality
+org.freedesktop.systemd1.Mount.PrivateDevices
+org.freedesktop.systemd1.Mount.PrivateIPC
+org.freedesktop.systemd1.Mount.PrivateMounts
+org.freedesktop.systemd1.Mount.PrivateNetwork
+org.freedesktop.systemd1.Mount.PrivateTmp
+org.freedesktop.systemd1.Mount.PrivateUsers
+org.freedesktop.systemd1.Mount.ProcSubset
+org.freedesktop.systemd1.Mount.ProtectClock
+org.freedesktop.systemd1.Mount.ProtectControlGroups
+org.freedesktop.systemd1.Mount.ProtectHome
+org.freedesktop.systemd1.Mount.ProtectHostname
+org.freedesktop.systemd1.Mount.ProtectKernelLogs
+org.freedesktop.systemd1.Mount.ProtectKernelModules
+org.freedesktop.systemd1.Mount.ProtectKernelTunables
+org.freedesktop.systemd1.Mount.ProtectProc
+org.freedesktop.systemd1.Mount.ProtectSystem
+org.freedesktop.systemd1.Mount.ReadOnlyPaths
+org.freedesktop.systemd1.Mount.ReadWriteOnly
+org.freedesktop.systemd1.Mount.ReadWritePaths
+org.freedesktop.systemd1.Mount.RemoveIPC
+org.freedesktop.systemd1.Mount.RestartKillSignal
+org.freedesktop.systemd1.Mount.RestrictAddressFamilies
+org.freedesktop.systemd1.Mount.RestrictFileSystems
+org.freedesktop.systemd1.Mount.RestrictNamespaces
+org.freedesktop.systemd1.Mount.RestrictNetworkInterfaces
+org.freedesktop.systemd1.Mount.RestrictRealtime
+org.freedesktop.systemd1.Mount.RestrictSUIDSGID
+org.freedesktop.systemd1.Mount.Result
+org.freedesktop.systemd1.Mount.RootDirectory
+org.freedesktop.systemd1.Mount.RootHash
+org.freedesktop.systemd1.Mount.RootHashPath
+org.freedesktop.systemd1.Mount.RootHashSignature
+org.freedesktop.systemd1.Mount.RootHashSignaturePath
+org.freedesktop.systemd1.Mount.RootImage
+org.freedesktop.systemd1.Mount.RootImageOptions
+org.freedesktop.systemd1.Mount.RootVerity
+org.freedesktop.systemd1.Mount.RuntimeDirectory
+org.freedesktop.systemd1.Mount.RuntimeDirectoryMode
+org.freedesktop.systemd1.Mount.RuntimeDirectoryPreserve
+org.freedesktop.systemd1.Mount.RuntimeDirectorySymlink
+org.freedesktop.systemd1.Mount.SELinuxContext
+org.freedesktop.systemd1.Mount.SameProcessGroup
+org.freedesktop.systemd1.Mount.SecureBits
+org.freedesktop.systemd1.Mount.SendSIGHUP
+org.freedesktop.systemd1.Mount.SendSIGKILL
+org.freedesktop.systemd1.Mount.SetCredential
+org.freedesktop.systemd1.Mount.SetCredentialEncrypted
+org.freedesktop.systemd1.Mount.Slice
+org.freedesktop.systemd1.Mount.SloppyOptions
+org.freedesktop.systemd1.Mount.SmackProcessLabel
+org.freedesktop.systemd1.Mount.SocketBindAllow
+org.freedesktop.systemd1.Mount.SocketBindDeny
+org.freedesktop.systemd1.Mount.StandardError
+org.freedesktop.systemd1.Mount.StandardErrorFileDescriptorName
+org.freedesktop.systemd1.Mount.StandardInput
+org.freedesktop.systemd1.Mount.StandardInputData
+org.freedesktop.systemd1.Mount.StandardInputFileDescriptorName
+org.freedesktop.systemd1.Mount.StandardOutput
+org.freedesktop.systemd1.Mount.StandardOutputFileDescriptorName
+org.freedesktop.systemd1.Mount.StartupAllowedCPUs
+org.freedesktop.systemd1.Mount.StartupAllowedMemoryNodes
+org.freedesktop.systemd1.Mount.StartupBlockIOWeight
+org.freedesktop.systemd1.Mount.StartupCPUShares
+org.freedesktop.systemd1.Mount.StartupCPUWeight
+org.freedesktop.systemd1.Mount.StartupIOWeight
+org.freedesktop.systemd1.Mount.StateDirectory
+org.freedesktop.systemd1.Mount.StateDirectoryMode
+org.freedesktop.systemd1.Mount.StateDirectorySymlink
+org.freedesktop.systemd1.Mount.SupplementaryGroups
+org.freedesktop.systemd1.Mount.SyslogFacility
+org.freedesktop.systemd1.Mount.SyslogIdentifier
+org.freedesktop.systemd1.Mount.SyslogLevel
+org.freedesktop.systemd1.Mount.SyslogLevelPrefix
+org.freedesktop.systemd1.Mount.SyslogPriority
+org.freedesktop.systemd1.Mount.SystemCallArchitectures
+org.freedesktop.systemd1.Mount.SystemCallErrorNumber
+org.freedesktop.systemd1.Mount.SystemCallFilter
+org.freedesktop.systemd1.Mount.SystemCallLog
+org.freedesktop.systemd1.Mount.TTYColumns
+org.freedesktop.systemd1.Mount.TTYPath
+org.freedesktop.systemd1.Mount.TTYReset
+org.freedesktop.systemd1.Mount.TTYRows
+org.freedesktop.systemd1.Mount.TTYVHangup
+org.freedesktop.systemd1.Mount.TTYVTDisallocate
+org.freedesktop.systemd1.Mount.TasksAccounting
+org.freedesktop.systemd1.Mount.TasksCurrent
+org.freedesktop.systemd1.Mount.TasksMax
+org.freedesktop.systemd1.Mount.TemporaryFileSystem
+org.freedesktop.systemd1.Mount.TimeoutCleanUSec
+org.freedesktop.systemd1.Mount.TimeoutUSec
+org.freedesktop.systemd1.Mount.TimerSlackNSec
+org.freedesktop.systemd1.Mount.Type
+org.freedesktop.systemd1.Mount.UID
+org.freedesktop.systemd1.Mount.UMask
+org.freedesktop.systemd1.Mount.UnsetEnvironment
+org.freedesktop.systemd1.Mount.User
+org.freedesktop.systemd1.Mount.UtmpIdentifier
+org.freedesktop.systemd1.Mount.UtmpMode
+org.freedesktop.systemd1.Mount.WatchdogSignal
+org.freedesktop.systemd1.Mount.What
+org.freedesktop.systemd1.Mount.Where
+org.freedesktop.systemd1.Mount.WorkingDirectory
+org.freedesktop.systemd1.Path.DirectoryMode
+org.freedesktop.systemd1.Path.MakeDirectory
+org.freedesktop.systemd1.Path.Paths
+org.freedesktop.systemd1.Path.Result
+org.freedesktop.systemd1.Path.TriggerLimitBurst
+org.freedesktop.systemd1.Path.TriggerLimitIntervalUSec
+org.freedesktop.systemd1.Path.Unit
+org.freedesktop.systemd1.Scope.Abandon()
+org.freedesktop.systemd1.Scope.AllowedCPUs
+org.freedesktop.systemd1.Scope.AllowedMemoryNodes
+org.freedesktop.systemd1.Scope.AttachProcesses()
+org.freedesktop.systemd1.Scope.BPFProgram
+org.freedesktop.systemd1.Scope.BlockIOAccounting
+org.freedesktop.systemd1.Scope.BlockIODeviceWeight
+org.freedesktop.systemd1.Scope.BlockIOReadBandwidth
+org.freedesktop.systemd1.Scope.BlockIOWeight
+org.freedesktop.systemd1.Scope.BlockIOWriteBandwidth
+org.freedesktop.systemd1.Scope.CPUAccounting
+org.freedesktop.systemd1.Scope.CPUQuotaPerSecUSec
+org.freedesktop.systemd1.Scope.CPUQuotaPeriodUSec
+org.freedesktop.systemd1.Scope.CPUShares
+org.freedesktop.systemd1.Scope.CPUUsageNSec
+org.freedesktop.systemd1.Scope.CPUWeight
+org.freedesktop.systemd1.Scope.ControlGroup
+org.freedesktop.systemd1.Scope.Controller
+org.freedesktop.systemd1.Scope.DefaultMemoryLow
+org.freedesktop.systemd1.Scope.DefaultMemoryMin
+org.freedesktop.systemd1.Scope.Delegate
+org.freedesktop.systemd1.Scope.DelegateControllers
+org.freedesktop.systemd1.Scope.DeviceAllow
+org.freedesktop.systemd1.Scope.DevicePolicy
+org.freedesktop.systemd1.Scope.DisableControllers
+org.freedesktop.systemd1.Scope.EffectiveCPUs
+org.freedesktop.systemd1.Scope.EffectiveMemoryNodes
+org.freedesktop.systemd1.Scope.FinalKillSignal
+org.freedesktop.systemd1.Scope.GetProcesses()
+org.freedesktop.systemd1.Scope.IOAccounting
+org.freedesktop.systemd1.Scope.IODeviceLatencyTargetUSec
+org.freedesktop.systemd1.Scope.IODeviceWeight
+org.freedesktop.systemd1.Scope.IOReadBandwidthMax
+org.freedesktop.systemd1.Scope.IOReadBytes
+org.freedesktop.systemd1.Scope.IOReadIOPSMax
+org.freedesktop.systemd1.Scope.IOReadOperations
+org.freedesktop.systemd1.Scope.IOWeight
+org.freedesktop.systemd1.Scope.IOWriteBandwidthMax
+org.freedesktop.systemd1.Scope.IOWriteBytes
+org.freedesktop.systemd1.Scope.IOWriteIOPSMax
+org.freedesktop.systemd1.Scope.IOWriteOperations
+org.freedesktop.systemd1.Scope.IPAccounting
+org.freedesktop.systemd1.Scope.IPAddressAllow
+org.freedesktop.systemd1.Scope.IPAddressDeny
+org.freedesktop.systemd1.Scope.IPEgressBytes
+org.freedesktop.systemd1.Scope.IPEgressFilterPath
+org.freedesktop.systemd1.Scope.IPEgressPackets
+org.freedesktop.systemd1.Scope.IPIngressBytes
+org.freedesktop.systemd1.Scope.IPIngressFilterPath
+org.freedesktop.systemd1.Scope.IPIngressPackets
+org.freedesktop.systemd1.Scope.KillMode
+org.freedesktop.systemd1.Scope.KillSignal
+org.freedesktop.systemd1.Scope.ManagedOOMMemoryPressure
+org.freedesktop.systemd1.Scope.ManagedOOMMemoryPressureLimit
+org.freedesktop.systemd1.Scope.ManagedOOMPreference
+org.freedesktop.systemd1.Scope.ManagedOOMSwap
+org.freedesktop.systemd1.Scope.MemoryAccounting
+org.freedesktop.systemd1.Scope.MemoryAvailable
+org.freedesktop.systemd1.Scope.MemoryCurrent
+org.freedesktop.systemd1.Scope.MemoryHigh
+org.freedesktop.systemd1.Scope.MemoryLimit
+org.freedesktop.systemd1.Scope.MemoryLow
+org.freedesktop.systemd1.Scope.MemoryMax
+org.freedesktop.systemd1.Scope.MemoryMin
+org.freedesktop.systemd1.Scope.MemorySwapMax
+org.freedesktop.systemd1.Scope.RequestStop
+org.freedesktop.systemd1.Scope.RestartKillSignal
+org.freedesktop.systemd1.Scope.RestrictNetworkInterfaces
+org.freedesktop.systemd1.Scope.Result
+org.freedesktop.systemd1.Scope.RuntimeMaxUSec
+org.freedesktop.systemd1.Scope.RuntimeRandomizedExtraUSec
+org.freedesktop.systemd1.Scope.SendSIGHUP
+org.freedesktop.systemd1.Scope.SendSIGKILL
+org.freedesktop.systemd1.Scope.Slice
+org.freedesktop.systemd1.Scope.SocketBindAllow
+org.freedesktop.systemd1.Scope.SocketBindDeny
+org.freedesktop.systemd1.Scope.StartupAllowedCPUs
+org.freedesktop.systemd1.Scope.StartupAllowedMemoryNodes
+org.freedesktop.systemd1.Scope.StartupBlockIOWeight
+org.freedesktop.systemd1.Scope.StartupCPUShares
+org.freedesktop.systemd1.Scope.StartupCPUWeight
+org.freedesktop.systemd1.Scope.StartupIOWeight
+org.freedesktop.systemd1.Scope.TasksAccounting
+org.freedesktop.systemd1.Scope.TasksCurrent
+org.freedesktop.systemd1.Scope.TasksMax
+org.freedesktop.systemd1.Scope.TimeoutStopUSec
+org.freedesktop.systemd1.Scope.WatchdogSignal
+org.freedesktop.systemd1.Service.AllowedCPUs
+org.freedesktop.systemd1.Service.AllowedMemoryNodes
+org.freedesktop.systemd1.Service.AmbientCapabilities
+org.freedesktop.systemd1.Service.AppArmorProfile
+org.freedesktop.systemd1.Service.AttachProcesses()
+org.freedesktop.systemd1.Service.BPFProgram
+org.freedesktop.systemd1.Service.BindMount()
+org.freedesktop.systemd1.Service.BindPaths
+org.freedesktop.systemd1.Service.BindReadOnlyPaths
+org.freedesktop.systemd1.Service.BlockIOAccounting
+org.freedesktop.systemd1.Service.BlockIODeviceWeight
+org.freedesktop.systemd1.Service.BlockIOReadBandwidth
+org.freedesktop.systemd1.Service.BlockIOWeight
+org.freedesktop.systemd1.Service.BlockIOWriteBandwidth
+org.freedesktop.systemd1.Service.BusName
+org.freedesktop.systemd1.Service.CPUAccounting
+org.freedesktop.systemd1.Service.CPUAffinity
+org.freedesktop.systemd1.Service.CPUAffinityFromNUMA
+org.freedesktop.systemd1.Service.CPUQuotaPerSecUSec
+org.freedesktop.systemd1.Service.CPUQuotaPeriodUSec
+org.freedesktop.systemd1.Service.CPUSchedulingPolicy
+org.freedesktop.systemd1.Service.CPUSchedulingPriority
+org.freedesktop.systemd1.Service.CPUSchedulingResetOnFork
+org.freedesktop.systemd1.Service.CPUShares
+org.freedesktop.systemd1.Service.CPUUsageNSec
+org.freedesktop.systemd1.Service.CPUWeight
+org.freedesktop.systemd1.Service.CacheDirectory
+org.freedesktop.systemd1.Service.CacheDirectoryMode
+org.freedesktop.systemd1.Service.CacheDirectorySymlink
+org.freedesktop.systemd1.Service.CapabilityBoundingSet
+org.freedesktop.systemd1.Service.CleanResult
+org.freedesktop.systemd1.Service.ConfigurationDirectory
+org.freedesktop.systemd1.Service.ConfigurationDirectoryMode
+org.freedesktop.systemd1.Service.ControlGroup
+org.freedesktop.systemd1.Service.ControlPID
+org.freedesktop.systemd1.Service.CoredumpFilter
+org.freedesktop.systemd1.Service.DefaultMemoryLow
+org.freedesktop.systemd1.Service.DefaultMemoryMin
+org.freedesktop.systemd1.Service.Delegate
+org.freedesktop.systemd1.Service.DelegateControllers
+org.freedesktop.systemd1.Service.DeviceAllow
+org.freedesktop.systemd1.Service.DevicePolicy
+org.freedesktop.systemd1.Service.DisableControllers
+org.freedesktop.systemd1.Service.DynamicUser
+org.freedesktop.systemd1.Service.EffectiveCPUs
+org.freedesktop.systemd1.Service.EffectiveMemoryNodes
+org.freedesktop.systemd1.Service.Environment
+org.freedesktop.systemd1.Service.EnvironmentFiles
+org.freedesktop.systemd1.Service.ExecCondition
+org.freedesktop.systemd1.Service.ExecConditionEx
+org.freedesktop.systemd1.Service.ExecMainCode
+org.freedesktop.systemd1.Service.ExecMainExitTimestamp
+org.freedesktop.systemd1.Service.ExecMainExitTimestampMonotonic
+org.freedesktop.systemd1.Service.ExecMainPID
+org.freedesktop.systemd1.Service.ExecMainStartTimestamp
+org.freedesktop.systemd1.Service.ExecMainStartTimestampMonotonic
+org.freedesktop.systemd1.Service.ExecMainStatus
+org.freedesktop.systemd1.Service.ExecPaths
+org.freedesktop.systemd1.Service.ExecReload
+org.freedesktop.systemd1.Service.ExecReloadEx
+org.freedesktop.systemd1.Service.ExecSearchPath
+org.freedesktop.systemd1.Service.ExecStart
+org.freedesktop.systemd1.Service.ExecStartEx
+org.freedesktop.systemd1.Service.ExecStartPost
+org.freedesktop.systemd1.Service.ExecStartPostEx
+org.freedesktop.systemd1.Service.ExecStartPre
+org.freedesktop.systemd1.Service.ExecStartPreEx
+org.freedesktop.systemd1.Service.ExecStop
+org.freedesktop.systemd1.Service.ExecStopEx
+org.freedesktop.systemd1.Service.ExecStopPost
+org.freedesktop.systemd1.Service.ExecStopPostEx
+org.freedesktop.systemd1.Service.ExitType
+org.freedesktop.systemd1.Service.ExtensionImages
+org.freedesktop.systemd1.Service.FileDescriptorStoreMax
+org.freedesktop.systemd1.Service.FinalKillSignal
+org.freedesktop.systemd1.Service.GID
+org.freedesktop.systemd1.Service.GetProcesses()
+org.freedesktop.systemd1.Service.Group
+org.freedesktop.systemd1.Service.GuessMainPID
+org.freedesktop.systemd1.Service.IOAccounting
+org.freedesktop.systemd1.Service.IODeviceLatencyTargetUSec
+org.freedesktop.systemd1.Service.IODeviceWeight
+org.freedesktop.systemd1.Service.IOReadBandwidthMax
+org.freedesktop.systemd1.Service.IOReadBytes
+org.freedesktop.systemd1.Service.IOReadIOPSMax
+org.freedesktop.systemd1.Service.IOReadOperations
+org.freedesktop.systemd1.Service.IOSchedulingClass
+org.freedesktop.systemd1.Service.IOSchedulingPriority
+org.freedesktop.systemd1.Service.IOWeight
+org.freedesktop.systemd1.Service.IOWriteBandwidthMax
+org.freedesktop.systemd1.Service.IOWriteBytes
+org.freedesktop.systemd1.Service.IOWriteIOPSMax
+org.freedesktop.systemd1.Service.IOWriteOperations
+org.freedesktop.systemd1.Service.IPAccounting
+org.freedesktop.systemd1.Service.IPAddressAllow
+org.freedesktop.systemd1.Service.IPAddressDeny
+org.freedesktop.systemd1.Service.IPCNamespacePath
+org.freedesktop.systemd1.Service.IPEgressBytes
+org.freedesktop.systemd1.Service.IPEgressFilterPath
+org.freedesktop.systemd1.Service.IPEgressPackets
+org.freedesktop.systemd1.Service.IPIngressBytes
+org.freedesktop.systemd1.Service.IPIngressFilterPath
+org.freedesktop.systemd1.Service.IPIngressPackets
+org.freedesktop.systemd1.Service.IgnoreSIGPIPE
+org.freedesktop.systemd1.Service.InaccessiblePaths
+org.freedesktop.systemd1.Service.KeyringMode
+org.freedesktop.systemd1.Service.KillMode
+org.freedesktop.systemd1.Service.KillSignal
+org.freedesktop.systemd1.Service.LimitAS
+org.freedesktop.systemd1.Service.LimitASSoft
+org.freedesktop.systemd1.Service.LimitCORE
+org.freedesktop.systemd1.Service.LimitCORESoft
+org.freedesktop.systemd1.Service.LimitCPU
+org.freedesktop.systemd1.Service.LimitCPUSoft
+org.freedesktop.systemd1.Service.LimitDATA
+org.freedesktop.systemd1.Service.LimitDATASoft
+org.freedesktop.systemd1.Service.LimitFSIZE
+org.freedesktop.systemd1.Service.LimitFSIZESoft
+org.freedesktop.systemd1.Service.LimitLOCKS
+org.freedesktop.systemd1.Service.LimitLOCKSSoft
+org.freedesktop.systemd1.Service.LimitMEMLOCK
+org.freedesktop.systemd1.Service.LimitMEMLOCKSoft
+org.freedesktop.systemd1.Service.LimitMSGQUEUE
+org.freedesktop.systemd1.Service.LimitMSGQUEUESoft
+org.freedesktop.systemd1.Service.LimitNICE
+org.freedesktop.systemd1.Service.LimitNICESoft
+org.freedesktop.systemd1.Service.LimitNOFILE
+org.freedesktop.systemd1.Service.LimitNOFILESoft
+org.freedesktop.systemd1.Service.LimitNPROC
+org.freedesktop.systemd1.Service.LimitNPROCSoft
+org.freedesktop.systemd1.Service.LimitRSS
+org.freedesktop.systemd1.Service.LimitRSSSoft
+org.freedesktop.systemd1.Service.LimitRTPRIO
+org.freedesktop.systemd1.Service.LimitRTPRIOSoft
+org.freedesktop.systemd1.Service.LimitRTTIME
+org.freedesktop.systemd1.Service.LimitRTTIMESoft
+org.freedesktop.systemd1.Service.LimitSIGPENDING
+org.freedesktop.systemd1.Service.LimitSIGPENDINGSoft
+org.freedesktop.systemd1.Service.LimitSTACK
+org.freedesktop.systemd1.Service.LimitSTACKSoft
+org.freedesktop.systemd1.Service.LoadCredential
+org.freedesktop.systemd1.Service.LoadCredentialEncrypted
+org.freedesktop.systemd1.Service.LockPersonality
+org.freedesktop.systemd1.Service.LogExtraFields
+org.freedesktop.systemd1.Service.LogLevelMax
+org.freedesktop.systemd1.Service.LogNamespace
+org.freedesktop.systemd1.Service.LogRateLimitBurst
+org.freedesktop.systemd1.Service.LogRateLimitIntervalUSec
+org.freedesktop.systemd1.Service.LogsDirectory
+org.freedesktop.systemd1.Service.LogsDirectoryMode
+org.freedesktop.systemd1.Service.LogsDirectorySymlink
+org.freedesktop.systemd1.Service.MainPID
+org.freedesktop.systemd1.Service.ManagedOOMMemoryPressure
+org.freedesktop.systemd1.Service.ManagedOOMMemoryPressureLimit
+org.freedesktop.systemd1.Service.ManagedOOMPreference
+org.freedesktop.systemd1.Service.ManagedOOMSwap
+org.freedesktop.systemd1.Service.MemoryAccounting
+org.freedesktop.systemd1.Service.MemoryAvailable
+org.freedesktop.systemd1.Service.MemoryCurrent
+org.freedesktop.systemd1.Service.MemoryDenyWriteExecute
+org.freedesktop.systemd1.Service.MemoryHigh
+org.freedesktop.systemd1.Service.MemoryLimit
+org.freedesktop.systemd1.Service.MemoryLow
+org.freedesktop.systemd1.Service.MemoryMax
+org.freedesktop.systemd1.Service.MemoryMin
+org.freedesktop.systemd1.Service.MemorySwapMax
+org.freedesktop.systemd1.Service.MountAPIVFS
+org.freedesktop.systemd1.Service.MountFlags
+org.freedesktop.systemd1.Service.MountImage()
+org.freedesktop.systemd1.Service.MountImages
+org.freedesktop.systemd1.Service.NFileDescriptorStore
+org.freedesktop.systemd1.Service.NRestarts
+org.freedesktop.systemd1.Service.NUMAMask
+org.freedesktop.systemd1.Service.NUMAPolicy
+org.freedesktop.systemd1.Service.NetworkNamespacePath
+org.freedesktop.systemd1.Service.Nice
+org.freedesktop.systemd1.Service.NoExecPaths
+org.freedesktop.systemd1.Service.NoNewPrivileges
+org.freedesktop.systemd1.Service.NonBlocking
+org.freedesktop.systemd1.Service.NotifyAccess
+org.freedesktop.systemd1.Service.OOMPolicy
+org.freedesktop.systemd1.Service.OOMScoreAdjust
+org.freedesktop.systemd1.Service.PAMName
+org.freedesktop.systemd1.Service.PIDFile
+org.freedesktop.systemd1.Service.PassEnvironment
+org.freedesktop.systemd1.Service.Personality
+org.freedesktop.systemd1.Service.PrivateDevices
+org.freedesktop.systemd1.Service.PrivateIPC
+org.freedesktop.systemd1.Service.PrivateMounts
+org.freedesktop.systemd1.Service.PrivateNetwork
+org.freedesktop.systemd1.Service.PrivateTmp
+org.freedesktop.systemd1.Service.PrivateUsers
+org.freedesktop.systemd1.Service.ProcSubset
+org.freedesktop.systemd1.Service.ProtectClock
+org.freedesktop.systemd1.Service.ProtectControlGroups
+org.freedesktop.systemd1.Service.ProtectHome
+org.freedesktop.systemd1.Service.ProtectHostname
+org.freedesktop.systemd1.Service.ProtectKernelLogs
+org.freedesktop.systemd1.Service.ProtectKernelModules
+org.freedesktop.systemd1.Service.ProtectKernelTunables
+org.freedesktop.systemd1.Service.ProtectProc
+org.freedesktop.systemd1.Service.ProtectSystem
+org.freedesktop.systemd1.Service.ReadOnlyPaths
+org.freedesktop.systemd1.Service.ReadWritePaths
+org.freedesktop.systemd1.Service.ReloadResult
+org.freedesktop.systemd1.Service.RemainAfterExit
+org.freedesktop.systemd1.Service.RemoveIPC
+org.freedesktop.systemd1.Service.Restart
+org.freedesktop.systemd1.Service.RestartForceExitStatus
+org.freedesktop.systemd1.Service.RestartKillSignal
+org.freedesktop.systemd1.Service.RestartPreventExitStatus
+org.freedesktop.systemd1.Service.RestartUSec
+org.freedesktop.systemd1.Service.RestrictAddressFamilies
+org.freedesktop.systemd1.Service.RestrictFileSystems
+org.freedesktop.systemd1.Service.RestrictNamespaces
+org.freedesktop.systemd1.Service.RestrictNetworkInterfaces
+org.freedesktop.systemd1.Service.RestrictRealtime
+org.freedesktop.systemd1.Service.RestrictSUIDSGID
+org.freedesktop.systemd1.Service.Result
+org.freedesktop.systemd1.Service.RootDirectory
+org.freedesktop.systemd1.Service.RootDirectoryStartOnly
+org.freedesktop.systemd1.Service.RootHash
+org.freedesktop.systemd1.Service.RootHashPath
+org.freedesktop.systemd1.Service.RootHashSignature
+org.freedesktop.systemd1.Service.RootHashSignaturePath
+org.freedesktop.systemd1.Service.RootImage
+org.freedesktop.systemd1.Service.RootImageOptions
+org.freedesktop.systemd1.Service.RootVerity
+org.freedesktop.systemd1.Service.RuntimeDirectory
+org.freedesktop.systemd1.Service.RuntimeDirectoryMode
+org.freedesktop.systemd1.Service.RuntimeDirectoryPreserve
+org.freedesktop.systemd1.Service.RuntimeDirectorySymlink
+org.freedesktop.systemd1.Service.RuntimeMaxUSec
+org.freedesktop.systemd1.Service.RuntimeRandomizedExtraUSec
+org.freedesktop.systemd1.Service.SELinuxContext
+org.freedesktop.systemd1.Service.SameProcessGroup
+org.freedesktop.systemd1.Service.SecureBits
+org.freedesktop.systemd1.Service.SendSIGHUP
+org.freedesktop.systemd1.Service.SendSIGKILL
+org.freedesktop.systemd1.Service.SetCredential
+org.freedesktop.systemd1.Service.SetCredentialEncrypted
+org.freedesktop.systemd1.Service.Slice
+org.freedesktop.systemd1.Service.SmackProcessLabel
+org.freedesktop.systemd1.Service.SocketBindAllow
+org.freedesktop.systemd1.Service.SocketBindDeny
+org.freedesktop.systemd1.Service.StandardError
+org.freedesktop.systemd1.Service.StandardErrorFileDescriptorName
+org.freedesktop.systemd1.Service.StandardInput
+org.freedesktop.systemd1.Service.StandardInputData
+org.freedesktop.systemd1.Service.StandardInputFileDescriptorName
+org.freedesktop.systemd1.Service.StandardOutput
+org.freedesktop.systemd1.Service.StandardOutputFileDescriptorName
+org.freedesktop.systemd1.Service.StartupAllowedCPUs
+org.freedesktop.systemd1.Service.StartupAllowedMemoryNodes
+org.freedesktop.systemd1.Service.StartupBlockIOWeight
+org.freedesktop.systemd1.Service.StartupCPUShares
+org.freedesktop.systemd1.Service.StartupCPUWeight
+org.freedesktop.systemd1.Service.StartupIOWeight
+org.freedesktop.systemd1.Service.StateDirectory
+org.freedesktop.systemd1.Service.StateDirectoryMode
+org.freedesktop.systemd1.Service.StateDirectorySymlink
+org.freedesktop.systemd1.Service.StatusErrno
+org.freedesktop.systemd1.Service.StatusText
+org.freedesktop.systemd1.Service.SuccessExitStatus
+org.freedesktop.systemd1.Service.SupplementaryGroups
+org.freedesktop.systemd1.Service.SyslogFacility
+org.freedesktop.systemd1.Service.SyslogIdentifier
+org.freedesktop.systemd1.Service.SyslogLevel
+org.freedesktop.systemd1.Service.SyslogLevelPrefix
+org.freedesktop.systemd1.Service.SyslogPriority
+org.freedesktop.systemd1.Service.SystemCallArchitectures
+org.freedesktop.systemd1.Service.SystemCallErrorNumber
+org.freedesktop.systemd1.Service.SystemCallFilter
+org.freedesktop.systemd1.Service.SystemCallLog
+org.freedesktop.systemd1.Service.TTYColumns
+org.freedesktop.systemd1.Service.TTYPath
+org.freedesktop.systemd1.Service.TTYReset
+org.freedesktop.systemd1.Service.TTYRows
+org.freedesktop.systemd1.Service.TTYVHangup
+org.freedesktop.systemd1.Service.TTYVTDisallocate
+org.freedesktop.systemd1.Service.TasksAccounting
+org.freedesktop.systemd1.Service.TasksCurrent
+org.freedesktop.systemd1.Service.TasksMax
+org.freedesktop.systemd1.Service.TemporaryFileSystem
+org.freedesktop.systemd1.Service.TimeoutAbortUSec
+org.freedesktop.systemd1.Service.TimeoutCleanUSec
+org.freedesktop.systemd1.Service.TimeoutStartFailureMode
+org.freedesktop.systemd1.Service.TimeoutStartUSec
+org.freedesktop.systemd1.Service.TimeoutStopFailureMode
+org.freedesktop.systemd1.Service.TimeoutStopUSec
+org.freedesktop.systemd1.Service.TimerSlackNSec
+org.freedesktop.systemd1.Service.Type
+org.freedesktop.systemd1.Service.UID
+org.freedesktop.systemd1.Service.UMask
+org.freedesktop.systemd1.Service.USBFunctionDescriptors
+org.freedesktop.systemd1.Service.USBFunctionStrings
+org.freedesktop.systemd1.Service.UnsetEnvironment
+org.freedesktop.systemd1.Service.User
+org.freedesktop.systemd1.Service.UtmpIdentifier
+org.freedesktop.systemd1.Service.UtmpMode
+org.freedesktop.systemd1.Service.WatchdogSignal
+org.freedesktop.systemd1.Service.WatchdogTimestamp
+org.freedesktop.systemd1.Service.WatchdogTimestampMonotonic
+org.freedesktop.systemd1.Service.WatchdogUSec
+org.freedesktop.systemd1.Service.WorkingDirectory
+org.freedesktop.systemd1.Slice.AllowedCPUs
+org.freedesktop.systemd1.Slice.AllowedMemoryNodes
+org.freedesktop.systemd1.Slice.AttachProcesses()
+org.freedesktop.systemd1.Slice.BPFProgram
+org.freedesktop.systemd1.Slice.BlockIOAccounting
+org.freedesktop.systemd1.Slice.BlockIODeviceWeight
+org.freedesktop.systemd1.Slice.BlockIOReadBandwidth
+org.freedesktop.systemd1.Slice.BlockIOWeight
+org.freedesktop.systemd1.Slice.BlockIOWriteBandwidth
+org.freedesktop.systemd1.Slice.CPUAccounting
+org.freedesktop.systemd1.Slice.CPUQuotaPerSecUSec
+org.freedesktop.systemd1.Slice.CPUQuotaPeriodUSec
+org.freedesktop.systemd1.Slice.CPUShares
+org.freedesktop.systemd1.Slice.CPUUsageNSec
+org.freedesktop.systemd1.Slice.CPUWeight
+org.freedesktop.systemd1.Slice.ControlGroup
+org.freedesktop.systemd1.Slice.DefaultMemoryLow
+org.freedesktop.systemd1.Slice.DefaultMemoryMin
+org.freedesktop.systemd1.Slice.Delegate
+org.freedesktop.systemd1.Slice.DelegateControllers
+org.freedesktop.systemd1.Slice.DeviceAllow
+org.freedesktop.systemd1.Slice.DevicePolicy
+org.freedesktop.systemd1.Slice.DisableControllers
+org.freedesktop.systemd1.Slice.EffectiveCPUs
+org.freedesktop.systemd1.Slice.EffectiveMemoryNodes
+org.freedesktop.systemd1.Slice.GetProcesses()
+org.freedesktop.systemd1.Slice.IOAccounting
+org.freedesktop.systemd1.Slice.IODeviceLatencyTargetUSec
+org.freedesktop.systemd1.Slice.IODeviceWeight
+org.freedesktop.systemd1.Slice.IOReadBandwidthMax
+org.freedesktop.systemd1.Slice.IOReadBytes
+org.freedesktop.systemd1.Slice.IOReadIOPSMax
+org.freedesktop.systemd1.Slice.IOReadOperations
+org.freedesktop.systemd1.Slice.IOWeight
+org.freedesktop.systemd1.Slice.IOWriteBandwidthMax
+org.freedesktop.systemd1.Slice.IOWriteBytes
+org.freedesktop.systemd1.Slice.IOWriteIOPSMax
+org.freedesktop.systemd1.Slice.IOWriteOperations
+org.freedesktop.systemd1.Slice.IPAccounting
+org.freedesktop.systemd1.Slice.IPAddressAllow
+org.freedesktop.systemd1.Slice.IPAddressDeny
+org.freedesktop.systemd1.Slice.IPEgressBytes
+org.freedesktop.systemd1.Slice.IPEgressFilterPath
+org.freedesktop.systemd1.Slice.IPEgressPackets
+org.freedesktop.systemd1.Slice.IPIngressBytes
+org.freedesktop.systemd1.Slice.IPIngressFilterPath
+org.freedesktop.systemd1.Slice.IPIngressPackets
+org.freedesktop.systemd1.Slice.ManagedOOMMemoryPressure
+org.freedesktop.systemd1.Slice.ManagedOOMMemoryPressureLimit
+org.freedesktop.systemd1.Slice.ManagedOOMPreference
+org.freedesktop.systemd1.Slice.ManagedOOMSwap
+org.freedesktop.systemd1.Slice.MemoryAccounting
+org.freedesktop.systemd1.Slice.MemoryAvailable
+org.freedesktop.systemd1.Slice.MemoryCurrent
+org.freedesktop.systemd1.Slice.MemoryHigh
+org.freedesktop.systemd1.Slice.MemoryLimit
+org.freedesktop.systemd1.Slice.MemoryLow
+org.freedesktop.systemd1.Slice.MemoryMax
+org.freedesktop.systemd1.Slice.MemoryMin
+org.freedesktop.systemd1.Slice.MemorySwapMax
+org.freedesktop.systemd1.Slice.RestrictNetworkInterfaces
+org.freedesktop.systemd1.Slice.Slice
+org.freedesktop.systemd1.Slice.SocketBindAllow
+org.freedesktop.systemd1.Slice.SocketBindDeny
+org.freedesktop.systemd1.Slice.StartupAllowedCPUs
+org.freedesktop.systemd1.Slice.StartupAllowedMemoryNodes
+org.freedesktop.systemd1.Slice.StartupBlockIOWeight
+org.freedesktop.systemd1.Slice.StartupCPUShares
+org.freedesktop.systemd1.Slice.StartupCPUWeight
+org.freedesktop.systemd1.Slice.StartupIOWeight
+org.freedesktop.systemd1.Slice.TasksAccounting
+org.freedesktop.systemd1.Slice.TasksCurrent
+org.freedesktop.systemd1.Slice.TasksMax
+org.freedesktop.systemd1.Socket.Accept
+org.freedesktop.systemd1.Socket.AllowedCPUs
+org.freedesktop.systemd1.Socket.AllowedMemoryNodes
+org.freedesktop.systemd1.Socket.AmbientCapabilities
+org.freedesktop.systemd1.Socket.AppArmorProfile
+org.freedesktop.systemd1.Socket.AttachProcesses()
+org.freedesktop.systemd1.Socket.BPFProgram
+org.freedesktop.systemd1.Socket.Backlog
+org.freedesktop.systemd1.Socket.BindIPv6Only
+org.freedesktop.systemd1.Socket.BindPaths
+org.freedesktop.systemd1.Socket.BindReadOnlyPaths
+org.freedesktop.systemd1.Socket.BindToDevice
+org.freedesktop.systemd1.Socket.BlockIOAccounting
+org.freedesktop.systemd1.Socket.BlockIODeviceWeight
+org.freedesktop.systemd1.Socket.BlockIOReadBandwidth
+org.freedesktop.systemd1.Socket.BlockIOWeight
+org.freedesktop.systemd1.Socket.BlockIOWriteBandwidth
+org.freedesktop.systemd1.Socket.Broadcast
+org.freedesktop.systemd1.Socket.CPUAccounting
+org.freedesktop.systemd1.Socket.CPUAffinity
+org.freedesktop.systemd1.Socket.CPUAffinityFromNUMA
+org.freedesktop.systemd1.Socket.CPUQuotaPerSecUSec
+org.freedesktop.systemd1.Socket.CPUQuotaPeriodUSec
+org.freedesktop.systemd1.Socket.CPUSchedulingPolicy
+org.freedesktop.systemd1.Socket.CPUSchedulingPriority
+org.freedesktop.systemd1.Socket.CPUSchedulingResetOnFork
+org.freedesktop.systemd1.Socket.CPUShares
+org.freedesktop.systemd1.Socket.CPUUsageNSec
+org.freedesktop.systemd1.Socket.CPUWeight
+org.freedesktop.systemd1.Socket.CacheDirectory
+org.freedesktop.systemd1.Socket.CacheDirectoryMode
+org.freedesktop.systemd1.Socket.CacheDirectorySymlink
+org.freedesktop.systemd1.Socket.CapabilityBoundingSet
+org.freedesktop.systemd1.Socket.ConfigurationDirectory
+org.freedesktop.systemd1.Socket.ConfigurationDirectoryMode
+org.freedesktop.systemd1.Socket.ControlGroup
+org.freedesktop.systemd1.Socket.ControlPID
+org.freedesktop.systemd1.Socket.CoredumpFilter
+org.freedesktop.systemd1.Socket.DefaultMemoryLow
+org.freedesktop.systemd1.Socket.DefaultMemoryMin
+org.freedesktop.systemd1.Socket.DeferAcceptUSec
+org.freedesktop.systemd1.Socket.Delegate
+org.freedesktop.systemd1.Socket.DelegateControllers
+org.freedesktop.systemd1.Socket.DeviceAllow
+org.freedesktop.systemd1.Socket.DevicePolicy
+org.freedesktop.systemd1.Socket.DirectoryMode
+org.freedesktop.systemd1.Socket.DisableControllers
+org.freedesktop.systemd1.Socket.DynamicUser
+org.freedesktop.systemd1.Socket.EffectiveCPUs
+org.freedesktop.systemd1.Socket.EffectiveMemoryNodes
+org.freedesktop.systemd1.Socket.Environment
+org.freedesktop.systemd1.Socket.EnvironmentFiles
+org.freedesktop.systemd1.Socket.ExecPaths
+org.freedesktop.systemd1.Socket.ExecSearchPath
+org.freedesktop.systemd1.Socket.ExecStartPost
+org.freedesktop.systemd1.Socket.ExecStartPre
+org.freedesktop.systemd1.Socket.ExecStopPost
+org.freedesktop.systemd1.Socket.ExecStopPre
+org.freedesktop.systemd1.Socket.ExtensionImages
+org.freedesktop.systemd1.Socket.FileDescriptorName
+org.freedesktop.systemd1.Socket.FinalKillSignal
+org.freedesktop.systemd1.Socket.FlushPending
+org.freedesktop.systemd1.Socket.FreeBind
+org.freedesktop.systemd1.Socket.GID
+org.freedesktop.systemd1.Socket.GetProcesses()
+org.freedesktop.systemd1.Socket.Group
+org.freedesktop.systemd1.Socket.IOAccounting
+org.freedesktop.systemd1.Socket.IODeviceLatencyTargetUSec
+org.freedesktop.systemd1.Socket.IODeviceWeight
+org.freedesktop.systemd1.Socket.IOReadBandwidthMax
+org.freedesktop.systemd1.Socket.IOReadBytes
+org.freedesktop.systemd1.Socket.IOReadIOPSMax
+org.freedesktop.systemd1.Socket.IOReadOperations
+org.freedesktop.systemd1.Socket.IOSchedulingClass
+org.freedesktop.systemd1.Socket.IOSchedulingPriority
+org.freedesktop.systemd1.Socket.IOWeight
+org.freedesktop.systemd1.Socket.IOWriteBandwidthMax
+org.freedesktop.systemd1.Socket.IOWriteBytes
+org.freedesktop.systemd1.Socket.IOWriteIOPSMax
+org.freedesktop.systemd1.Socket.IOWriteOperations
+org.freedesktop.systemd1.Socket.IPAccounting
+org.freedesktop.systemd1.Socket.IPAddressAllow
+org.freedesktop.systemd1.Socket.IPAddressDeny
+org.freedesktop.systemd1.Socket.IPCNamespacePath
+org.freedesktop.systemd1.Socket.IPEgressBytes
+org.freedesktop.systemd1.Socket.IPEgressFilterPath
+org.freedesktop.systemd1.Socket.IPEgressPackets
+org.freedesktop.systemd1.Socket.IPIngressBytes
+org.freedesktop.systemd1.Socket.IPIngressFilterPath
+org.freedesktop.systemd1.Socket.IPIngressPackets
+org.freedesktop.systemd1.Socket.IPTOS
+org.freedesktop.systemd1.Socket.IPTTL
+org.freedesktop.systemd1.Socket.IgnoreSIGPIPE
+org.freedesktop.systemd1.Socket.InaccessiblePaths
+org.freedesktop.systemd1.Socket.KeepAlive
+org.freedesktop.systemd1.Socket.KeepAliveIntervalUSec
+org.freedesktop.systemd1.Socket.KeepAliveProbes
+org.freedesktop.systemd1.Socket.KeepAliveTimeUSec
+org.freedesktop.systemd1.Socket.KeyringMode
+org.freedesktop.systemd1.Socket.KillMode
+org.freedesktop.systemd1.Socket.KillSignal
+org.freedesktop.systemd1.Socket.LimitAS
+org.freedesktop.systemd1.Socket.LimitASSoft
+org.freedesktop.systemd1.Socket.LimitCORE
+org.freedesktop.systemd1.Socket.LimitCORESoft
+org.freedesktop.systemd1.Socket.LimitCPU
+org.freedesktop.systemd1.Socket.LimitCPUSoft
+org.freedesktop.systemd1.Socket.LimitDATA
+org.freedesktop.systemd1.Socket.LimitDATASoft
+org.freedesktop.systemd1.Socket.LimitFSIZE
+org.freedesktop.systemd1.Socket.LimitFSIZESoft
+org.freedesktop.systemd1.Socket.LimitLOCKS
+org.freedesktop.systemd1.Socket.LimitLOCKSSoft
+org.freedesktop.systemd1.Socket.LimitMEMLOCK
+org.freedesktop.systemd1.Socket.LimitMEMLOCKSoft
+org.freedesktop.systemd1.Socket.LimitMSGQUEUE
+org.freedesktop.systemd1.Socket.LimitMSGQUEUESoft
+org.freedesktop.systemd1.Socket.LimitNICE
+org.freedesktop.systemd1.Socket.LimitNICESoft
+org.freedesktop.systemd1.Socket.LimitNOFILE
+org.freedesktop.systemd1.Socket.LimitNOFILESoft
+org.freedesktop.systemd1.Socket.LimitNPROC
+org.freedesktop.systemd1.Socket.LimitNPROCSoft
+org.freedesktop.systemd1.Socket.LimitRSS
+org.freedesktop.systemd1.Socket.LimitRSSSoft
+org.freedesktop.systemd1.Socket.LimitRTPRIO
+org.freedesktop.systemd1.Socket.LimitRTPRIOSoft
+org.freedesktop.systemd1.Socket.LimitRTTIME
+org.freedesktop.systemd1.Socket.LimitRTTIMESoft
+org.freedesktop.systemd1.Socket.LimitSIGPENDING
+org.freedesktop.systemd1.Socket.LimitSIGPENDINGSoft
+org.freedesktop.systemd1.Socket.LimitSTACK
+org.freedesktop.systemd1.Socket.LimitSTACKSoft
+org.freedesktop.systemd1.Socket.Listen
+org.freedesktop.systemd1.Socket.LoadCredential
+org.freedesktop.systemd1.Socket.LoadCredentialEncrypted
+org.freedesktop.systemd1.Socket.LockPersonality
+org.freedesktop.systemd1.Socket.LogExtraFields
+org.freedesktop.systemd1.Socket.LogLevelMax
+org.freedesktop.systemd1.Socket.LogNamespace
+org.freedesktop.systemd1.Socket.LogRateLimitBurst
+org.freedesktop.systemd1.Socket.LogRateLimitIntervalUSec
+org.freedesktop.systemd1.Socket.LogsDirectory
+org.freedesktop.systemd1.Socket.LogsDirectoryMode
+org.freedesktop.systemd1.Socket.LogsDirectorySymlink
+org.freedesktop.systemd1.Socket.ManagedOOMMemoryPressure
+org.freedesktop.systemd1.Socket.ManagedOOMMemoryPressureLimit
+org.freedesktop.systemd1.Socket.ManagedOOMPreference
+org.freedesktop.systemd1.Socket.ManagedOOMSwap
+org.freedesktop.systemd1.Socket.Mark
+org.freedesktop.systemd1.Socket.MaxConnections
+org.freedesktop.systemd1.Socket.MaxConnectionsPerSource
+org.freedesktop.systemd1.Socket.MemoryAccounting
+org.freedesktop.systemd1.Socket.MemoryAvailable
+org.freedesktop.systemd1.Socket.MemoryCurrent
+org.freedesktop.systemd1.Socket.MemoryDenyWriteExecute
+org.freedesktop.systemd1.Socket.MemoryHigh
+org.freedesktop.systemd1.Socket.MemoryLimit
+org.freedesktop.systemd1.Socket.MemoryLow
+org.freedesktop.systemd1.Socket.MemoryMax
+org.freedesktop.systemd1.Socket.MemoryMin
+org.freedesktop.systemd1.Socket.MemorySwapMax
+org.freedesktop.systemd1.Socket.MessageQueueMaxMessages
+org.freedesktop.systemd1.Socket.MessageQueueMessageSize
+org.freedesktop.systemd1.Socket.MountAPIVFS
+org.freedesktop.systemd1.Socket.MountFlags
+org.freedesktop.systemd1.Socket.MountImages
+org.freedesktop.systemd1.Socket.NAccepted
+org.freedesktop.systemd1.Socket.NConnections
+org.freedesktop.systemd1.Socket.NRefused
+org.freedesktop.systemd1.Socket.NUMAMask
+org.freedesktop.systemd1.Socket.NUMAPolicy
+org.freedesktop.systemd1.Socket.NetworkNamespacePath
+org.freedesktop.systemd1.Socket.Nice
+org.freedesktop.systemd1.Socket.NoDelay
+org.freedesktop.systemd1.Socket.NoExecPaths
+org.freedesktop.systemd1.Socket.NoNewPrivileges
+org.freedesktop.systemd1.Socket.NonBlocking
+org.freedesktop.systemd1.Socket.OOMScoreAdjust
+org.freedesktop.systemd1.Socket.PAMName
+org.freedesktop.systemd1.Socket.PassCredentials
+org.freedesktop.systemd1.Socket.PassEnvironment
+org.freedesktop.systemd1.Socket.PassPacketInfo
+org.freedesktop.systemd1.Socket.PassSecurity
+org.freedesktop.systemd1.Socket.Personality
+org.freedesktop.systemd1.Socket.PipeSize
+org.freedesktop.systemd1.Socket.Priority
+org.freedesktop.systemd1.Socket.PrivateDevices
+org.freedesktop.systemd1.Socket.PrivateIPC
+org.freedesktop.systemd1.Socket.PrivateMounts
+org.freedesktop.systemd1.Socket.PrivateNetwork
+org.freedesktop.systemd1.Socket.PrivateTmp
+org.freedesktop.systemd1.Socket.PrivateUsers
+org.freedesktop.systemd1.Socket.ProcSubset
+org.freedesktop.systemd1.Socket.ProtectClock
+org.freedesktop.systemd1.Socket.ProtectControlGroups
+org.freedesktop.systemd1.Socket.ProtectHome
+org.freedesktop.systemd1.Socket.ProtectHostname
+org.freedesktop.systemd1.Socket.ProtectKernelLogs
+org.freedesktop.systemd1.Socket.ProtectKernelModules
+org.freedesktop.systemd1.Socket.ProtectKernelTunables
+org.freedesktop.systemd1.Socket.ProtectProc
+org.freedesktop.systemd1.Socket.ProtectSystem
+org.freedesktop.systemd1.Socket.ReadOnlyPaths
+org.freedesktop.systemd1.Socket.ReadWritePaths
+org.freedesktop.systemd1.Socket.ReceiveBuffer
+org.freedesktop.systemd1.Socket.RemoveIPC
+org.freedesktop.systemd1.Socket.RemoveOnStop
+org.freedesktop.systemd1.Socket.RestartKillSignal
+org.freedesktop.systemd1.Socket.RestrictAddressFamilies
+org.freedesktop.systemd1.Socket.RestrictFileSystems
+org.freedesktop.systemd1.Socket.RestrictNamespaces
+org.freedesktop.systemd1.Socket.RestrictNetworkInterfaces
+org.freedesktop.systemd1.Socket.RestrictRealtime
+org.freedesktop.systemd1.Socket.RestrictSUIDSGID
+org.freedesktop.systemd1.Socket.Result
+org.freedesktop.systemd1.Socket.ReusePort
+org.freedesktop.systemd1.Socket.RootDirectory
+org.freedesktop.systemd1.Socket.RootHash
+org.freedesktop.systemd1.Socket.RootHashPath
+org.freedesktop.systemd1.Socket.RootHashSignature
+org.freedesktop.systemd1.Socket.RootHashSignaturePath
+org.freedesktop.systemd1.Socket.RootImage
+org.freedesktop.systemd1.Socket.RootImageOptions
+org.freedesktop.systemd1.Socket.RootVerity
+org.freedesktop.systemd1.Socket.RuntimeDirectory
+org.freedesktop.systemd1.Socket.RuntimeDirectoryMode
+org.freedesktop.systemd1.Socket.RuntimeDirectoryPreserve
+org.freedesktop.systemd1.Socket.RuntimeDirectorySymlink
+org.freedesktop.systemd1.Socket.SELinuxContext
+org.freedesktop.systemd1.Socket.SameProcessGroup
+org.freedesktop.systemd1.Socket.SecureBits
+org.freedesktop.systemd1.Socket.SendBuffer
+org.freedesktop.systemd1.Socket.SendSIGHUP
+org.freedesktop.systemd1.Socket.SendSIGKILL
+org.freedesktop.systemd1.Socket.SetCredential
+org.freedesktop.systemd1.Socket.SetCredentialEncrypted
+org.freedesktop.systemd1.Socket.Slice
+org.freedesktop.systemd1.Socket.SmackLabel
+org.freedesktop.systemd1.Socket.SmackLabelIPIn
+org.freedesktop.systemd1.Socket.SmackLabelIPOut
+org.freedesktop.systemd1.Socket.SmackProcessLabel
+org.freedesktop.systemd1.Socket.SocketBindAllow
+org.freedesktop.systemd1.Socket.SocketBindDeny
+org.freedesktop.systemd1.Socket.SocketGroup
+org.freedesktop.systemd1.Socket.SocketMode
+org.freedesktop.systemd1.Socket.SocketProtocol
+org.freedesktop.systemd1.Socket.SocketUser
+org.freedesktop.systemd1.Socket.StandardError
+org.freedesktop.systemd1.Socket.StandardErrorFileDescriptorName
+org.freedesktop.systemd1.Socket.StandardInput
+org.freedesktop.systemd1.Socket.StandardInputData
+org.freedesktop.systemd1.Socket.StandardInputFileDescriptorName
+org.freedesktop.systemd1.Socket.StandardOutput
+org.freedesktop.systemd1.Socket.StandardOutputFileDescriptorName
+org.freedesktop.systemd1.Socket.StartupAllowedCPUs
+org.freedesktop.systemd1.Socket.StartupAllowedMemoryNodes
+org.freedesktop.systemd1.Socket.StartupBlockIOWeight
+org.freedesktop.systemd1.Socket.StartupCPUShares
+org.freedesktop.systemd1.Socket.StartupCPUWeight
+org.freedesktop.systemd1.Socket.StartupIOWeight
+org.freedesktop.systemd1.Socket.StateDirectory
+org.freedesktop.systemd1.Socket.StateDirectoryMode
+org.freedesktop.systemd1.Socket.StateDirectorySymlink
+org.freedesktop.systemd1.Socket.SupplementaryGroups
+org.freedesktop.systemd1.Socket.Symlinks
+org.freedesktop.systemd1.Socket.SyslogFacility
+org.freedesktop.systemd1.Socket.SyslogIdentifier
+org.freedesktop.systemd1.Socket.SyslogLevel
+org.freedesktop.systemd1.Socket.SyslogLevelPrefix
+org.freedesktop.systemd1.Socket.SyslogPriority
+org.freedesktop.systemd1.Socket.SystemCallArchitectures
+org.freedesktop.systemd1.Socket.SystemCallErrorNumber
+org.freedesktop.systemd1.Socket.SystemCallFilter
+org.freedesktop.systemd1.Socket.SystemCallLog
+org.freedesktop.systemd1.Socket.TCPCongestion
+org.freedesktop.systemd1.Socket.TTYColumns
+org.freedesktop.systemd1.Socket.TTYPath
+org.freedesktop.systemd1.Socket.TTYReset
+org.freedesktop.systemd1.Socket.TTYRows
+org.freedesktop.systemd1.Socket.TTYVHangup
+org.freedesktop.systemd1.Socket.TTYVTDisallocate
+org.freedesktop.systemd1.Socket.TasksAccounting
+org.freedesktop.systemd1.Socket.TasksCurrent
+org.freedesktop.systemd1.Socket.TasksMax
+org.freedesktop.systemd1.Socket.TemporaryFileSystem
+org.freedesktop.systemd1.Socket.TimeoutCleanUSec
+org.freedesktop.systemd1.Socket.TimeoutUSec
+org.freedesktop.systemd1.Socket.TimerSlackNSec
+org.freedesktop.systemd1.Socket.Timestamping
+org.freedesktop.systemd1.Socket.Transparent
+org.freedesktop.systemd1.Socket.TriggerLimitBurst
+org.freedesktop.systemd1.Socket.TriggerLimitIntervalUSec
+org.freedesktop.systemd1.Socket.UID
+org.freedesktop.systemd1.Socket.UMask
+org.freedesktop.systemd1.Socket.UnsetEnvironment
+org.freedesktop.systemd1.Socket.User
+org.freedesktop.systemd1.Socket.UtmpIdentifier
+org.freedesktop.systemd1.Socket.UtmpMode
+org.freedesktop.systemd1.Socket.WatchdogSignal
+org.freedesktop.systemd1.Socket.WorkingDirectory
+org.freedesktop.systemd1.Socket.Writable
+org.freedesktop.systemd1.Swap.AllowedCPUs
+org.freedesktop.systemd1.Swap.AllowedMemoryNodes
+org.freedesktop.systemd1.Swap.AmbientCapabilities
+org.freedesktop.systemd1.Swap.AppArmorProfile
+org.freedesktop.systemd1.Swap.AttachProcesses()
+org.freedesktop.systemd1.Swap.BPFProgram
+org.freedesktop.systemd1.Swap.BindPaths
+org.freedesktop.systemd1.Swap.BindReadOnlyPaths
+org.freedesktop.systemd1.Swap.BlockIOAccounting
+org.freedesktop.systemd1.Swap.BlockIODeviceWeight
+org.freedesktop.systemd1.Swap.BlockIOReadBandwidth
+org.freedesktop.systemd1.Swap.BlockIOWeight
+org.freedesktop.systemd1.Swap.BlockIOWriteBandwidth
+org.freedesktop.systemd1.Swap.CPUAccounting
+org.freedesktop.systemd1.Swap.CPUAffinity
+org.freedesktop.systemd1.Swap.CPUAffinityFromNUMA
+org.freedesktop.systemd1.Swap.CPUQuotaPerSecUSec
+org.freedesktop.systemd1.Swap.CPUQuotaPeriodUSec
+org.freedesktop.systemd1.Swap.CPUSchedulingPolicy
+org.freedesktop.systemd1.Swap.CPUSchedulingPriority
+org.freedesktop.systemd1.Swap.CPUSchedulingResetOnFork
+org.freedesktop.systemd1.Swap.CPUShares
+org.freedesktop.systemd1.Swap.CPUUsageNSec
+org.freedesktop.systemd1.Swap.CPUWeight
+org.freedesktop.systemd1.Swap.CacheDirectory
+org.freedesktop.systemd1.Swap.CacheDirectoryMode
+org.freedesktop.systemd1.Swap.CacheDirectorySymlink
+org.freedesktop.systemd1.Swap.CapabilityBoundingSet
+org.freedesktop.systemd1.Swap.ConfigurationDirectory
+org.freedesktop.systemd1.Swap.ConfigurationDirectoryMode
+org.freedesktop.systemd1.Swap.ControlGroup
+org.freedesktop.systemd1.Swap.ControlPID
+org.freedesktop.systemd1.Swap.CoredumpFilter
+org.freedesktop.systemd1.Swap.DefaultMemoryLow
+org.freedesktop.systemd1.Swap.DefaultMemoryMin
+org.freedesktop.systemd1.Swap.Delegate
+org.freedesktop.systemd1.Swap.DelegateControllers
+org.freedesktop.systemd1.Swap.DeviceAllow
+org.freedesktop.systemd1.Swap.DevicePolicy
+org.freedesktop.systemd1.Swap.DisableControllers
+org.freedesktop.systemd1.Swap.DynamicUser
+org.freedesktop.systemd1.Swap.EffectiveCPUs
+org.freedesktop.systemd1.Swap.EffectiveMemoryNodes
+org.freedesktop.systemd1.Swap.Environment
+org.freedesktop.systemd1.Swap.EnvironmentFiles
+org.freedesktop.systemd1.Swap.ExecActivate
+org.freedesktop.systemd1.Swap.ExecDeactivate
+org.freedesktop.systemd1.Swap.ExecPaths
+org.freedesktop.systemd1.Swap.ExecSearchPath
+org.freedesktop.systemd1.Swap.ExtensionImages
+org.freedesktop.systemd1.Swap.FinalKillSignal
+org.freedesktop.systemd1.Swap.GID
+org.freedesktop.systemd1.Swap.GetProcesses()
+org.freedesktop.systemd1.Swap.Group
+org.freedesktop.systemd1.Swap.IOAccounting
+org.freedesktop.systemd1.Swap.IODeviceLatencyTargetUSec
+org.freedesktop.systemd1.Swap.IODeviceWeight
+org.freedesktop.systemd1.Swap.IOReadBandwidthMax
+org.freedesktop.systemd1.Swap.IOReadBytes
+org.freedesktop.systemd1.Swap.IOReadIOPSMax
+org.freedesktop.systemd1.Swap.IOReadOperations
+org.freedesktop.systemd1.Swap.IOSchedulingClass
+org.freedesktop.systemd1.Swap.IOSchedulingPriority
+org.freedesktop.systemd1.Swap.IOWeight
+org.freedesktop.systemd1.Swap.IOWriteBandwidthMax
+org.freedesktop.systemd1.Swap.IOWriteBytes
+org.freedesktop.systemd1.Swap.IOWriteIOPSMax
+org.freedesktop.systemd1.Swap.IOWriteOperations
+org.freedesktop.systemd1.Swap.IPAccounting
+org.freedesktop.systemd1.Swap.IPAddressAllow
+org.freedesktop.systemd1.Swap.IPAddressDeny
+org.freedesktop.systemd1.Swap.IPCNamespacePath
+org.freedesktop.systemd1.Swap.IPEgressBytes
+org.freedesktop.systemd1.Swap.IPEgressFilterPath
+org.freedesktop.systemd1.Swap.IPEgressPackets
+org.freedesktop.systemd1.Swap.IPIngressBytes
+org.freedesktop.systemd1.Swap.IPIngressFilterPath
+org.freedesktop.systemd1.Swap.IPIngressPackets
+org.freedesktop.systemd1.Swap.IgnoreSIGPIPE
+org.freedesktop.systemd1.Swap.InaccessiblePaths
+org.freedesktop.systemd1.Swap.KeyringMode
+org.freedesktop.systemd1.Swap.KillMode
+org.freedesktop.systemd1.Swap.KillSignal
+org.freedesktop.systemd1.Swap.LimitAS
+org.freedesktop.systemd1.Swap.LimitASSoft
+org.freedesktop.systemd1.Swap.LimitCORE
+org.freedesktop.systemd1.Swap.LimitCORESoft
+org.freedesktop.systemd1.Swap.LimitCPU
+org.freedesktop.systemd1.Swap.LimitCPUSoft
+org.freedesktop.systemd1.Swap.LimitDATA
+org.freedesktop.systemd1.Swap.LimitDATASoft
+org.freedesktop.systemd1.Swap.LimitFSIZE
+org.freedesktop.systemd1.Swap.LimitFSIZESoft
+org.freedesktop.systemd1.Swap.LimitLOCKS
+org.freedesktop.systemd1.Swap.LimitLOCKSSoft
+org.freedesktop.systemd1.Swap.LimitMEMLOCK
+org.freedesktop.systemd1.Swap.LimitMEMLOCKSoft
+org.freedesktop.systemd1.Swap.LimitMSGQUEUE
+org.freedesktop.systemd1.Swap.LimitMSGQUEUESoft
+org.freedesktop.systemd1.Swap.LimitNICE
+org.freedesktop.systemd1.Swap.LimitNICESoft
+org.freedesktop.systemd1.Swap.LimitNOFILE
+org.freedesktop.systemd1.Swap.LimitNOFILESoft
+org.freedesktop.systemd1.Swap.LimitNPROC
+org.freedesktop.systemd1.Swap.LimitNPROCSoft
+org.freedesktop.systemd1.Swap.LimitRSS
+org.freedesktop.systemd1.Swap.LimitRSSSoft
+org.freedesktop.systemd1.Swap.LimitRTPRIO
+org.freedesktop.systemd1.Swap.LimitRTPRIOSoft
+org.freedesktop.systemd1.Swap.LimitRTTIME
+org.freedesktop.systemd1.Swap.LimitRTTIMESoft
+org.freedesktop.systemd1.Swap.LimitSIGPENDING
+org.freedesktop.systemd1.Swap.LimitSIGPENDINGSoft
+org.freedesktop.systemd1.Swap.LimitSTACK
+org.freedesktop.systemd1.Swap.LimitSTACKSoft
+org.freedesktop.systemd1.Swap.LoadCredential
+org.freedesktop.systemd1.Swap.LoadCredentialEncrypted
+org.freedesktop.systemd1.Swap.LockPersonality
+org.freedesktop.systemd1.Swap.LogExtraFields
+org.freedesktop.systemd1.Swap.LogLevelMax
+org.freedesktop.systemd1.Swap.LogNamespace
+org.freedesktop.systemd1.Swap.LogRateLimitBurst
+org.freedesktop.systemd1.Swap.LogRateLimitIntervalUSec
+org.freedesktop.systemd1.Swap.LogsDirectory
+org.freedesktop.systemd1.Swap.LogsDirectoryMode
+org.freedesktop.systemd1.Swap.LogsDirectorySymlink
+org.freedesktop.systemd1.Swap.ManagedOOMMemoryPressure
+org.freedesktop.systemd1.Swap.ManagedOOMMemoryPressureLimit
+org.freedesktop.systemd1.Swap.ManagedOOMPreference
+org.freedesktop.systemd1.Swap.ManagedOOMSwap
+org.freedesktop.systemd1.Swap.MemoryAccounting
+org.freedesktop.systemd1.Swap.MemoryAvailable
+org.freedesktop.systemd1.Swap.MemoryCurrent
+org.freedesktop.systemd1.Swap.MemoryDenyWriteExecute
+org.freedesktop.systemd1.Swap.MemoryHigh
+org.freedesktop.systemd1.Swap.MemoryLimit
+org.freedesktop.systemd1.Swap.MemoryLow
+org.freedesktop.systemd1.Swap.MemoryMax
+org.freedesktop.systemd1.Swap.MemoryMin
+org.freedesktop.systemd1.Swap.MemorySwapMax
+org.freedesktop.systemd1.Swap.MountAPIVFS
+org.freedesktop.systemd1.Swap.MountFlags
+org.freedesktop.systemd1.Swap.MountImages
+org.freedesktop.systemd1.Swap.NUMAMask
+org.freedesktop.systemd1.Swap.NUMAPolicy
+org.freedesktop.systemd1.Swap.NetworkNamespacePath
+org.freedesktop.systemd1.Swap.Nice
+org.freedesktop.systemd1.Swap.NoExecPaths
+org.freedesktop.systemd1.Swap.NoNewPrivileges
+org.freedesktop.systemd1.Swap.NonBlocking
+org.freedesktop.systemd1.Swap.OOMScoreAdjust
+org.freedesktop.systemd1.Swap.Options
+org.freedesktop.systemd1.Swap.PAMName
+org.freedesktop.systemd1.Swap.PassEnvironment
+org.freedesktop.systemd1.Swap.Personality
+org.freedesktop.systemd1.Swap.Priority
+org.freedesktop.systemd1.Swap.PrivateDevices
+org.freedesktop.systemd1.Swap.PrivateIPC
+org.freedesktop.systemd1.Swap.PrivateMounts
+org.freedesktop.systemd1.Swap.PrivateNetwork
+org.freedesktop.systemd1.Swap.PrivateTmp
+org.freedesktop.systemd1.Swap.PrivateUsers
+org.freedesktop.systemd1.Swap.ProcSubset
+org.freedesktop.systemd1.Swap.ProtectClock
+org.freedesktop.systemd1.Swap.ProtectControlGroups
+org.freedesktop.systemd1.Swap.ProtectHome
+org.freedesktop.systemd1.Swap.ProtectHostname
+org.freedesktop.systemd1.Swap.ProtectKernelLogs
+org.freedesktop.systemd1.Swap.ProtectKernelModules
+org.freedesktop.systemd1.Swap.ProtectKernelTunables
+org.freedesktop.systemd1.Swap.ProtectProc
+org.freedesktop.systemd1.Swap.ProtectSystem
+org.freedesktop.systemd1.Swap.ReadOnlyPaths
+org.freedesktop.systemd1.Swap.ReadWritePaths
+org.freedesktop.systemd1.Swap.RemoveIPC
+org.freedesktop.systemd1.Swap.RestartKillSignal
+org.freedesktop.systemd1.Swap.RestrictAddressFamilies
+org.freedesktop.systemd1.Swap.RestrictFileSystems
+org.freedesktop.systemd1.Swap.RestrictNamespaces
+org.freedesktop.systemd1.Swap.RestrictNetworkInterfaces
+org.freedesktop.systemd1.Swap.RestrictRealtime
+org.freedesktop.systemd1.Swap.RestrictSUIDSGID
+org.freedesktop.systemd1.Swap.Result
+org.freedesktop.systemd1.Swap.RootDirectory
+org.freedesktop.systemd1.Swap.RootHash
+org.freedesktop.systemd1.Swap.RootHashPath
+org.freedesktop.systemd1.Swap.RootHashSignature
+org.freedesktop.systemd1.Swap.RootHashSignaturePath
+org.freedesktop.systemd1.Swap.RootImage
+org.freedesktop.systemd1.Swap.RootImageOptions
+org.freedesktop.systemd1.Swap.RootVerity
+org.freedesktop.systemd1.Swap.RuntimeDirectory
+org.freedesktop.systemd1.Swap.RuntimeDirectoryMode
+org.freedesktop.systemd1.Swap.RuntimeDirectoryPreserve
+org.freedesktop.systemd1.Swap.RuntimeDirectorySymlink
+org.freedesktop.systemd1.Swap.SELinuxContext
+org.freedesktop.systemd1.Swap.SameProcessGroup
+org.freedesktop.systemd1.Swap.SecureBits
+org.freedesktop.systemd1.Swap.SendSIGHUP
+org.freedesktop.systemd1.Swap.SendSIGKILL
+org.freedesktop.systemd1.Swap.SetCredential
+org.freedesktop.systemd1.Swap.SetCredentialEncrypted
+org.freedesktop.systemd1.Swap.Slice
+org.freedesktop.systemd1.Swap.SmackProcessLabel
+org.freedesktop.systemd1.Swap.SocketBindAllow
+org.freedesktop.systemd1.Swap.SocketBindDeny
+org.freedesktop.systemd1.Swap.StandardError
+org.freedesktop.systemd1.Swap.StandardErrorFileDescriptorName
+org.freedesktop.systemd1.Swap.StandardInput
+org.freedesktop.systemd1.Swap.StandardInputData
+org.freedesktop.systemd1.Swap.StandardInputFileDescriptorName
+org.freedesktop.systemd1.Swap.StandardOutput
+org.freedesktop.systemd1.Swap.StandardOutputFileDescriptorName
+org.freedesktop.systemd1.Swap.StartupAllowedCPUs
+org.freedesktop.systemd1.Swap.StartupAllowedMemoryNodes
+org.freedesktop.systemd1.Swap.StartupBlockIOWeight
+org.freedesktop.systemd1.Swap.StartupCPUShares
+org.freedesktop.systemd1.Swap.StartupCPUWeight
+org.freedesktop.systemd1.Swap.StartupIOWeight
+org.freedesktop.systemd1.Swap.StateDirectory
+org.freedesktop.systemd1.Swap.StateDirectoryMode
+org.freedesktop.systemd1.Swap.StateDirectorySymlink
+org.freedesktop.systemd1.Swap.SupplementaryGroups
+org.freedesktop.systemd1.Swap.SyslogFacility
+org.freedesktop.systemd1.Swap.SyslogIdentifier
+org.freedesktop.systemd1.Swap.SyslogLevel
+org.freedesktop.systemd1.Swap.SyslogLevelPrefix
+org.freedesktop.systemd1.Swap.SyslogPriority
+org.freedesktop.systemd1.Swap.SystemCallArchitectures
+org.freedesktop.systemd1.Swap.SystemCallErrorNumber
+org.freedesktop.systemd1.Swap.SystemCallFilter
+org.freedesktop.systemd1.Swap.SystemCallLog
+org.freedesktop.systemd1.Swap.TTYColumns
+org.freedesktop.systemd1.Swap.TTYPath
+org.freedesktop.systemd1.Swap.TTYReset
+org.freedesktop.systemd1.Swap.TTYRows
+org.freedesktop.systemd1.Swap.TTYVHangup
+org.freedesktop.systemd1.Swap.TTYVTDisallocate
+org.freedesktop.systemd1.Swap.TasksAccounting
+org.freedesktop.systemd1.Swap.TasksCurrent
+org.freedesktop.systemd1.Swap.TasksMax
+org.freedesktop.systemd1.Swap.TemporaryFileSystem
+org.freedesktop.systemd1.Swap.TimeoutCleanUSec
+org.freedesktop.systemd1.Swap.TimeoutUSec
+org.freedesktop.systemd1.Swap.TimerSlackNSec
+org.freedesktop.systemd1.Swap.UID
+org.freedesktop.systemd1.Swap.UMask
+org.freedesktop.systemd1.Swap.UnsetEnvironment
+org.freedesktop.systemd1.Swap.User
+org.freedesktop.systemd1.Swap.UtmpIdentifier
+org.freedesktop.systemd1.Swap.UtmpMode
+org.freedesktop.systemd1.Swap.WatchdogSignal
+org.freedesktop.systemd1.Swap.What
+org.freedesktop.systemd1.Swap.WorkingDirectory
+org.freedesktop.systemd1.Timer.AccuracyUSec
+org.freedesktop.systemd1.Timer.FixedRandomDelay
+org.freedesktop.systemd1.Timer.LastTriggerUSec
+org.freedesktop.systemd1.Timer.LastTriggerUSecMonotonic
+org.freedesktop.systemd1.Timer.NextElapseUSecMonotonic
+org.freedesktop.systemd1.Timer.NextElapseUSecRealtime
+org.freedesktop.systemd1.Timer.OnClockChange
+org.freedesktop.systemd1.Timer.OnTimezoneChange
+org.freedesktop.systemd1.Timer.Persistent
+org.freedesktop.systemd1.Timer.RandomizedDelayUSec
+org.freedesktop.systemd1.Timer.RemainAfterElapse
+org.freedesktop.systemd1.Timer.Result
+org.freedesktop.systemd1.Timer.TimersCalendar
+org.freedesktop.systemd1.Timer.TimersMonotonic
+org.freedesktop.systemd1.Timer.Unit
+org.freedesktop.systemd1.Timer.WakeSystem
+org.freedesktop.systemd1.Unit.ActiveEnterTimestamp
+org.freedesktop.systemd1.Unit.ActiveEnterTimestampMonotonic
+org.freedesktop.systemd1.Unit.ActiveExitTimestamp
+org.freedesktop.systemd1.Unit.ActiveExitTimestampMonotonic
+org.freedesktop.systemd1.Unit.ActiveState
+org.freedesktop.systemd1.Unit.After
+org.freedesktop.systemd1.Unit.AllowIsolate
+org.freedesktop.systemd1.Unit.AssertResult
+org.freedesktop.systemd1.Unit.AssertTimestamp
+org.freedesktop.systemd1.Unit.AssertTimestampMonotonic
+org.freedesktop.systemd1.Unit.Asserts
+org.freedesktop.systemd1.Unit.Before
+org.freedesktop.systemd1.Unit.BindsTo
+org.freedesktop.systemd1.Unit.BoundBy
+org.freedesktop.systemd1.Unit.CanClean
+org.freedesktop.systemd1.Unit.CanFreeze
+org.freedesktop.systemd1.Unit.CanIsolate
+org.freedesktop.systemd1.Unit.CanReload
+org.freedesktop.systemd1.Unit.CanStart
+org.freedesktop.systemd1.Unit.CanStop
+org.freedesktop.systemd1.Unit.Clean()
+org.freedesktop.systemd1.Unit.CollectMode
+org.freedesktop.systemd1.Unit.ConditionResult
+org.freedesktop.systemd1.Unit.ConditionTimestamp
+org.freedesktop.systemd1.Unit.ConditionTimestampMonotonic
+org.freedesktop.systemd1.Unit.Conditions
+org.freedesktop.systemd1.Unit.ConflictedBy
+org.freedesktop.systemd1.Unit.Conflicts
+org.freedesktop.systemd1.Unit.ConsistsOf
+org.freedesktop.systemd1.Unit.DefaultDependencies
+org.freedesktop.systemd1.Unit.Description
+org.freedesktop.systemd1.Unit.Documentation
+org.freedesktop.systemd1.Unit.DropInPaths
+org.freedesktop.systemd1.Unit.EnqueueJob()
+org.freedesktop.systemd1.Unit.FailureAction
+org.freedesktop.systemd1.Unit.FailureActionExitStatus
+org.freedesktop.systemd1.Unit.Following
+org.freedesktop.systemd1.Unit.FragmentPath
+org.freedesktop.systemd1.Unit.Freeze()
+org.freedesktop.systemd1.Unit.FreezerState
+org.freedesktop.systemd1.Unit.Id
+org.freedesktop.systemd1.Unit.IgnoreOnIsolate
+org.freedesktop.systemd1.Unit.InactiveEnterTimestamp
+org.freedesktop.systemd1.Unit.InactiveEnterTimestampMonotonic
+org.freedesktop.systemd1.Unit.InactiveExitTimestamp
+org.freedesktop.systemd1.Unit.InactiveExitTimestampMonotonic
+org.freedesktop.systemd1.Unit.InvocationID
+org.freedesktop.systemd1.Unit.Job
+org.freedesktop.systemd1.Unit.JobRunningTimeoutUSec
+org.freedesktop.systemd1.Unit.JobTimeoutAction
+org.freedesktop.systemd1.Unit.JobTimeoutRebootArgument
+org.freedesktop.systemd1.Unit.JobTimeoutUSec
+org.freedesktop.systemd1.Unit.JoinsNamespaceOf
+org.freedesktop.systemd1.Unit.Kill()
+org.freedesktop.systemd1.Unit.LoadError
+org.freedesktop.systemd1.Unit.LoadState
+org.freedesktop.systemd1.Unit.Markers
+org.freedesktop.systemd1.Unit.Names
+org.freedesktop.systemd1.Unit.NeedDaemonReload
+org.freedesktop.systemd1.Unit.OnFailure
+org.freedesktop.systemd1.Unit.OnFailureJobMode
+org.freedesktop.systemd1.Unit.OnFailureOf
+org.freedesktop.systemd1.Unit.OnSuccess
+org.freedesktop.systemd1.Unit.OnSuccessJobMode
+org.freedesktop.systemd1.Unit.OnSuccessOf
+org.freedesktop.systemd1.Unit.PartOf
+org.freedesktop.systemd1.Unit.Perpetual
+org.freedesktop.systemd1.Unit.PropagatesReloadTo
+org.freedesktop.systemd1.Unit.PropagatesStopTo
+org.freedesktop.systemd1.Unit.RebootArgument
+org.freedesktop.systemd1.Unit.Ref()
+org.freedesktop.systemd1.Unit.Refs
+org.freedesktop.systemd1.Unit.RefuseManualStart
+org.freedesktop.systemd1.Unit.RefuseManualStop
+org.freedesktop.systemd1.Unit.Reload()
+org.freedesktop.systemd1.Unit.ReloadOrRestart()
+org.freedesktop.systemd1.Unit.ReloadOrTryRestart()
+org.freedesktop.systemd1.Unit.ReloadPropagatedFrom
+org.freedesktop.systemd1.Unit.RequiredBy
+org.freedesktop.systemd1.Unit.Requires
+org.freedesktop.systemd1.Unit.RequiresMountsFor
+org.freedesktop.systemd1.Unit.Requisite
+org.freedesktop.systemd1.Unit.RequisiteOf
+org.freedesktop.systemd1.Unit.ResetFailed()
+org.freedesktop.systemd1.Unit.Restart()
+org.freedesktop.systemd1.Unit.SetProperties()
+org.freedesktop.systemd1.Unit.SliceOf
+org.freedesktop.systemd1.Unit.SourcePath
+org.freedesktop.systemd1.Unit.Start()
+org.freedesktop.systemd1.Unit.StartLimitAction
+org.freedesktop.systemd1.Unit.StartLimitBurst
+org.freedesktop.systemd1.Unit.StartLimitIntervalUSec
+org.freedesktop.systemd1.Unit.StateChangeTimestamp
+org.freedesktop.systemd1.Unit.StateChangeTimestampMonotonic
+org.freedesktop.systemd1.Unit.Stop()
+org.freedesktop.systemd1.Unit.StopPropagatedFrom
+org.freedesktop.systemd1.Unit.StopWhenUnneeded
+org.freedesktop.systemd1.Unit.SubState
+org.freedesktop.systemd1.Unit.SuccessAction
+org.freedesktop.systemd1.Unit.SuccessActionExitStatus
+org.freedesktop.systemd1.Unit.Thaw()
+org.freedesktop.systemd1.Unit.Transient
+org.freedesktop.systemd1.Unit.TriggeredBy
+org.freedesktop.systemd1.Unit.Triggers
+org.freedesktop.systemd1.Unit.TryRestart()
+org.freedesktop.systemd1.Unit.UnitFilePreset
+org.freedesktop.systemd1.Unit.UnitFileState
+org.freedesktop.systemd1.Unit.Unref()
+org.freedesktop.systemd1.Unit.WantedBy
+org.freedesktop.systemd1.Unit.Wants
+org.freedesktop.timedate1.CanNTP
+org.freedesktop.timedate1.ListTimezones()
+org.freedesktop.timedate1.LocalRTC
+org.freedesktop.timedate1.NTP
+org.freedesktop.timedate1.NTPSynchronized
+org.freedesktop.timedate1.RTCTimeUSec
+org.freedesktop.timedate1.SetLocalRTC()
+org.freedesktop.timedate1.SetNTP()
+org.freedesktop.timedate1.SetTime()
+org.freedesktop.timedate1.SetTimezone()
+org.freedesktop.timedate1.TimeUSec
+org.freedesktop.timedate1.Timezone
diff --git a/tools/debug-sd-boot.sh b/tools/debug-sd-boot.sh
new file mode 100755
index 0000000..0420dbd
--- /dev/null
+++ b/tools/debug-sd-boot.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -e
+
+if [[ $# -lt 2 ]]; then
+ echo "Usage: ${0} TARGET INPUT [GDBSCRIPT]"
+ echo "Debug systemd-boot/stub in QEMU."
+ echo
+ echo "TARGET should point to the EFI binary to be examined inside the"
+ echo "build directory (systemd-boot\$ARCH.efi or linux\$arch.efi.stub)."
+ echo
+ echo "INPUT should point to the QEMU serial output pipe. This is used to"
+ echo "extract the location of the symbols. For this to work, QEMU must"
+ echo "be run with '-s -serial pipe:PATH'. Note that QEMU will append"
+ echo ".in/.out to the path, while this script expects the out pipe directly."
+ echo
+ echo "If GDBSCRIPT is empty, gdb is run directly attached to the boot"
+ echo "loader, otherwise a script is generated in the given path that allows"
+ echo "attaching manually like this:"
+ echo " (gdb) source GDBSCRIPT"
+ echo " (gdb) target remote :1234"
+ echo
+ echo "Example usage:"
+ echo " mkfifo /tmp/sdboot.{in,out}"
+ echo " qemu-system-x86_64 [...] -s -serial pipe:/tmp/sdboot"
+ echo " ./tools/debug-sd-boot.sh ./build/src/boot/efi/systemd-bootx64.efi \\"
+ echo " /tmp/sdboot.out"
+ exit 1
+fi
+
+binary=$(realpath "${1}")
+if [[ "${1}" =~ systemd-boot([[:alnum:]]+).efi ]]; then
+ target="systemd-boot"
+ symbols=$(realpath "${1%efi}elf")
+elif [[ "${1}" =~ linux([[:alnum:]]+).efi.stub ]]; then
+ target="systemd-stub"
+ symbols=$(realpath "${1%efi.stub}elf.stub")
+else
+ echo "Cannot detect EFI binary '${1}'."
+ exit 1
+fi
+
+case "${BASH_REMATCH[1]}" in
+ ia32) arch="i386";;
+ x64) arch="i386:x86-64";;
+ aa64) arch="aarch64";;
+ arm|riscv64) arch="${BASH_REMATCH[1]}";;
+ *)
+ echo "Unknown EFI arch '${BASH_REMATCH[1]}'."
+ exit 1
+esac
+
+# system-boot/stub will print out a line like this to inform us where it was loaded:
+# systemd-boot@0xC0DE
+while read -r line; do
+ if [[ "${line}" =~ ${target}@(0x[[:xdigit:]]+) ]]; then
+ loaded_base="${BASH_REMATCH[1]}"
+ break
+ fi
+done <"${2}"
+
+if [[ -z "${loaded_base}" ]]; then
+ echo "Could not determine loaded image base."
+ exit 1
+fi
+
+if [[ -z "${3}" ]]; then
+ gdb_script=$(mktemp /tmp/debug-sd-boot.XXXXXX.gdb)
+ trap 'rm -f "${gdb_script}"' EXIT
+else
+ gdb_script="${3}"
+fi
+
+cat >"${gdb_script}" <<EOF
+file ${binary}
+symbol-file ${symbols} -o ${loaded_base}
+set architecture ${arch}
+EOF
+
+if [[ -z "${3}" ]]; then
+ gdb -x "${gdb_script}" -ex "target remote :1234"
+else
+ echo "GDB script written to '${gdb_script}'."
+fi
diff --git a/tools/dump-auxv.py b/tools/dump-auxv.py
new file mode 100644
index 0000000..d6dbcb1
--- /dev/null
+++ b/tools/dump-auxv.py
@@ -0,0 +1,141 @@
+#!/usr/bin/python
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Note: the no-value-for-parameter here is expected, as the click module
+# decorators modify function arguments which pylint doesn't know
+# pylint: disable=no-value-for-parameter
+
+"""
+A program to parse auxv (e.g. /proc/self/auxv).
+
+By default, current arch is assumed, but options can be used to override the
+endianness and word size.
+"""
+
+import struct
+
+import click
+
+# From /usr/include/elf.h
+AT_AUXV = {
+ 'AT_NULL' : 0, # End of vector
+ 'AT_IGNORE' : 1, # Entry should be ignored
+ 'AT_EXECFD' : 2, # File descriptor of program
+ 'AT_PHDR' : 3, # Program headers for program
+ 'AT_PHENT' : 4, # Size of program header entry
+ 'AT_PHNUM' : 5, # Number of program headers
+ 'AT_PAGESZ' : 6, # System page size
+ 'AT_BASE' : 7, # Base address of interpreter
+ 'AT_FLAGS' : 8, # Flags
+ 'AT_ENTRY' : 9, # Entry point of program
+ 'AT_NOTELF' : 10, # Program is not ELF
+ 'AT_UID' : 11, # Real uid
+ 'AT_EUID' : 12, # Effective uid
+ 'AT_GID' : 13, # Real gid
+ 'AT_EGID' : 14, # Effective gid
+ 'AT_CLKTCK' : 17, # Frequency of times()
+
+ # Some more special a_type values describing the hardware.
+ 'AT_PLATFORM' : 15, # String identifying platform.
+ 'AT_HWCAP' : 16, # Machine-dependent hints about processor capabilities.
+
+ # This entry gives some information about the FPU initialization performed by the kernel.
+ 'AT_FPUCW' : 18, # Used FPU control word.
+
+ # Cache block sizes.
+ 'AT_DCACHEBSIZE' : 19, # Data cache block size.
+ 'AT_ICACHEBSIZE' : 20, # Instruction cache block size.
+ 'AT_UCACHEBSIZE' : 21, # Unified cache block size.
+
+ # A special ignored value for PPC, used by the kernel to control the
+ # interpretation of the AUXV. Must be > 16.
+ 'AT_IGNOREPPC' : 22, # Entry should be ignored.
+
+ 'AT_SECURE' : 23, # Boolean, was exec setuid-like?
+
+ 'AT_BASE_PLATFORM' : 24, # String identifying real platforms.
+
+ 'AT_RANDOM' : 25, # Address of 16 random bytes.
+
+ 'AT_HWCAP2' : 26, # More machine-dependent hints about processor capabilities.
+
+ 'AT_EXECFN' : 31, # Filename of executable.
+
+ # Pointer to the global system page used for system calls and other nice things.
+ 'AT_SYSINFO' : 32,
+ 'AT_SYSINFO_EHDR' : 33,
+
+ # Shapes of the caches. Bits 0-3 contains associativity; bits 4-7 contains
+ # log2 of line size; mask those to get cache size.
+ 'AT_L1I_CACHESHAPE' : 34,
+ 'AT_L1D_CACHESHAPE' : 35,
+ 'AT_L2_CACHESHAPE' : 36,
+ 'AT_L3_CACHESHAPE' : 37,
+
+ # Shapes of the caches, with more room to describe them.
+ # GEOMETRY are comprised of cache line size in bytes in the bottom 16 bits
+ # and the cache associativity in the next 16 bits.
+ 'AT_L1I_CACHESIZE' : 40,
+ 'AT_L1I_CACHEGEOMETRY' : 41,
+ 'AT_L1D_CACHESIZE' : 42,
+ 'AT_L1D_CACHEGEOMETRY' : 43,
+ 'AT_L2_CACHESIZE' : 44,
+ 'AT_L2_CACHEGEOMETRY' : 45,
+ 'AT_L3_CACHESIZE' : 46,
+ 'AT_L3_CACHEGEOMETRY' : 47,
+
+ 'AT_MINSIGSTKSZ' : 51, # Stack needed for signal delivery
+}
+AT_AUXV_NAMES = {v:k for k,v in AT_AUXV.items()}
+
+@click.command(help=__doc__)
+@click.option('-b', '--big-endian', 'endian',
+ flag_value='>',
+ help='Input is big-endian')
+@click.option('-l', '--little-endian', 'endian',
+ flag_value='<',
+ help='Input is little-endian')
+@click.option('-3', '--32', 'field_width',
+ flag_value=32,
+ help='Input is 32-bit')
+@click.option('-6', '--64', 'field_width',
+ flag_value=64,
+ help='Input is 64-bit')
+@click.argument('file',
+ type=click.File(mode='rb'))
+def dump(endian, field_width, file):
+ data = file.read()
+
+ if field_width is None:
+ field_width = struct.calcsize('P') * 8
+ if endian is None:
+ endian = '@'
+
+ width = {32:'II', 64:'QQ'}[field_width]
+
+ format_str = f'{endian}{width}'
+ print(f'# {format_str=}')
+
+ seen_null = False
+
+ for item in struct.iter_unpack(format_str, data):
+ key, val = item
+ name = AT_AUXV_NAMES.get(key, f'unknown ({key})')
+ if name.endswith(('UID', 'GID')):
+ pref, fmt = '', 'd'
+ else:
+ pref, fmt = '0x', 'x'
+
+ if seen_null:
+ print('# trailing garbage after AT_NULL')
+
+ print(f'{name:18} = {pref}{val:{fmt}}')
+
+ if name == 'AT_NULL':
+ seen_null = True
+
+ if not seen_null:
+ print('# array not terminated with AT_NULL')
+
+if __name__ == '__main__':
+ dump()
diff --git a/tools/elf2efi.py b/tools/elf2efi.py
new file mode 100755
index 0000000..54f64fa
--- /dev/null
+++ b/tools/elf2efi.py
@@ -0,0 +1,699 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Convert ELF static PIE to PE/EFI image.
+
+# To do so we simply copy desired ELF sections while preserving their memory layout to ensure that
+# code still runs as expected. We then translate ELF relocations to PE relocations so that the EFI
+# loader/firmware can properly load the binary to any address at runtime.
+#
+# To make this as painless as possible we only operate on static PIEs as they should only contain
+# base relocations that are easy to handle as they have a one-to-one mapping to PE relocations.
+#
+# EDK2 does a similar process using their GenFw tool. The main difference is that they use the
+# --emit-relocs linker flag, which emits a lot of different (static) ELF relocation types that have
+# to be handled differently for each architecture and is overall more work than its worth.
+#
+# Note that on arches where binutils has PE support (x86/x86_64 mostly, aarch64 only recently)
+# objcopy can be used to convert ELF to PE. But this will still not convert ELF relocations, making
+# the resulting binary useless. gnu-efi relies on this method and contains a stub that performs the
+# ELF dynamic relocations at runtime.
+
+# pylint: disable=attribute-defined-outside-init
+
+import argparse
+import hashlib
+import io
+import os
+import pathlib
+import time
+import typing
+from ctypes import (
+ c_char,
+ c_uint8,
+ c_uint16,
+ c_uint32,
+ c_uint64,
+ LittleEndianStructure,
+ sizeof,
+)
+
+from elftools.elf.constants import SH_FLAGS
+from elftools.elf.elffile import ELFFile
+from elftools.elf.enums import (
+ ENUM_DT_FLAGS_1,
+ ENUM_RELOC_TYPE_AARCH64,
+ ENUM_RELOC_TYPE_ARM,
+ ENUM_RELOC_TYPE_i386,
+ ENUM_RELOC_TYPE_x64,
+)
+from elftools.elf.relocation import (
+ Relocation as ElfRelocation,
+ RelocationTable as ElfRelocationTable,
+)
+
+
+class PeCoffHeader(LittleEndianStructure):
+ _fields_ = (
+ ("Machine", c_uint16),
+ ("NumberOfSections", c_uint16),
+ ("TimeDateStamp", c_uint32),
+ ("PointerToSymbolTable", c_uint32),
+ ("NumberOfSymbols", c_uint32),
+ ("SizeOfOptionalHeader", c_uint16),
+ ("Characteristics", c_uint16),
+ )
+
+
+class PeDataDirectory(LittleEndianStructure):
+ _fields_ = (
+ ("VirtualAddress", c_uint32),
+ ("Size", c_uint32),
+ )
+
+
+class PeRelocationBlock(LittleEndianStructure):
+ _fields_ = (
+ ("PageRVA", c_uint32),
+ ("BlockSize", c_uint32),
+ )
+
+ def __init__(self, PageRVA: int):
+ super().__init__(PageRVA)
+ self.entries: typing.List[PeRelocationEntry] = []
+
+
+class PeRelocationEntry(LittleEndianStructure):
+ _fields_ = (
+ ("Offset", c_uint16, 12),
+ ("Type", c_uint16, 4),
+ )
+
+
+class PeOptionalHeaderStart(LittleEndianStructure):
+ _fields_ = (
+ ("Magic", c_uint16),
+ ("MajorLinkerVersion", c_uint8),
+ ("MinorLinkerVersion", c_uint8),
+ ("SizeOfCode", c_uint32),
+ ("SizeOfInitializedData", c_uint32),
+ ("SizeOfUninitializedData", c_uint32),
+ ("AddressOfEntryPoint", c_uint32),
+ ("BaseOfCode", c_uint32),
+ )
+
+
+class PeOptionalHeaderMiddle(LittleEndianStructure):
+ _fields_ = (
+ ("SectionAlignment", c_uint32),
+ ("FileAlignment", c_uint32),
+ ("MajorOperatingSystemVersion", c_uint16),
+ ("MinorOperatingSystemVersion", c_uint16),
+ ("MajorImageVersion", c_uint16),
+ ("MinorImageVersion", c_uint16),
+ ("MajorSubsystemVersion", c_uint16),
+ ("MinorSubsystemVersion", c_uint16),
+ ("Win32VersionValue", c_uint32),
+ ("SizeOfImage", c_uint32),
+ ("SizeOfHeaders", c_uint32),
+ ("CheckSum", c_uint32),
+ ("Subsystem", c_uint16),
+ ("DllCharacteristics", c_uint16),
+ )
+
+
+class PeOptionalHeaderEnd(LittleEndianStructure):
+ _fields_ = (
+ ("LoaderFlags", c_uint32),
+ ("NumberOfRvaAndSizes", c_uint32),
+ ("ExportTable", PeDataDirectory),
+ ("ImportTable", PeDataDirectory),
+ ("ResourceTable", PeDataDirectory),
+ ("ExceptionTable", PeDataDirectory),
+ ("CertificateTable", PeDataDirectory),
+ ("BaseRelocationTable", PeDataDirectory),
+ ("Debug", PeDataDirectory),
+ ("Architecture", PeDataDirectory),
+ ("GlobalPtr", PeDataDirectory),
+ ("TLSTable", PeDataDirectory),
+ ("LoadConfigTable", PeDataDirectory),
+ ("BoundImport", PeDataDirectory),
+ ("IAT", PeDataDirectory),
+ ("DelayImportDescriptor", PeDataDirectory),
+ ("CLRRuntimeHeader", PeDataDirectory),
+ ("Reserved", PeDataDirectory),
+ )
+
+
+class PeOptionalHeader(LittleEndianStructure):
+ pass
+
+
+class PeOptionalHeader32(PeOptionalHeader):
+ _anonymous_ = ("Start", "Middle", "End")
+ _fields_ = (
+ ("Start", PeOptionalHeaderStart),
+ ("BaseOfData", c_uint32),
+ ("ImageBase", c_uint32),
+ ("Middle", PeOptionalHeaderMiddle),
+ ("SizeOfStackReserve", c_uint32),
+ ("SizeOfStackCommit", c_uint32),
+ ("SizeOfHeapReserve", c_uint32),
+ ("SizeOfHeapCommit", c_uint32),
+ ("End", PeOptionalHeaderEnd),
+ )
+
+
+class PeOptionalHeader32Plus(PeOptionalHeader):
+ _anonymous_ = ("Start", "Middle", "End")
+ _fields_ = (
+ ("Start", PeOptionalHeaderStart),
+ ("ImageBase", c_uint64),
+ ("Middle", PeOptionalHeaderMiddle),
+ ("SizeOfStackReserve", c_uint64),
+ ("SizeOfStackCommit", c_uint64),
+ ("SizeOfHeapReserve", c_uint64),
+ ("SizeOfHeapCommit", c_uint64),
+ ("End", PeOptionalHeaderEnd),
+ )
+
+
+class PeSection(LittleEndianStructure):
+ _fields_ = (
+ ("Name", c_char * 8),
+ ("VirtualSize", c_uint32),
+ ("VirtualAddress", c_uint32),
+ ("SizeOfRawData", c_uint32),
+ ("PointerToRawData", c_uint32),
+ ("PointerToRelocations", c_uint32),
+ ("PointerToLinenumbers", c_uint32),
+ ("NumberOfRelocations", c_uint16),
+ ("NumberOfLinenumbers", c_uint16),
+ ("Characteristics", c_uint32),
+ )
+
+ def __init__(self):
+ super().__init__()
+ self.data = bytearray()
+
+
+N_DATA_DIRECTORY_ENTRIES = 16
+
+assert sizeof(PeSection) == 40
+assert sizeof(PeCoffHeader) == 20
+assert sizeof(PeOptionalHeader32) == 224
+assert sizeof(PeOptionalHeader32Plus) == 240
+
+PE_CHARACTERISTICS_RX = 0x60000020 # CNT_CODE|MEM_READ|MEM_EXECUTE
+PE_CHARACTERISTICS_RW = 0xC0000040 # CNT_INITIALIZED_DATA|MEM_READ|MEM_WRITE
+PE_CHARACTERISTICS_R = 0x40000040 # CNT_INITIALIZED_DATA|MEM_READ
+
+IGNORE_SECTIONS = [
+ ".eh_frame",
+ ".eh_frame_hdr",
+ ".ARM.exidx",
+]
+
+IGNORE_SECTION_TYPES = [
+ "SHT_DYNAMIC",
+ "SHT_DYNSYM",
+ "SHT_GNU_ATTRIBUTES",
+ "SHT_GNU_HASH",
+ "SHT_HASH",
+ "SHT_NOTE",
+ "SHT_REL",
+ "SHT_RELA",
+ "SHT_RELR",
+ "SHT_STRTAB",
+ "SHT_SYMTAB",
+]
+
+# EFI mandates 4KiB memory pages.
+SECTION_ALIGNMENT = 4096
+FILE_ALIGNMENT = 512
+
+# Nobody cares about DOS headers, so put the PE header right after.
+PE_OFFSET = 64
+PE_MAGIC = b"PE\0\0"
+
+
+def align_to(x: int, align: int) -> int:
+ return (x + align - 1) & ~(align - 1)
+
+
+def align_down(x: int, align: int) -> int:
+ return x & ~(align - 1)
+
+
+def next_section_address(sections: typing.List[PeSection]) -> int:
+ return align_to(
+ sections[-1].VirtualAddress + sections[-1].VirtualSize, SECTION_ALIGNMENT
+ )
+
+
+def iter_copy_sections(elf: ELFFile) -> typing.Iterator[PeSection]:
+ pe_s = None
+
+ # This is essentially the same as copying by ELF load segments, except that we assemble them
+ # manually, so that we can easily strip unwanted sections. We try to only discard things we know
+ # about so that there are no surprises.
+
+ relro = None
+ for elf_seg in elf.iter_segments():
+ if elf_seg["p_type"] == "PT_LOAD" and elf_seg["p_align"] != SECTION_ALIGNMENT:
+ raise RuntimeError("ELF segments are not properly aligned.")
+ elif elf_seg["p_type"] == "PT_GNU_RELRO":
+ relro = elf_seg
+
+ for elf_s in elf.iter_sections():
+ if (
+ elf_s["sh_flags"] & SH_FLAGS.SHF_ALLOC == 0
+ or elf_s["sh_type"] in IGNORE_SECTION_TYPES
+ or elf_s.name in IGNORE_SECTIONS
+ ):
+ continue
+ if elf_s["sh_type"] not in ["SHT_PROGBITS", "SHT_NOBITS"]:
+ raise RuntimeError(f"Unknown section {elf_s.name}.")
+
+ if elf_s["sh_flags"] & SH_FLAGS.SHF_EXECINSTR:
+ rwx = PE_CHARACTERISTICS_RX
+ elif elf_s["sh_flags"] & SH_FLAGS.SHF_WRITE:
+ rwx = PE_CHARACTERISTICS_RW
+ else:
+ rwx = PE_CHARACTERISTICS_R
+
+ # PE images are always relro.
+ if relro and relro.section_in_segment(elf_s):
+ rwx = PE_CHARACTERISTICS_R
+
+ if pe_s and pe_s.Characteristics != rwx:
+ yield pe_s
+ pe_s = None
+
+ if pe_s:
+ # Insert padding to properly align the section.
+ pad_len = elf_s["sh_addr"] - pe_s.VirtualAddress - len(pe_s.data)
+ pe_s.data += bytearray(pad_len) + elf_s.data()
+ else:
+ pe_s = PeSection()
+ pe_s.VirtualAddress = elf_s["sh_addr"]
+ pe_s.Characteristics = rwx
+ pe_s.data = elf_s.data()
+
+ if pe_s:
+ yield pe_s
+
+
+def convert_sections(elf: ELFFile, opt: PeOptionalHeader) -> typing.List[PeSection]:
+ last_vma = 0
+ sections = []
+
+ for pe_s in iter_copy_sections(elf):
+ # Truncate the VMA to the nearest page and insert appropriate padding. This should not
+ # cause any overlap as this is pretty much how ELF *segments* are loaded/mmapped anyways.
+ # The ELF sections inside should also be properly aligned as we reuse the ELF VMA layout
+ # for the PE image.
+ vma = pe_s.VirtualAddress
+ pe_s.VirtualAddress = align_down(vma, SECTION_ALIGNMENT)
+ pe_s.data = bytearray(vma - pe_s.VirtualAddress) + pe_s.data
+
+ pe_s.VirtualSize = len(pe_s.data)
+ pe_s.SizeOfRawData = align_to(len(pe_s.data), FILE_ALIGNMENT)
+ pe_s.Name = {
+ PE_CHARACTERISTICS_RX: b".text",
+ PE_CHARACTERISTICS_RW: b".data",
+ PE_CHARACTERISTICS_R: b".rodata",
+ }[pe_s.Characteristics]
+
+ # This can happen if not building with `-z separate-code`.
+ if pe_s.VirtualAddress < last_vma:
+ raise RuntimeError("Overlapping PE sections.")
+ last_vma = pe_s.VirtualAddress + pe_s.VirtualSize
+
+ if pe_s.Name == b".text":
+ opt.BaseOfCode = pe_s.VirtualAddress
+ opt.SizeOfCode += pe_s.VirtualSize
+ else:
+ opt.SizeOfInitializedData += pe_s.VirtualSize
+
+ if pe_s.Name == b".data" and isinstance(opt, PeOptionalHeader32):
+ opt.BaseOfData = pe_s.VirtualAddress
+
+ sections.append(pe_s)
+
+ return sections
+
+
+def copy_sections(
+ elf: ELFFile,
+ opt: PeOptionalHeader,
+ input_names: str,
+ sections: typing.List[PeSection],
+):
+ for name in input_names.split(","):
+ elf_s = elf.get_section_by_name(name)
+ if not elf_s:
+ continue
+ if elf_s.data_alignment > 1 and SECTION_ALIGNMENT % elf_s.data_alignment != 0:
+ raise RuntimeError(f"ELF section {name} is not aligned.")
+ if elf_s["sh_flags"] & (SH_FLAGS.SHF_EXECINSTR | SH_FLAGS.SHF_WRITE) != 0:
+ raise RuntimeError(f"ELF section {name} is not read-only data.")
+
+ pe_s = PeSection()
+ pe_s.Name = name.encode()
+ pe_s.data = elf_s.data()
+ pe_s.VirtualAddress = next_section_address(sections)
+ pe_s.VirtualSize = len(elf_s.data())
+ pe_s.SizeOfRawData = align_to(len(elf_s.data()), FILE_ALIGNMENT)
+ pe_s.Characteristics = PE_CHARACTERISTICS_R
+ opt.SizeOfInitializedData += pe_s.VirtualSize
+ sections.append(pe_s)
+
+
+def apply_elf_relative_relocation(
+ reloc: ElfRelocation,
+ image_base: int,
+ sections: typing.List[PeSection],
+ addend_size: int,
+):
+ # fmt: off
+ [target] = [
+ pe_s for pe_s in sections
+ if pe_s.VirtualAddress <= reloc["r_offset"] < pe_s.VirtualAddress + len(pe_s.data)
+ ]
+ # fmt: on
+
+ addend_offset = reloc["r_offset"] - target.VirtualAddress
+
+ if reloc.is_RELA():
+ addend = reloc["r_addend"]
+ else:
+ addend = target.data[addend_offset : addend_offset + addend_size]
+ addend = int.from_bytes(addend, byteorder="little")
+
+ value = (image_base + addend).to_bytes(addend_size, byteorder="little")
+ target.data[addend_offset : addend_offset + addend_size] = value
+
+
+def convert_elf_reloc_table(
+ elf: ELFFile,
+ elf_reloc_table: ElfRelocationTable,
+ elf_image_base: int,
+ sections: typing.List[PeSection],
+ pe_reloc_blocks: typing.Dict[int, PeRelocationBlock],
+):
+ NONE_RELOC = {
+ "EM_386": ENUM_RELOC_TYPE_i386["R_386_NONE"],
+ "EM_AARCH64": ENUM_RELOC_TYPE_AARCH64["R_AARCH64_NONE"],
+ "EM_ARM": ENUM_RELOC_TYPE_ARM["R_ARM_NONE"],
+ "EM_LOONGARCH": 0,
+ "EM_RISCV": 0,
+ "EM_X86_64": ENUM_RELOC_TYPE_x64["R_X86_64_NONE"],
+ }[elf["e_machine"]]
+
+ RELATIVE_RELOC = {
+ "EM_386": ENUM_RELOC_TYPE_i386["R_386_RELATIVE"],
+ "EM_AARCH64": ENUM_RELOC_TYPE_AARCH64["R_AARCH64_RELATIVE"],
+ "EM_ARM": ENUM_RELOC_TYPE_ARM["R_ARM_RELATIVE"],
+ "EM_LOONGARCH": 3,
+ "EM_RISCV": 3,
+ "EM_X86_64": ENUM_RELOC_TYPE_x64["R_X86_64_RELATIVE"],
+ }[elf["e_machine"]]
+
+ for reloc in elf_reloc_table.iter_relocations():
+ if reloc["r_info_type"] == NONE_RELOC:
+ continue
+
+ if reloc["r_info_type"] == RELATIVE_RELOC:
+ apply_elf_relative_relocation(
+ reloc, elf_image_base, sections, elf.elfclass // 8
+ )
+
+ # Now that the ELF relocation has been applied, we can create a PE relocation.
+ block_rva = reloc["r_offset"] & ~0xFFF
+ if block_rva not in pe_reloc_blocks:
+ pe_reloc_blocks[block_rva] = PeRelocationBlock(block_rva)
+
+ entry = PeRelocationEntry()
+ entry.Offset = reloc["r_offset"] & 0xFFF
+ # REL_BASED_HIGHLOW or REL_BASED_DIR64
+ entry.Type = 3 if elf.elfclass == 32 else 10
+ pe_reloc_blocks[block_rva].entries.append(entry)
+
+ continue
+
+ raise RuntimeError(f"Unsupported relocation {reloc}")
+
+
+def convert_elf_relocations(
+ elf: ELFFile,
+ opt: PeOptionalHeader,
+ sections: typing.List[PeSection],
+ minimum_sections: int,
+) -> typing.Optional[PeSection]:
+ dynamic = elf.get_section_by_name(".dynamic")
+ if dynamic is None:
+ raise RuntimeError("ELF .dynamic section is missing.")
+
+ [flags_tag] = dynamic.iter_tags("DT_FLAGS_1")
+ if not flags_tag["d_val"] & ENUM_DT_FLAGS_1["DF_1_PIE"]:
+ raise RuntimeError("ELF file is not a PIE.")
+
+ # This checks that the ELF image base is 0.
+ symtab = elf.get_section_by_name(".symtab")
+ if symtab:
+ exe_start = symtab.get_symbol_by_name("__executable_start")
+ if exe_start and exe_start[0]["st_value"] != 0:
+ raise RuntimeError("Unexpected ELF image base.")
+
+ opt.SizeOfHeaders = align_to(
+ PE_OFFSET
+ + len(PE_MAGIC)
+ + sizeof(PeCoffHeader)
+ + sizeof(opt)
+ + sizeof(PeSection) * max(len(sections) + 1, minimum_sections),
+ FILE_ALIGNMENT,
+ )
+
+ # We use the basic VMA layout from the ELF image in the PE image. This could cause the first
+ # section to overlap the PE image headers during runtime at VMA 0. We can simply apply a fixed
+ # offset relative to the PE image base when applying/converting ELF relocations. Afterwards we
+ # just have to apply the offset to the PE addresses so that the PE relocations work correctly on
+ # the ELF portions of the image.
+ segment_offset = 0
+ if sections[0].VirtualAddress < opt.SizeOfHeaders:
+ segment_offset = align_to(
+ opt.SizeOfHeaders - sections[0].VirtualAddress, SECTION_ALIGNMENT
+ )
+
+ opt.AddressOfEntryPoint = elf["e_entry"] + segment_offset
+ opt.BaseOfCode += segment_offset
+ if isinstance(opt, PeOptionalHeader32):
+ opt.BaseOfData += segment_offset
+
+ pe_reloc_blocks: typing.Dict[int, PeRelocationBlock] = {}
+ for reloc_type, reloc_table in dynamic.get_relocation_tables().items():
+ if reloc_type not in ["REL", "RELA"]:
+ raise RuntimeError("Unsupported relocation type {elf_reloc_type}.")
+ convert_elf_reloc_table(
+ elf, reloc_table, opt.ImageBase + segment_offset, sections, pe_reloc_blocks
+ )
+
+ for pe_s in sections:
+ pe_s.VirtualAddress += segment_offset
+
+ if len(pe_reloc_blocks) == 0:
+ return None
+
+ data = bytearray()
+ for rva in sorted(pe_reloc_blocks):
+ block = pe_reloc_blocks[rva]
+ n_relocs = len(block.entries)
+
+ # Each block must start on a 32-bit boundary. Because each entry is 16 bits
+ # the len has to be even. We pad by adding a none relocation.
+ if n_relocs % 2 != 0:
+ n_relocs += 1
+ block.entries.append(PeRelocationEntry())
+
+ block.PageRVA += segment_offset
+ block.BlockSize = (
+ sizeof(PeRelocationBlock) + sizeof(PeRelocationEntry) * n_relocs
+ )
+ data += block
+ for entry in sorted(block.entries, key=lambda e: e.Offset):
+ data += entry
+
+ pe_reloc_s = PeSection()
+ pe_reloc_s.Name = b".reloc"
+ pe_reloc_s.data = data
+ pe_reloc_s.VirtualAddress = next_section_address(sections)
+ pe_reloc_s.VirtualSize = len(data)
+ pe_reloc_s.SizeOfRawData = align_to(len(data), FILE_ALIGNMENT)
+ # CNT_INITIALIZED_DATA|MEM_READ|MEM_DISCARDABLE
+ pe_reloc_s.Characteristics = 0x42000040
+
+ sections.append(pe_reloc_s)
+ opt.SizeOfInitializedData += pe_reloc_s.VirtualSize
+ return pe_reloc_s
+
+
+def write_pe(
+ file, coff: PeCoffHeader, opt: PeOptionalHeader, sections: typing.List[PeSection]
+):
+ file.write(b"MZ")
+ file.seek(0x3C, io.SEEK_SET)
+ file.write(PE_OFFSET.to_bytes(2, byteorder="little"))
+ file.seek(PE_OFFSET, io.SEEK_SET)
+ file.write(PE_MAGIC)
+ file.write(coff)
+ file.write(opt)
+
+ offset = opt.SizeOfHeaders
+ for pe_s in sorted(sections, key=lambda s: s.VirtualAddress):
+ if pe_s.VirtualAddress < opt.SizeOfHeaders:
+ # Linker script should make sure this does not happen.
+ raise RuntimeError(f"Section {pe_s.Name} overlapping PE headers.")
+
+ pe_s.PointerToRawData = offset
+ file.write(pe_s)
+ offset = align_to(offset + len(pe_s.data), FILE_ALIGNMENT)
+
+ assert file.tell() <= opt.SizeOfHeaders
+
+ for pe_s in sections:
+ file.seek(pe_s.PointerToRawData, io.SEEK_SET)
+ file.write(pe_s.data)
+
+ file.truncate(offset)
+
+
+def elf2efi(args: argparse.Namespace):
+ elf = ELFFile(args.ELF)
+ if not elf.little_endian:
+ raise RuntimeError("ELF file is not little-endian.")
+ if elf["e_type"] not in ["ET_DYN", "ET_EXEC"]:
+ raise RuntimeError("Unsupported ELF type.")
+
+ pe_arch = {
+ "EM_386": 0x014C,
+ "EM_AARCH64": 0xAA64,
+ "EM_ARM": 0x01C2,
+ "EM_LOONGARCH": 0x6232 if elf.elfclass == 32 else 0x6264,
+ "EM_RISCV": 0x5032 if elf.elfclass == 32 else 0x5064,
+ "EM_X86_64": 0x8664,
+ }.get(elf["e_machine"])
+ if pe_arch is None:
+ raise RuntimeError(f"Unsupported ELF arch {elf['e_machine']}")
+
+ coff = PeCoffHeader()
+ opt = PeOptionalHeader32() if elf.elfclass == 32 else PeOptionalHeader32Plus()
+
+ # We relocate to a unique image base to reduce the chances for runtime relocation to occur.
+ base_name = pathlib.Path(args.PE.name).name.encode()
+ opt.ImageBase = int(hashlib.sha1(base_name).hexdigest()[0:8], 16)
+ if elf.elfclass == 32:
+ opt.ImageBase = (0x400000 + opt.ImageBase) & 0xFFFF0000
+ else:
+ opt.ImageBase = (0x100000000 + opt.ImageBase) & 0x1FFFF0000
+
+ sections = convert_sections(elf, opt)
+ copy_sections(elf, opt, args.copy_sections, sections)
+ pe_reloc_s = convert_elf_relocations(elf, opt, sections, args.minimum_sections)
+
+ coff.Machine = pe_arch
+ coff.NumberOfSections = len(sections)
+ coff.TimeDateStamp = int(os.environ.get("SOURCE_DATE_EPOCH", time.time()))
+ coff.SizeOfOptionalHeader = sizeof(opt)
+ # EXECUTABLE_IMAGE|LINE_NUMS_STRIPPED|LOCAL_SYMS_STRIPPED|DEBUG_STRIPPED
+ # and (32BIT_MACHINE or LARGE_ADDRESS_AWARE)
+ coff.Characteristics = 0x30E if elf.elfclass == 32 else 0x22E
+
+ opt.SectionAlignment = SECTION_ALIGNMENT
+ opt.FileAlignment = FILE_ALIGNMENT
+ opt.MajorImageVersion = args.version_major
+ opt.MinorImageVersion = args.version_minor
+ opt.MajorSubsystemVersion = args.efi_major
+ opt.MinorSubsystemVersion = args.efi_minor
+ opt.Subsystem = args.subsystem
+ opt.Magic = 0x10B if elf.elfclass == 32 else 0x20B
+ opt.SizeOfImage = next_section_address(sections)
+
+ # DYNAMIC_BASE|NX_COMPAT|HIGH_ENTROPY_VA or DYNAMIC_BASE|NX_COMPAT
+ opt.DllCharacteristics = 0x160 if elf.elfclass == 64 else 0x140
+
+ # These values are taken from a natively built PE binary (although, unused by EDK2/EFI).
+ opt.SizeOfStackReserve = 0x100000
+ opt.SizeOfStackCommit = 0x001000
+ opt.SizeOfHeapReserve = 0x100000
+ opt.SizeOfHeapCommit = 0x001000
+
+ opt.NumberOfRvaAndSizes = N_DATA_DIRECTORY_ENTRIES
+ if pe_reloc_s:
+ opt.BaseRelocationTable = PeDataDirectory(
+ pe_reloc_s.VirtualAddress, pe_reloc_s.VirtualSize
+ )
+
+ write_pe(args.PE, coff, opt, sections)
+
+
+def main():
+ parser = argparse.ArgumentParser(description="Convert ELF binaries to PE/EFI")
+ parser.add_argument(
+ "--version-major",
+ type=int,
+ default=0,
+ help="Major image version of EFI image",
+ )
+ parser.add_argument(
+ "--version-minor",
+ type=int,
+ default=0,
+ help="Minor image version of EFI image",
+ )
+ parser.add_argument(
+ "--efi-major",
+ type=int,
+ default=0,
+ help="Minimum major EFI subsystem version",
+ )
+ parser.add_argument(
+ "--efi-minor",
+ type=int,
+ default=0,
+ help="Minimum minor EFI subsystem version",
+ )
+ parser.add_argument(
+ "--subsystem",
+ type=int,
+ default=10,
+ help="PE subsystem",
+ )
+ parser.add_argument(
+ "ELF",
+ type=argparse.FileType("rb"),
+ help="Input ELF file",
+ )
+ parser.add_argument(
+ "PE",
+ type=argparse.FileType("wb"),
+ help="Output PE/EFI file",
+ )
+ parser.add_argument(
+ "--minimum-sections",
+ type=int,
+ default=0,
+ help="Minimum number of sections to leave space for",
+ )
+ parser.add_argument(
+ "--copy-sections",
+ type=str,
+ default="",
+ help="Copy these sections if found",
+ )
+
+ elf2efi(parser.parse_args())
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/find-build-dir.sh b/tools/find-build-dir.sh
new file mode 100755
index 0000000..79a79fc
--- /dev/null
+++ b/tools/find-build-dir.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+
+# Try to guess the build directory:
+# we look for subdirectories of the parent directory that look like ninja build dirs.
+
+if [ -n "${BUILD_DIR:=}" ]; then
+ realpath "$BUILD_DIR"
+ exit 0
+fi
+
+root="$(dirname "$(realpath "$0")")"
+
+found=
+for i in "$root"/../*/build.ninja; do
+ c="$(dirname "$i")"
+ [ -d "$c" ] || continue
+ [ "$(basename "$c")" != mkosi.builddir ] || continue
+
+ if [ -n "$found" ]; then
+ echo "Found multiple candidates, specify build directory with \$BUILD_DIR" >&2
+ exit 2
+ fi
+ found="$c"
+done
+
+if [ -z "$found" ]; then
+ echo "Specify build directory with \$BUILD_DIR" >&2
+ exit 1
+fi
+
+realpath "$found"
diff --git a/tools/find-double-newline.sh b/tools/find-double-newline.sh
new file mode 100755
index 0000000..2999a58
--- /dev/null
+++ b/tools/find-double-newline.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -eu
+
+TOP="$(git rev-parse --show-toplevel)"
+
+case "${1:-}" in
+ recdiff)
+ if [ "${2:-}" = "" ] ; then
+ DIR="$TOP"
+ else
+ DIR="$2"
+ fi
+
+ find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \;
+ ;;
+
+ recpatch)
+ if [ "${2:-}" = "" ] ; then
+ DIR="$TOP"
+ else
+ DIR="$2"
+ fi
+
+ find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \;
+ ;;
+
+ diff)
+ T="$(mktemp)"
+ sed '/^$/N;/^\n$/D' <"${2:?}" >"$T"
+ diff -u "$2" "$T"
+ rm -f "$T"
+ ;;
+
+ patch)
+ sed -i '/^$/N;/^\n$/D' "${2:?}"
+ ;;
+
+ *)
+ echo "Expected recdiff|recpatch|diff|patch as verb." >&2
+ ;;
+esac
diff --git a/tools/find-tabs.sh b/tools/find-tabs.sh
new file mode 100755
index 0000000..6cea339
--- /dev/null
+++ b/tools/find-tabs.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -eu
+
+TOP="$(git rev-parse --show-toplevel)"
+
+case "${1:-}" in
+ recdiff)
+ if [ "${2:-}" = "" ] ; then
+ DIR="$TOP"
+ else
+ DIR="$2"
+ fi
+
+ find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \;
+ ;;
+
+ recpatch)
+ if [ "${2:-}" = "" ] ; then
+ DIR="$TOP"
+ else
+ DIR="$2"
+ fi
+
+ find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \;
+ ;;
+
+ diff)
+ T="$(mktemp)"
+ sed 's/\t/ /g' <"${2:?}" >"$T"
+ diff -u "$2" "$T"
+ rm -f "$T"
+ ;;
+
+ patch)
+ sed -i 's/\t/ /g' "${2:?}"
+ ;;
+
+ *)
+ echo "Expected recdiff|recpatch|diff|patch as verb." >&2
+ ;;
+esac
diff --git a/tools/function_ignorelist b/tools/function_ignorelist
new file mode 100644
index 0000000..d29479d
--- /dev/null
+++ b/tools/function_ignorelist
@@ -0,0 +1,34 @@
+sd_booted
+sd_get_seats
+sd_get_sessions
+sd_get_uids
+sd_is_fifo
+sd_is_socket
+sd_is_socket_inet
+sd_is_socket_unix
+sd_is_mq
+sd_listen_fds
+sd_login_monitor_new
+sd_login_monitor_unref
+sd_login_monitor_flush
+sd_login_monitor_get_fd
+sd_notify
+sd_notifyf
+sd_pid_get_session
+sd_pid_get_unit
+sd_pid_get_owner_uid
+sd_readahead
+sd_seat_get_active
+sd_seat_get_sessions
+sd_seat_can_multi_session
+sd_session_is_active
+sd_session_get_uid
+sd_session_get_seat
+sd_session_get_service
+sd_session_get_type
+sd_session_get_class
+sd_session_get_display
+sd_uid_get_state
+sd_uid_is_on_seat
+sd_uid_get_sessions
+sd_uid_get_seats
diff --git a/tools/gdb-sd_dump_hashmaps.py b/tools/gdb-sd_dump_hashmaps.py
new file mode 100644
index 0000000..57f825a
--- /dev/null
+++ b/tools/gdb-sd_dump_hashmaps.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# pylint: disable=consider-using-f-string
+
+import gdb
+
+class sd_dump_hashmaps(gdb.Command):
+ "dump systemd's hashmaps"
+
+ def __init__(self):
+ super().__init__("sd_dump_hashmaps", gdb.COMMAND_DATA, gdb.COMPLETE_NONE)
+
+ def invoke(self, arg, _from_tty):
+ d = gdb.parse_and_eval("hashmap_debug_list")
+ hashmap_type_info = gdb.parse_and_eval("hashmap_type_info")
+ uchar_t = gdb.lookup_type("unsigned char")
+ ulong_t = gdb.lookup_type("unsigned long")
+ debug_offset = gdb.parse_and_eval("(unsigned long)&((HashmapBase*)0)->debug")
+
+ print("type, hash, indirect, entries, max_entries, buckets, creator")
+ while d:
+ h = gdb.parse_and_eval(f"(HashmapBase*)((char*){int(d.cast(ulong_t))} - {debug_offset})")
+
+ if h["has_indirect"]:
+ storage_ptr = h["indirect"]["storage"].cast(uchar_t.pointer())
+ n_entries = h["indirect"]["n_entries"]
+ n_buckets = h["indirect"]["n_buckets"]
+ else:
+ storage_ptr = h["direct"]["storage"].cast(uchar_t.pointer())
+ n_entries = h["n_direct_entries"]
+ n_buckets = hashmap_type_info[h["type"]]["n_direct_buckets"]
+
+ t = ["plain", "ordered", "set"][int(h["type"])]
+
+ print(f'{t}, {h["hash_ops"]}, {bool(h["has_indirect"])}, {n_entries}, {d["max_entries"]}, {n_buckets}, {d["func"].string()}, {d["file"].string()}:{d["line"]}')
+
+ if arg != "" and n_entries > 0:
+ dib_raw_addr = storage_ptr + hashmap_type_info[h["type"]]["entry_size"] * n_buckets
+
+ histogram = {}
+ for i in range(0, n_buckets):
+ dib = int(dib_raw_addr[i])
+ histogram[dib] = histogram.get(dib, 0) + 1
+
+ for dib in sorted(histogram):
+ if dib != 255:
+ print(f"{dib:>3} {histogram[dib]:>8} {float(histogram[dib]/n_entries):.0%} of entries")
+ else:
+ print(f"{dib:>3} {histogram[dib]:>8} {float(histogram[dib]/n_buckets):.0%} of slots")
+ s = sum(dib*count for (dib, count) in histogram.items() if dib != 255) / n_entries
+ print(f"mean DIB of entries: {s}")
+
+ blocks = []
+ current_len = 1
+ prev = int(dib_raw_addr[0])
+ for i in range(1, n_buckets):
+ dib = int(dib_raw_addr[i])
+ if (dib == 255) != (prev == 255):
+ if prev != 255:
+ blocks += [[i, current_len]]
+ current_len = 1
+ else:
+ current_len += 1
+
+ prev = dib
+ if prev != 255:
+ blocks += [[i, current_len]]
+ # a block may be wrapped around
+ if len(blocks) > 1 and blocks[0][0] == blocks[0][1] and blocks[-1][0] == n_buckets - 1:
+ blocks[0][1] += blocks[-1][1]
+ blocks = blocks[0:-1]
+ print("max block: {}".format(max(blocks, key=lambda a: a[1])))
+ print("sum block lens: {}".format(sum(b[1] for b in blocks)))
+ print("mean block len: {}".format(sum(b[1] for b in blocks) / len(blocks)))
+
+ d = d["debug_list_next"]
+
+sd_dump_hashmaps()
diff --git a/tools/generate-gperfs.py b/tools/generate-gperfs.py
new file mode 100755
index 0000000..3887bb6
--- /dev/null
+++ b/tools/generate-gperfs.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# pylint: disable=unbalanced-tuple-unpacking,consider-using-f-string,consider-using-with
+
+"""
+Generate %-from-name.gperf from %-list.txt
+"""
+
+import sys
+
+if __name__ == '__main__':
+ if len(sys.argv) != 4:
+ sys.exit(f'Usage: {sys.argv[0]} name prefix file')
+
+ name, prefix, file = sys.argv[1:]
+
+ print("""\
+%{
+#if __GNUC__ >= 7
+_Pragma("GCC diagnostic ignored \\"-Wimplicit-fallthrough\\"")
+#endif
+%}""")
+ print(f"""\
+struct {name}_name {{ const char* name; int id; }};
+%null-strings
+%%""")
+
+ for line in open(file):
+ print("{0}, {1}{0}".format(line.rstrip(), prefix))
diff --git a/tools/git-contrib.sh b/tools/git-contrib.sh
new file mode 100755
index 0000000..6371d49
--- /dev/null
+++ b/tools/git-contrib.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+
+tag="$(git describe --abbrev=0 --match 'v[0-9][0-9][0-9]')"
+(
+ # authors
+ git log --pretty=tformat:%aN -s "${tag}.."
+ # Co-authors (drop empty line and mail addresses)
+ git log --pretty='tformat:%(trailers:key=Co-authored-by,valueonly)' -s "${tag}.." | sed -e '/^[[:space:]]*$/ d' | sed -e 's/ <.*@.*>$//'
+) |
+ grep -v noreply@weblate.org |
+ sed 's/ / /g; s/--/-/g; s/.*/\0,/' |
+ sort -u | tr '\n' ' ' | sed -e "s/^/Contributions from: /g" -e "s/,\s*$/\n/g" | fold -w 72 -s |
+ sed -e "s/^/ /g" -e "s/\s*$//g"
diff --git a/tools/list-discoverable-partitions.py b/tools/list-discoverable-partitions.py
new file mode 100644
index 0000000..a19bf1d
--- /dev/null
+++ b/tools/list-discoverable-partitions.py
@@ -0,0 +1,193 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import re
+import sys
+import uuid
+
+HEADER = '''\
+| Name | Partition Type UUID | Allowed File Systems | Explanation |
+|------|---------------------|----------------------|-------------|
+'''
+
+ARCHITECTURES = {
+ 'ALPHA': 'Alpha',
+ 'ARC': 'ARC',
+ 'ARM': '32-bit ARM',
+ 'ARM64': '64-bit ARM/AArch64',
+ 'IA64': 'Itanium/IA-64',
+ 'LOONGARCH64': 'LoongArch 64-bit',
+ 'MIPS_LE': '32-bit MIPS LittleEndian (mipsel)',
+ 'MIPS64_LE': '64-bit MIPS LittleEndian (mips64el)',
+ 'PARISC': 'HPPA/PARISC',
+ 'PPC': '32-bit PowerPC',
+ 'PPC64': '64-bit PowerPC BigEndian',
+ 'PPC64_LE': '64-bit PowerPC LittleEndian',
+ 'RISCV32': 'RISC-V 32-bit',
+ 'RISCV64': 'RISC-V 64-bit',
+ 'S390': 's390',
+ 'S390X': 's390x',
+ 'TILEGX': 'TILE-Gx',
+ 'X86': 'x86',
+ 'X86_64': 'amd64/x86_64',
+}
+
+TYPES = {
+ 'ROOT' : 'Root Partition',
+ 'ROOT_VERITY' : 'Root Verity Partition',
+ 'ROOT_VERITY_SIG' : 'Root Verity Signature Partition',
+ 'USR' : '`/usr/` Partition',
+ 'USR_VERITY' : '`/usr/` Verity Partition',
+ 'USR_VERITY_SIG' : '`/usr/` Verity Signature Partition',
+
+ 'ESP': 'EFI System Partition',
+ 'SRV': 'Server Data Partition',
+ 'VAR': 'Variable Data Partition',
+ 'TMP': 'Temporary Data Partition',
+ 'SWAP': 'Swap',
+ 'HOME': 'Home Partition',
+ 'USER_HOME': 'Per-user Home Partition',
+ 'LINUX_GENERIC': 'Generic Linux Data Partition',
+ 'XBOOTLDR': 'Extended Boot Loader Partition',
+}
+
+DESCRIPTIONS = {
+ 'ROOT': (
+ 'Any native, optionally in LUKS',
+ 'On systems with matching architecture, the first partition with this type UUID on the disk '
+ 'containing the active EFI ESP is automatically mounted to the root directory `/`. '
+ 'If the partition is encrypted with LUKS or has dm-verity integrity data (see below), the '
+ 'device mapper file will be named `/dev/mapper/root`.'),
+ 'USR': (
+ 'Any native, optionally in LUKS',
+ 'Similar semantics to root partition, but just the `/usr/` partition.'),
+ 'ROOT_VERITY': (
+ 'A dm-verity superblock followed by hash data',
+ 'Contains dm-verity integrity hash data for the matching root partition. If this feature is '
+ 'used the partition UUID of the root partition should be the first 128 bits of the root hash '
+ 'of the dm-verity hash data, and the partition UUID of this dm-verity partition should be the '
+ 'final 128 bits of it, so that the root partition and its Verity partition can be discovered '
+ 'easily, simply by specifying the root hash.'),
+ 'USR_VERITY': (
+ 'A dm-verity superblock followed by hash data',
+ 'Similar semantics to root Verity partition, but just for the `/usr/` partition.'),
+ 'ROOT_VERITY_SIG': (
+ 'A serialized JSON object, see below',
+ 'Contains a root hash and a PKCS#7 signature for it, permitting signed dm-verity GPT images.'),
+ 'USR_VERITY_SIG': (
+ 'A serialized JSON object, see below',
+ 'Similar semantics to root Verity signature partition, but just for the `/usr/` partition.'),
+
+ 'ESP': (
+ 'VFAT',
+ 'The ESP used for the current boot is automatically mounted to `/efi/` (or `/boot/` as '
+ 'fallback), unless a different partition is mounted there (possibly via `/etc/fstab`, or '
+ 'because the Extended Boot Loader Partition — see below — exists) or the directory is '
+ 'non-empty on the root disk. This partition type is defined by the '
+ '[UEFI Specification](http://www.uefi.org/specifications).'),
+ 'XBOOTLDR': (
+ 'Typically VFAT',
+ 'The Extended Boot Loader Partition (XBOOTLDR) used for the current boot is automatically '
+ 'mounted to `/boot/`, unless a different partition is mounted there (possibly via '
+ '`/etc/fstab`) or the directory is non-empty on the root disk. This partition type '
+ 'is defined by the [Boot Loader '
+ 'Specification](https://uapi-group.org/specifications/specs/boot_loader_specification).'),
+ 'SWAP': (
+ 'Swap, optionally in LUKS',
+ 'All swap partitions on the disk containing the root partition are automatically enabled. '
+ 'If the partition is encrypted with LUKS, the device mapper file will be named '
+ '`/dev/mapper/swap`. This partition type predates the Discoverable Partitions Specification.'),
+ 'HOME': (
+ 'Any native, optionally in LUKS',
+ 'The first partition with this type UUID on the disk containing the root partition is '
+ 'automatically mounted to `/home/`. If the partition is encrypted with LUKS, the device '
+ 'mapper file will be named `/dev/mapper/home`.'),
+ 'SRV': (
+ 'Any native, optionally in LUKS',
+ 'The first partition with this type UUID on the disk containing the root partition is '
+ 'automatically mounted to `/srv/`. If the partition is encrypted with LUKS, the device '
+ 'mapper file will be named `/dev/mapper/srv`.'),
+ 'VAR': (
+ 'Any native, optionally in LUKS',
+ 'The first partition with this type UUID on the disk containing the root partition is '
+ 'automatically mounted to `/var/` — under the condition that its partition UUID matches '
+ 'the first 128 bits of `HMAC-SHA256(machine-id, 0x4d21b016b53445c2a9fb5c16e091fd2d)` '
+ '(i.e. the SHA256 HMAC hash of the binary type UUID keyed by the machine ID as read from '
+ '[`/etc/machine-id`](https://www.freedesktop.org/software/systemd/man/machine-id.html). '
+ 'This special requirement is made because `/var/` (unlike the other partition types '
+ 'listed here) is inherently private to a specific installation and cannot possibly be '
+ 'shared between multiple OS installations on the same disk, and thus should be bound to '
+ 'a specific instance of the OS, identified by its machine ID. If the partition is '
+ 'encrypted with LUKS, the device mapper file will be named `/dev/mapper/var`.'),
+ 'TMP': (
+ 'Any native, optionally in LUKS',
+ 'The first partition with this type UUID on the disk containing the root partition is '
+ 'automatically mounted to `/var/tmp/`. If the partition is encrypted with LUKS, the '
+ 'device mapper file will be named `/dev/mapper/tmp`. Note that the intended mount point '
+ 'is indeed `/var/tmp/`, not `/tmp/`. The latter is typically maintained in memory via '
+ '`tmpfs` and does not require a partition on disk. In some cases it might be '
+ 'desirable to make `/tmp/` persistent too, in which case it is recommended to make it '
+ 'a symlink or bind mount to `/var/tmp/`, thus not requiring its own partition type UUID.'),
+ 'USER_HOME': (
+ 'Any native, optionally in LUKS',
+ 'A home partition of a user, managed by '
+ '[`systemd-homed`](https://www.freedesktop.org/software/systemd/man/systemd-homed.html).'),
+ 'LINUX_GENERIC': (
+ 'Any native, optionally in LUKS',
+ 'No automatic mounting takes place for other Linux data partitions. This partition type '
+ 'should be used for all partitions that carry Linux file systems. The installer needs '
+ 'to mount them explicitly via entries in `/etc/fstab`. Optionally, these partitions may '
+ 'be encrypted with LUKS. This partition type predates the Discoverable Partitions Specification.'),
+}
+
+def extract(file):
+ for line in file:
+ # print(line)
+ m = re.match(r'^#define\s+SD_GPT_(.*SD_ID128_MAKE\(.*\))', line)
+ if not m:
+ continue
+
+ name = line.split()[1]
+ if m2 := re.match(r'^(ROOT|USR)_([A-Z0-9]+|X86_64|PPC64_LE|MIPS_LE|MIPS64_LE)(|_VERITY|_VERITY_SIG)\s+SD_ID128_MAKE\((.*)\)', m.group(1)):
+ ptype, arch, suffix, u = m2.groups()
+ u = uuid.UUID(u.replace(',', ''))
+ assert arch in ARCHITECTURES, f'{arch} not in f{ARCHITECTURES}'
+ ptype = f'{type}{suffix}'
+ assert ptype in TYPES
+
+ yield name, ptype, arch, u
+
+ elif m2 := re.match(r'(\w+)\s+SD_ID128_MAKE\((.*)\)', m.group(1)):
+ ptype, u = m2.groups()
+ u = uuid.UUID(u.replace(',', ''))
+ yield name, ptype, None, u
+
+ else:
+ raise ValueError(f'Failed to match: {m.group(1)}')
+
+def generate(defines):
+ prevtype = None
+
+ print(HEADER, end='')
+
+ uuids = set()
+
+ for name, ptype, arch, puuid in defines:
+ tdesc = TYPES[ptype]
+ adesc = '' if arch is None else f' ({ARCHITECTURES[arch]})'
+
+ # Let's make sure that we didn't select&paste the same value twice
+ assert puuid not in uuids
+ uuids.add(puuid)
+
+ if ptype != prevtype:
+ prevtype = ptype
+ morea, moreb = DESCRIPTIONS[ptype]
+ else:
+ morea = moreb = 'ditto'
+
+ print(f'| _{tdesc}{adesc}_ | `{puuid}` `{name}` | {morea} | {moreb} |')
+
+if __name__ == '__main__':
+ known = extract(sys.stdin)
+ generate(known)
diff --git a/tools/make-autosuspend-rules.py b/tools/make-autosuspend-rules.py
new file mode 100755
index 0000000..b1b4cef
--- /dev/null
+++ b/tools/make-autosuspend-rules.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Generate autosuspend rules for devices that have been tested to work properly
+# with autosuspend by the Chromium OS team. Based on
+# https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py
+
+import chromiumos.gen_autosuspend_rules
+
+print('# pci:v<00VENDOR>d<00DEVICE> (8 uppercase hexadecimal digits twice)')
+for entry in chromiumos.gen_autosuspend_rules.PCI_IDS:
+ vendor, device = entry.split(':')
+ vendor = int(vendor, 16)
+ device = int(device, 16)
+ print(f'pci:v{vendor:08X}d{device:08X}*')
+
+print('# usb:v<VEND>p<PROD> (4 uppercase hexadecimal digits twice)')
+for entry in chromiumos.gen_autosuspend_rules.USB_IDS:
+ vendor, product = entry.split(':')
+ vendor = int(vendor, 16)
+ product = int(product, 16)
+ print(f'usb:v{vendor:04X}p{product:04X}*')
+
+print(' ID_AUTOSUSPEND=1')
diff --git a/tools/make-directive-index.py b/tools/make-directive-index.py
new file mode 100755
index 0000000..5398b45
--- /dev/null
+++ b/tools/make-directive-index.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import collections
+import re
+import sys
+from copy import deepcopy
+
+from xml_helper import tree, xml_parse, xml_print
+
+COLOPHON = '''\
+This index contains {count} entries in {sections} sections,
+referring to {pages} individual manual pages.
+'''
+
+def _extract_directives(directive_groups, formatting, page):
+ t = xml_parse(page)
+ section = t.find('./refmeta/manvolnum').text
+ pagename = t.find('./refmeta/refentrytitle').text
+
+ storopt = directive_groups['options']
+ for variablelist in t.iterfind('.//variablelist'):
+ klass = variablelist.attrib.get('class')
+ searchpath = variablelist.attrib.get('xpath','./varlistentry/term/varname')
+ storvar = directive_groups[klass or 'miscellaneous']
+ # <option>s go in OPTIONS, unless class is specified
+ for xpath, stor in ((searchpath, storvar),
+ ('./varlistentry/term/option',
+ storvar if klass else storopt)):
+ for name in variablelist.iterfind(xpath):
+ text = re.sub(r'([= ]).*', r'\1', name.text).rstrip()
+ if text.startswith('-'):
+ # for options, merge options with and without mandatory arg
+ text = text.partition('=')[0]
+ stor[text].append((pagename, section))
+ if text not in formatting:
+ # use element as formatted display
+ if name.text[-1] in "= '":
+ name.clear()
+ else:
+ name.tail = ''
+ name.text = text
+ formatting[text] = name
+ extra = variablelist.attrib.get('extra-ref')
+ if extra:
+ stor[extra].append((pagename, section))
+ if extra not in formatting:
+ elt = tree.Element("varname")
+ elt.text= extra
+ formatting[extra] = elt
+
+ storfile = directive_groups['filenames']
+ for xpath, absolute_only in (('.//refsynopsisdiv//filename', False),
+ ('.//refsynopsisdiv//command', False),
+ ('.//filename', True)):
+ for name in t.iterfind(xpath):
+ if absolute_only and not (name.text and name.text.startswith('/')):
+ continue
+ if name.attrib.get('index') == 'false':
+ continue
+ name.tail = ''
+ if name.text:
+ if name.text.endswith('*'):
+ name.text = name.text[:-1]
+ if not name.text.startswith('.'):
+ text = name.text.partition(' ')[0]
+ if text != name.text:
+ name.clear()
+ name.text = text
+ if text.endswith('/'):
+ text = text[:-1]
+ storfile[text].append((pagename, section))
+ if text not in formatting:
+ # use element as formatted display
+ formatting[text] = name
+ else:
+ text = ' '.join(name.itertext())
+ storfile[text].append((pagename, section))
+ formatting[text] = name
+
+ for name in t.iterfind('.//constant'):
+ if name.attrib.get('index') == 'false':
+ continue
+ name.tail = ''
+ if name.text.startswith('('): # a cast, strip it
+ name.text = name.text.partition(' ')[2]
+ klass = name.attrib.get('class') or 'constants'
+ storfile = directive_groups[klass]
+ storfile[name.text].append((pagename, section))
+ formatting[name.text] = name
+
+ storfile = directive_groups['specifiers']
+ for name in t.iterfind(".//table[@class='specifiers']//entry/literal"):
+ if name.text[0] != '%' or name.getparent().text is not None:
+ continue
+ if name.attrib.get('index') == 'false':
+ continue
+ storfile[name.text].append((pagename, section))
+ formatting[name.text] = name
+ for name in t.iterfind(".//literal[@class='specifiers']"):
+ storfile[name.text].append((pagename, section))
+ formatting[name.text] = name
+
+def _make_section(template, name, directives, formatting):
+ varlist = template.find(f".//*[@id='{name}']")
+ for varname, manpages in sorted(directives.items()):
+ entry = tree.SubElement(varlist, 'varlistentry')
+ term = tree.SubElement(entry, 'term')
+ display = deepcopy(formatting[varname])
+ term.append(display)
+
+ para = tree.SubElement(tree.SubElement(entry, 'listitem'), 'para')
+
+ b = None
+ for manpage, manvolume in sorted(set(manpages)):
+ if b is not None:
+ b.tail = ', '
+ b = tree.SubElement(para, 'citerefentry')
+ c = tree.SubElement(b, 'refentrytitle')
+ c.text = manpage
+ c.attrib['target'] = varname
+ d = tree.SubElement(b, 'manvolnum')
+ d.text = manvolume
+ entry.tail = '\n\n'
+
+def _make_colophon(template, groups):
+ count = 0
+ pages = set()
+ for group in groups:
+ count += len(group)
+ for pagelist in group.values():
+ pages |= set(pagelist)
+
+ para = template.find(".//para[@id='colophon']")
+ para.text = COLOPHON.format(count=count,
+ sections=len(groups),
+ pages=len(pages))
+
+def _make_page(template, directive_groups, formatting):
+ """Create an XML tree from directive_groups.
+
+ directive_groups = {
+ 'class': {'variable': [('manpage', 'manvolume'), ...],
+ 'variable2': ...},
+ ...
+ }
+ """
+ for name, directives in directive_groups.items():
+ _make_section(template, name, directives, formatting)
+
+ _make_colophon(template, directive_groups.values())
+
+ return template
+
+def make_page(template_path, xml_files):
+ "Extract directives from xml_files and return XML index tree."
+ template = xml_parse(template_path)
+ names = [vl.get('id') for vl in template.iterfind('.//variablelist')]
+ directive_groups = {name:collections.defaultdict(list)
+ for name in names}
+ formatting = {}
+ for page in xml_files:
+ try:
+ _extract_directives(directive_groups, formatting, page)
+ except Exception as e:
+ raise ValueError("failed to process " + page) from e
+
+ return _make_page(template, directive_groups, formatting)
+
+if __name__ == '__main__':
+ with open(sys.argv[1], 'wb') as f:
+ _template_path = sys.argv[2]
+ _xml_files = sys.argv[3:]
+ _xml = make_page(_template_path, _xml_files)
+ f.write(xml_print(_xml))
diff --git a/tools/make-man-index.py b/tools/make-man-index.py
new file mode 100755
index 0000000..579dd40
--- /dev/null
+++ b/tools/make-man-index.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import collections
+import re
+import sys
+
+from xml_helper import tree, xml_parse, xml_print
+
+MDASH = ' — ' if sys.version_info.major >= 3 else ' -- '
+
+TEMPLATE = '''\
+<refentry id="systemd.index">
+
+ <refentryinfo>
+ <title>systemd.index</title>
+ <productname>systemd</productname>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle>systemd.index</refentrytitle>
+ <manvolnum>7</manvolnum>
+ </refmeta>
+
+ <refnamediv>
+ <refname>systemd.index</refname>
+ <refpurpose>List all manpages from the systemd project</refpurpose>
+ </refnamediv>
+</refentry>
+'''
+
+SUMMARY = '''\
+ <refsect1>
+ <title>See Also</title>
+ <para>
+ <citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+ </para>
+
+ <para id='counts' />
+ </refsect1>
+'''
+
+COUNTS = '\
+This index contains {count} entries, referring to {pages} individual manual pages.'
+
+
+def check_id(page, t):
+ page_id = t.getroot().get('id')
+ if not re.search('/' + page_id + '[.]', page):
+ raise ValueError(f"id='{page_id}' is not the same as page name '{page}'")
+
+def make_index(pages):
+ index = collections.defaultdict(list)
+ for p in pages:
+ t = xml_parse(p)
+ check_id(p, t)
+ section = t.find('./refmeta/manvolnum').text
+ refname = t.find('./refnamediv/refname').text
+ purpose_text = ' '.join(t.find('./refnamediv/refpurpose').itertext())
+ purpose = ' '.join(purpose_text.split())
+ for f in t.findall('./refnamediv/refname'):
+ infos = (f.text, section, purpose, refname)
+ index[f.text[0].upper()].append(infos)
+ return index
+
+def add_letter(template, letter, pages):
+ refsect1 = tree.SubElement(template, 'refsect1')
+ title = tree.SubElement(refsect1, 'title')
+ title.text = letter
+ para = tree.SubElement(refsect1, 'para')
+ for info in sorted(pages, key=lambda info: str.lower(info[0])):
+ refname, section, purpose, _realname = info
+
+ b = tree.SubElement(para, 'citerefentry')
+ c = tree.SubElement(b, 'refentrytitle')
+ c.text = refname
+ d = tree.SubElement(b, 'manvolnum')
+ d.text = section
+
+ b.tail = MDASH + purpose # + ' (' + p + ')'
+
+ tree.SubElement(para, 'sbr')
+
+def add_summary(template, indexpages):
+ count = 0
+ pages = set()
+ for group in indexpages:
+ count += len(group)
+ for info in group:
+ _refname, section, _purpose, realname = info
+ pages.add((realname, section))
+
+ refsect1 = tree.fromstring(SUMMARY)
+ template.append(refsect1)
+
+ para = template.find(".//para[@id='counts']")
+ para.text = COUNTS.format(count=count, pages=len(pages))
+
+def make_page(*xml_files):
+ template = tree.fromstring(TEMPLATE)
+ index = make_index(xml_files)
+
+ for letter in sorted(index):
+ add_letter(template, letter, index[letter])
+
+ add_summary(template, index.values())
+
+ return template
+
+if __name__ == '__main__':
+ with open(sys.argv[1], 'wb') as file:
+ file.write(xml_print(make_page(*sys.argv[2:])))
diff --git a/tools/meson-build.sh b/tools/meson-build.sh
new file mode 100755
index 0000000..2366df2
--- /dev/null
+++ b/tools/meson-build.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eux
+
+sourcedir="${1:?}"
+builddir="${2:?}"
+target="${3:?}"
+c_args="${4:?}"
+cpp_args="${5:?}"
+options="${6:?}"
+CC="${7:?}"
+CXX="$8"
+
+if [ ! -f "$builddir/build.ninja" ]; then
+ # shellcheck disable=SC2086
+ CC="$CC" CXX="$CXX" meson setup -Dc_args="$c_args" -Dcpp_args="$cpp_args" "$builddir" "$sourcedir" $options
+fi
+
+# Locate ninja binary, on CentOS 7 it is called ninja-build, so use that name if available.
+command -v ninja-build >/dev/null && ninja="ninja-build" || ninja="ninja"
+"$ninja" -C "$builddir" "$target"
diff --git a/tools/meson-render-jinja2.py b/tools/meson-render-jinja2.py
new file mode 100755
index 0000000..3a3d912
--- /dev/null
+++ b/tools/meson-render-jinja2.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# pylint: disable=consider-using-with
+
+import ast
+import os
+import re
+import sys
+
+import jinja2
+
+def parse_config_h(filename):
+ # Parse config.h file generated by meson.
+ ans = {}
+ for line in open(filename):
+ m = re.match(r'#define\s+(\w+)\s+(.*)', line)
+ if not m:
+ continue
+ a, b = m.groups()
+ if b and b[0] in '0123456789"':
+ b = ast.literal_eval(b)
+ ans[a] = b
+ return ans
+
+def render(filename, defines):
+ text = open(filename).read()
+ template = jinja2.Template(text,
+ trim_blocks=True,
+ lstrip_blocks=True,
+ keep_trailing_newline=True,
+ undefined=jinja2.StrictUndefined)
+ return template.render(defines)
+
+def main():
+ defines = parse_config_h(sys.argv[1])
+ defines.update(parse_config_h(sys.argv[2]))
+ output = render(sys.argv[3], defines)
+ with open(sys.argv[4], 'w') as f:
+ f.write(output)
+ info = os.stat(sys.argv[3])
+ os.chmod(sys.argv[4], info.st_mode)
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/meson-vcs-tag.sh b/tools/meson-vcs-tag.sh
new file mode 100755
index 0000000..4a8dc89
--- /dev/null
+++ b/tools/meson-vcs-tag.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -u
+set -o pipefail
+
+dir="${1:?}"
+fallback="${2:?}"
+version_tag="${3:-}"
+
+if [ -n "${version_tag}" ]; then
+ # If -Dversion_tag= was used, just use that without further changes.
+ echo "${version_tag}"
+else
+ # Check that we have either .git/ (a normal clone) or a .git file (a work-tree)
+ # and that we don't get confused if a tarball is extracted in a higher-level
+ # git repository.
+ #
+ # If the working tree has no tags (CI builds), the first git-describe will fail
+ # and we fall back to project_version-commitid instead.
+
+ c=''
+ if [ -e "${dir}/.git" ]; then
+ c="$(git -C "$dir" describe --abbrev=7 --dirty=^ 2>/dev/null)"
+ if [ -z "$c" ]; then
+ # This call might still fail with permission issues
+ suffix="$(git -C "$dir" describe --always --abbrev=7 --dirty=^ 2>/dev/null)"
+ [ -n "$suffix" ] && c="${fallback}-${suffix}"
+ fi
+ fi
+ [ -z "$c" ] && c="${fallback}"
+ echo "$c" | sed 's/^v//; s/-rc/~rc/'
+fi
diff --git a/tools/oss-fuzz.sh b/tools/oss-fuzz.sh
new file mode 100755
index 0000000..df3d39e
--- /dev/null
+++ b/tools/oss-fuzz.sh
@@ -0,0 +1,143 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -ex
+
+export LC_CTYPE=C.UTF-8
+
+export CC=${CC:-clang}
+export CXX=${CXX:-clang++}
+clang_version="$($CC --version | sed -nr 's/.*version ([^ ]+?) .*/\1/p' | sed -r 's/-$//')"
+
+SANITIZER=${SANITIZER:-address -fsanitize-address-use-after-scope}
+flags="-O1 -fno-omit-frame-pointer -g -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=$SANITIZER"
+
+clang_lib="/usr/lib64/clang/${clang_version}/lib/linux"
+[ -d "$clang_lib" ] || clang_lib="/usr/lib/clang/${clang_version}/lib/linux"
+
+export CFLAGS=${CFLAGS:-$flags}
+export CXXFLAGS=${CXXFLAGS:-$flags}
+export LDFLAGS=${LDFLAGS:--L${clang_lib}}
+
+export WORK=${WORK:-$(pwd)}
+export OUT=${OUT:-$(pwd)/out}
+mkdir -p "$OUT"
+
+build="$WORK/build"
+rm -rf "$build"
+mkdir -p "$build"
+
+meson_args=("-Db_lundef=false")
+
+if [ -z "$FUZZING_ENGINE" ]; then
+ meson_args+=("-Dllvm-fuzz=true")
+else
+ meson_args+=("-Doss-fuzz=true" "--auto-features=disabled")
+
+ apt-get update
+ apt-get install -y gperf m4 gettext python3-pip \
+ libcap-dev libmount-dev \
+ pkg-config wget python3-jinja2 zipmerge zstd
+
+ if [[ "$ARCHITECTURE" == i386 ]]; then
+ apt-get install -y pkg-config:i386 libcap-dev:i386 libmount-dev:i386
+ fi
+
+ pip3 install -r .github/workflows/requirements.txt --require-hashes
+
+ # https://github.com/google/oss-fuzz/issues/6868
+ ORIG_PYTHONPATH=$(python3 -c 'import sys;print(":".join(sys.path[1:]))')
+ export PYTHONPATH="$ORIG_PYTHONPATH:/usr/lib/python3/dist-packages/"
+
+ if [[ "$SANITIZER" == undefined ]]; then
+ additional_ubsan_checks=pointer-overflow,alignment
+ UBSAN_FLAGS="-fsanitize=$additional_ubsan_checks -fno-sanitize-recover=$additional_ubsan_checks"
+ CFLAGS="$CFLAGS $UBSAN_FLAGS"
+ CXXFLAGS="$CXXFLAGS $UBSAN_FLAGS"
+ fi
+
+ if [[ "$SANITIZER" == introspector ]]; then
+ # fuzz-introspector passes -fuse-ld=gold and -flto using CFLAGS/LDFLAGS and due to
+ # https://github.com/mesonbuild/meson/issues/6377#issuecomment-575977919 and
+ # https://github.com/mesonbuild/meson/issues/6377 it doesn't mix well with meson.
+ # It's possible to build systemd with duct tape there using something like
+ # https://github.com/google/oss-fuzz/pull/7583#issuecomment-1104011067 but
+ # apparently even with gold and lto some parts of systemd are missing from
+ # reports (presumably due to https://github.com/google/oss-fuzz/issues/7598).
+ # Let's just fail here for now to make it clear that fuzz-introspector isn't supported.
+ exit 1
+ fi
+fi
+
+if ! meson setup "$build" "${meson_args[@]}"; then
+ cat "$build/meson-logs/meson-log.txt"
+ exit 1
+fi
+
+ninja -v -C "$build" fuzzers
+
+# Compressed BCD files are kept in test/test-bcd so let's unpack them
+# and put them all in the seed corpus.
+bcd=$(mktemp -d)
+for i in test/test-bcd/*.zst; do
+ unzstd "$i" -o "$bcd/$(basename "${i%.zst}")";
+done
+zip -jqr "$OUT/fuzz-bcd_seed_corpus.zip" "$bcd"
+rm -rf "$bcd"
+
+hosts=$(mktemp)
+wget -O "$hosts" https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
+zip -jq "$OUT/fuzz-etc-hosts_seed_corpus.zip" "$hosts"
+rm -rf "$hosts"
+
+# The seed corpus is a separate flat archive for each fuzzer,
+# with a fixed name ${fuzzer}_seed_corpus.zip.
+for d in test/fuzz/fuzz-*; do
+ fuzzer="$(basename "$d")"
+ # Include the build-generated corpora if any as well
+ readarray -t generated < <(find "$build/test/fuzz" -maxdepth 1 -name "${fuzzer}*" -type f)
+ zip -jqr "$OUT/${fuzzer}_seed_corpus.zip" "$d" "${generated[@]}"
+done
+
+# get fuzz-dns-packet corpus
+df="$build/dns-fuzzing"
+git clone --depth 1 https://github.com/CZ-NIC/dns-fuzzing "$df"
+zip -jqr "$OUT/fuzz-dns-packet_seed_corpus.zip" "$df/packet"
+
+install -Dt "$OUT/src/shared/" \
+ "$build"/src/shared/libsystemd-shared-*.so \
+ "$build"/src/core/libsystemd-core-*.so
+
+# Most i386 libraries have to be brought to the runtime environment somehow. Ideally they
+# should be linked statically but since it isn't possible another way to keep them close
+# to the fuzz targets is used here. The dependencies are copied to "$OUT/src/shared" and
+# then 'rpath' is tweaked to make it possible for the linker to find them there. "$OUT/src/shared"
+# is chosen because the runtime search path of all the fuzz targets already points to it
+# to load "libsystemd-shared" and "libsystemd-core". Stuff like that should be avoided on
+# x86_64 because it tends to break coverage reports, fuzz-introspector, CIFuzz and so on.
+if [[ "$ARCHITECTURE" == i386 ]]; then
+ for lib_path in $(ldd "$OUT"/src/shared/libsystemd-shared-*.so | awk '/=> \/lib/ { print $3 }'); do
+ lib_name=$(basename "$lib_path")
+ cp "$lib_path" "$OUT/src/shared"
+ patchelf --set-rpath \$ORIGIN "$OUT/src/shared/$lib_name"
+ done
+ patchelf --set-rpath \$ORIGIN "$OUT"/src/shared/libsystemd-shared-*.so
+fi
+
+wget -O "$OUT/fuzz-json.dict" https://raw.githubusercontent.com/rc0r/afl-fuzz/master/dictionaries/json.dict
+
+find "$build" -maxdepth 1 -type f -executable -name "fuzz-*" -exec mv {} "$OUT" \;
+find src -type f -name "fuzz-*.dict" -exec cp {} "$OUT" \;
+cp src/fuzz/*.options "$OUT"
+
+if [[ "$MERGE_WITH_OSS_FUZZ_CORPORA" == "yes" ]]; then
+ for f in "$OUT/"fuzz-*; do
+ [[ -x "$f" ]] || continue
+ fuzzer=$(basename "$f")
+ t=$(mktemp)
+ if wget -O "$t" "https://storage.googleapis.com/systemd-backup.clusterfuzz-external.appspot.com/corpus/libFuzzer/systemd_${fuzzer}/public.zip"; then
+ zipmerge "$OUT/${fuzzer}_seed_corpus.zip" "$t"
+ fi
+ rm -rf "$t"
+ done
+fi
diff --git a/tools/sync-docs.py b/tools/sync-docs.py
new file mode 100755
index 0000000..95436e2
--- /dev/null
+++ b/tools/sync-docs.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+from argparse import ArgumentParser
+import glob
+import json
+import os
+import re
+import subprocess
+import sys
+
+import requests
+
+BASE_URL = "https://www.freedesktop.org/software/systemd/man/"
+JQUERY_URL = "https://code.jquery.com/jquery-3.7.1.min.js"
+SCRIPT_TAG = '<script src="{}"></script>'
+
+NAV_JS = """
+$(document).ready(function() {
+ $.getJSON("../index.json", function(data) {
+ data.sort().reverse();
+
+ var [filename, dirname] = window.location.pathname.split("/").reverse();
+
+ var items = [];
+ $.each( data, function(_, version) {
+ if (version == dirname) {
+ items.push( "<option selected value='" + version + "'>" + "systemd " + version + "</option>");
+ } else if (dirname == "latest" && version == data[0]) {
+ items.push( "<option selected value='" + version + "'>" + "systemd " + version + "</option>");
+ } else {
+ items.push( "<option value='" + version + "'>" + "systemd " + version + "</option>");
+ }
+ });
+
+ $("span:first").html($( "<select/>", {
+ id: "version-selector",
+ html: items.join( "" )
+ }));
+
+ $("#version-selector").on("change", function() {
+ window.location.assign("../" + $(this).val() + "/" + filename);
+ });
+ });
+});
+"""
+
+
+def process_file(filename):
+ with open(filename) as f:
+ contents = f.read()
+
+ if SCRIPT_TAG.format("../nav.js") in contents:
+ return
+
+ body_tag = re.search("<body[^>]*>", contents)
+ new_contents = (
+ contents[: body_tag.end()]
+ + SCRIPT_TAG.format(JQUERY_URL)
+ + SCRIPT_TAG.format("../nav.js")
+ + contents[body_tag.end() :]
+ )
+
+ with open(filename, "w") as f:
+ f.write(new_contents)
+
+
+def update_index_file(version, index_filename):
+ response = requests.get(BASE_URL + "index.json")
+ if response.status_code == 404:
+ index = []
+ elif response.ok:
+ index = response.json()
+ else:
+ sys.exit(f"Error getting index: {response.status_code} {response.reason}")
+
+ if version not in index:
+ index.insert(0, version)
+
+ with open(index_filename, "w") as f:
+ json.dump(index, f)
+
+
+def get_latest_version():
+ tags = subprocess.check_output(["git", "tag", "-l", "v*"], text=True).split()
+ versions = []
+ for tag in tags:
+ m = re.match("v?(\d+).*", tag)
+ if m:
+ versions.append(int(m.group(1)))
+ return max(versions)
+
+
+def main(version, directory, www_target):
+ index_filename = os.path.join(directory, "index.json")
+ nav_filename = os.path.join(directory, "nav.js")
+
+ current_branch = subprocess.check_output(["git", "branch", "--show-current"], text=True).strip()
+
+ if current_branch != 'main' and not current_branch.endswith("-stable"):
+ sys.exit("doc-sync should only be run from main or a stable branch")
+
+ for filename in glob.glob(os.path.join(directory, "*.html")):
+ process_file(filename)
+
+ if current_branch == "main":
+ version = "devel"
+ dirs = ["devel"]
+ elif int(version) == get_latest_version():
+ dirs = [version, "latest"]
+ else:
+ dirs = [version]
+
+ with open(nav_filename, "w") as f:
+ f.write(NAV_JS)
+
+ update_index_file(version, index_filename)
+
+ for d in dirs:
+ subprocess.check_call(
+ [
+ "rsync",
+ "-rlv",
+ "--delete-excluded",
+ "--include=*.html",
+ "--exclude=*",
+ "--omit-dir-times",
+ directory + "/", # copy contents of directory
+ os.path.join(www_target, "man", d),
+ ]
+ )
+
+ subprocess.check_call(
+ [
+ "rsync",
+ "-v",
+ os.path.join(directory, "index.json"),
+ os.path.join(directory, "nav.js"),
+ os.path.join(www_target, "man"),
+ ]
+ )
+
+
+if __name__ == "__main__":
+ parser = ArgumentParser()
+ parser.add_argument("--version", required=True)
+ parser.add_argument("directory")
+ parser.add_argument("www_target")
+
+ args = parser.parse_args()
+ main(args.version, args.directory, args.www_target)
diff --git a/tools/update-dbus-docs.py b/tools/update-dbus-docs.py
new file mode 100755
index 0000000..008f7d4
--- /dev/null
+++ b/tools/update-dbus-docs.py
@@ -0,0 +1,365 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# pylint: disable=superfluous-parens,consider-using-with
+
+import argparse
+import collections
+import sys
+import os
+import subprocess
+import io
+
+try:
+ from lxml import etree
+except ModuleNotFoundError as e:
+ etree = e
+
+try:
+ from shlex import join as shlex_join
+except ImportError as e:
+ shlex_join = e
+
+try:
+ from shlex import quote as shlex_quote
+except ImportError as e:
+ shlex_quote = e
+
+class NoCommand(Exception):
+ pass
+
+BORING_INTERFACES = [
+ 'org.freedesktop.DBus.Peer',
+ 'org.freedesktop.DBus.Introspectable',
+ 'org.freedesktop.DBus.Properties',
+]
+RED = '\x1b[31m'
+GREEN = '\x1b[32m'
+YELLOW = '\x1b[33m'
+RESET = '\x1b[39m'
+
+arguments = None
+
+def xml_parser():
+ return etree.XMLParser(no_network=True,
+ remove_comments=False,
+ strip_cdata=False,
+ resolve_entities=False)
+
+def print_method(declarations, elem, *, prefix, file, is_signal=False):
+ name = elem.get('name')
+ klass = 'signal' if is_signal else 'method'
+ declarations[klass].append(name)
+
+ # @org.freedesktop.systemd1.Privileged("true")
+ # SetShowStatus(in s mode);
+
+ for anno in elem.findall('./annotation'):
+ anno_name = anno.get('name')
+ anno_value = anno.get('value')
+ print(f'''{prefix}@{anno_name}("{anno_value}")''', file=file)
+
+ print(f'''{prefix}{name}(''', file=file, end='')
+ lead = ',\n' + prefix + ' ' * len(name) + ' '
+
+ for num, arg in enumerate(elem.findall('./arg')):
+ argname = arg.get('name')
+
+ if argname is None:
+ if arguments.print_errors:
+ print(f'method {name}: argument {num+1} has no name', file=sys.stderr)
+ argname = 'UNNAMED'
+
+ argtype = arg.get('type')
+ if not is_signal:
+ direction = arg.get('direction')
+ print(f'''{lead if num > 0 else ''}{direction:3} {argtype} {argname}''', file=file, end='')
+ else:
+ print(f'''{lead if num > 0 else ''}{argtype} {argname}''', file=file, end='')
+
+ print(');', file=file)
+
+ACCESS_MAP = {
+ 'read' : 'readonly',
+ 'write' : 'readwrite',
+}
+
+def value_ellipsis(prop_type):
+ if prop_type == 's':
+ return "'...'"
+ if prop_type[0] == 'a':
+ inner = value_ellipsis(prop_type[1:])
+ return f"[{inner}{', ...' if inner != '...' else ''}]"
+ return '...'
+
+def print_property(declarations, elem, *, prefix, file):
+ prop_name = elem.get('name')
+ prop_type = elem.get('type')
+ prop_access = elem.get('access')
+
+ declarations['property'].append(prop_name)
+
+ # @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
+ # @org.freedesktop.systemd1.Privileged("true")
+ # readwrite b EnableWallMessages = false;
+
+ for anno in elem.findall('./annotation'):
+ anno_name = anno.get('name')
+ anno_value = anno.get('value')
+ print(f'''{prefix}@{anno_name}("{anno_value}")''', file=file)
+
+ prop_access = ACCESS_MAP.get(prop_access, prop_access)
+ print(f'''{prefix}{prop_access} {prop_type} {prop_name} = {value_ellipsis(prop_type)};''', file=file)
+
+def print_interface(iface, *, prefix, file, print_boring, only_interface, declarations):
+ name = iface.get('name')
+
+ is_boring = (name in BORING_INTERFACES or
+ only_interface is not None and name != only_interface)
+
+ if is_boring and print_boring:
+ print(f'''{prefix}interface {name} {{ ... }};''', file=file)
+
+ elif not is_boring and not print_boring:
+ print(f'''{prefix}interface {name} {{''', file=file)
+ prefix2 = prefix + ' '
+
+ for num, elem in enumerate(iface.findall('./method')):
+ if num == 0:
+ print(f'''{prefix2}methods:''', file=file)
+ print_method(declarations, elem, prefix=prefix2 + ' ', file=file)
+
+ for num, elem in enumerate(iface.findall('./signal')):
+ if num == 0:
+ print(f'''{prefix2}signals:''', file=file)
+ print_method(declarations, elem, prefix=prefix2 + ' ', file=file, is_signal=True)
+
+ for num, elem in enumerate(iface.findall('./property')):
+ if num == 0:
+ print(f'''{prefix2}properties:''', file=file)
+ print_property(declarations, elem, prefix=prefix2 + ' ', file=file)
+
+ print(f'''{prefix}}};''', file=file)
+
+def check_documented(document, declarations, stats, interface, missing_version):
+ missing = []
+
+ sections = document.findall("refsect1")
+ history_section = document.find("refsect1[title = 'History']")
+ if history_section is not None:
+ sections.remove(history_section)
+
+ for klass, items in declarations.items():
+ stats['total'] += len(items)
+
+ for item in items:
+ if klass == 'method':
+ elem = 'function'
+ item_repr = f'{item}()'
+ elif klass == 'signal':
+ elem = 'function'
+ item_repr = item
+ elif klass == 'property':
+ elem = 'varname'
+ item_repr = item
+ else:
+ assert False, (klass, item)
+
+ predicate = f".//{elem}[. = '{item_repr}']"
+ if not any(section.find(predicate) is not None for section in sections):
+ if arguments.print_errors:
+ print(f'{klass} {item} is not documented :(')
+ missing.append((klass, item))
+
+ if history_section is None or history_section.find(predicate) is None:
+ missing_version.append(f"{interface}.{item_repr}")
+
+ stats['missing'] += len(missing)
+
+ return missing
+
+def xml_to_text(destination, xml, *, only_interface=None):
+ file = io.StringIO()
+
+ declarations = collections.defaultdict(list)
+ interfaces = []
+
+ print(f'''node {destination} {{''', file=file)
+
+ for print_boring in [False, True]:
+ for iface in xml.findall('./interface'):
+ print_interface(iface, prefix=' ', file=file,
+ print_boring=print_boring,
+ only_interface=only_interface,
+ declarations=declarations)
+ name = iface.get('name')
+ if not name in BORING_INTERFACES:
+ interfaces.append(name)
+
+ print('''};''', file=file)
+
+ return file.getvalue(), declarations, interfaces
+
+def subst_output(document, programlisting, stats, missing_version):
+ executable = programlisting.get('executable', None)
+ if executable is None:
+ # Not our thing
+ return
+ executable = programlisting.get('executable')
+ node = programlisting.get('node')
+ interface = programlisting.get('interface')
+
+ argv = [f'{arguments.build_dir}/{executable}', f'--bus-introspect={interface}']
+ if isinstance(shlex_join, Exception):
+ print(f'COMMAND: {" ".join(shlex_quote(arg) for arg in argv)}')
+ else:
+ print(f'COMMAND: {shlex_join(argv)}')
+
+ try:
+ out = subprocess.check_output(argv, universal_newlines=True)
+ except FileNotFoundError:
+ print(f'{executable} not found, ignoring', file=sys.stderr)
+ return
+
+ xml = etree.fromstring(out, parser=xml_parser())
+
+ new_text, declarations, interfaces = xml_to_text(node, xml, only_interface=interface)
+ programlisting.text = '\n' + new_text + ' '
+
+ if declarations:
+ missing = check_documented(document, declarations, stats, interface, missing_version)
+ parent = programlisting.getparent()
+
+ # delete old comments
+ for child in parent:
+ if child.tag is etree.Comment and 'Autogenerated' in child.text:
+ parent.remove(child)
+ if child.tag is etree.Comment and 'not documented' in child.text:
+ parent.remove(child)
+ if child.tag == "variablelist" and child.attrib.get("generated", False) == "True":
+ parent.remove(child)
+
+ # insert pointer for systemd-directives generation
+ the_tail = programlisting.tail #tail is erased by addnext, so save it here.
+ prev_element = etree.Comment("Autogenerated cross-references for systemd.directives, do not edit")
+ programlisting.addnext(prev_element)
+ programlisting.tail = the_tail
+
+ for interface in interfaces:
+ variablelist = etree.Element("variablelist")
+ variablelist.attrib['class'] = 'dbus-interface'
+ variablelist.attrib['generated'] = 'True'
+ variablelist.attrib['extra-ref'] = interface
+
+ prev_element.addnext(variablelist)
+ prev_element.tail = the_tail
+ prev_element = variablelist
+
+ for decl_type,decl_list in declarations.items():
+ for declaration in decl_list:
+ variablelist = etree.Element("variablelist")
+ variablelist.attrib['class'] = 'dbus-'+decl_type
+ variablelist.attrib['generated'] = 'True'
+ if decl_type == 'method' :
+ variablelist.attrib['extra-ref'] = declaration + '()'
+ else:
+ variablelist.attrib['extra-ref'] = declaration
+
+ prev_element.addnext(variablelist)
+ prev_element.tail = the_tail
+ prev_element = variablelist
+
+ last_element = etree.Comment("End of Autogenerated section")
+ prev_element.addnext(last_element)
+ prev_element.tail = the_tail
+ last_element.tail = the_tail
+
+ # insert comments for undocumented items
+ for item in reversed(missing):
+ comment = etree.Comment(f'{item[0]} {item[1]} is not documented!')
+ comment.tail = programlisting.tail
+ parent.insert(parent.index(programlisting) + 1, comment)
+
+def process(page, missing_version):
+ src = open(page).read()
+ xml = etree.fromstring(src, parser=xml_parser())
+
+ # print('parsing {}'.format(name), file=sys.stderr)
+ if xml.tag != 'refentry':
+ return None
+
+ stats = collections.Counter()
+
+ pls = xml.findall('.//programlisting')
+ for pl in pls:
+ subst_output(xml, pl, stats, missing_version)
+
+ out_text = etree.tostring(xml, encoding='unicode')
+ # massage format to avoid some lxml whitespace handling idiosyncrasies
+ # https://bugs.launchpad.net/lxml/+bug/526799
+ out_text = (src[:src.find('<refentryinfo')] +
+ out_text[out_text.find('<refentryinfo'):] +
+ '\n')
+
+ if not arguments.test:
+ with open(page, 'w') as out:
+ out.write(out_text)
+
+ return { "stats" : stats, "modified" : out_text != src }
+
+def parse_args():
+ p = argparse.ArgumentParser()
+ p.add_argument('--test', action='store_true',
+ help='only verify that everything is up2date')
+ p.add_argument('--build-dir', default='build')
+ p.add_argument('pages', nargs='+')
+ opts = p.parse_args()
+ opts.print_errors = not opts.test
+ return opts
+
+def main():
+ # pylint: disable=global-statement
+ global arguments
+ arguments = parse_args()
+
+ for item in (etree, shlex_quote):
+ if isinstance(item, Exception):
+ print(item, file=sys.stderr)
+ sys.exit(77 if arguments.test else 1)
+
+ if not os.path.exists(f'{arguments.build_dir}/systemd'):
+ sys.exit(f"{arguments.build_dir}/systemd doesn't exist. Use --build-dir=.")
+
+ missing_version = []
+ stats = {page.split('/')[-1] : process(page, missing_version) for page in arguments.pages}
+
+ ignore_list = open(os.path.join(os.path.dirname(__file__), 'dbus_ignorelist')).read().split()
+ missing_version = [x for x in missing_version if x not in ignore_list]
+
+ for missing in missing_version:
+ print(f"{RED}Missing version information for {missing}{RESET}")
+
+ if missing_version:
+ sys.exit(1)
+
+ # Let's print all statistics at the end
+ mlen = max(len(page) for page in stats)
+ total = sum((item['stats'] for item in stats.values()), collections.Counter())
+ total = 'total', { "stats" : total, "modified" : False }
+ modified = []
+ classification = 'OUTDATED' if arguments.test else 'MODIFIED'
+ for page, info in sorted(stats.items()) + [total]:
+ m = info['stats']['missing']
+ t = info['stats']['total']
+ p = page + ':'
+ c = classification if info['modified'] else ''
+ if c:
+ modified.append(page)
+ color = RED if m > t/2 else (YELLOW if m else GREEN)
+ print(f'{color}{p:{mlen + 1}} {t - m}/{t} {c}{RESET}')
+
+ if arguments.test and modified:
+ sys.exit(f'Outdated pages: {", ".join(modified)}\n'
+ f'Hint: ninja -C {arguments.build_dir} update-dbus-docs')
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/update-hwdb-autosuspend.sh b/tools/update-hwdb-autosuspend.sh
new file mode 100755
index 0000000..75aecb7
--- /dev/null
+++ b/tools/update-hwdb-autosuspend.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+
+cd "${1:?}"
+
+(curl --fail -L 'https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/power_manager/udev/gen_autosuspend_rules.py?format=TEXT'; echo) \
+ | base64 -d >tools/chromiumos/gen_autosuspend_rules.py
+
+(cat <<EOF
+# This file is part of systemd.
+#
+# Rules to autosuspend known fingerprint readers (pulled from libfprint).
+#
+EOF
+curl --fail -L 'https://gitlab.freedesktop.org/libfprint/libfprint/-/raw/master/data/autosuspend.hwdb') \
+ >hwdb.d/60-autosuspend-fingerprint-reader.hwdb
diff --git a/tools/update-hwdb.sh b/tools/update-hwdb.sh
new file mode 100755
index 0000000..096a100
--- /dev/null
+++ b/tools/update-hwdb.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+
+cd "${1:?}"
+
+unset permissive
+if [ "${2:-}" = "-p" ]; then
+ permissive=1
+ shift
+else
+ permissive=0
+fi
+
+if [ "${2:-}" != "-n" ]; then (
+ [ -z "$permissive" ] || set +e
+ set -x
+
+ curl --fail -L -o usb.ids 'http://www.linux-usb.org/usb.ids'
+ curl --fail -L -o pci.ids 'http://pci-ids.ucw.cz/v2.2/pci.ids'
+ curl --fail -L -o ma-large.txt 'http://standards-oui.ieee.org/oui/oui.txt'
+ curl --fail -L -o ma-medium.txt 'http://standards-oui.ieee.org/oui28/mam.txt'
+ curl --fail -L -o ma-small.txt 'http://standards-oui.ieee.org/oui36/oui36.txt'
+ curl --fail -L -o pnp_id_registry.csv 'https://uefi.org/uefi-pnp-export'
+ curl --fail -L -o acpi_id_registry.csv 'https://uefi.org/uefi-acpi-export'
+) fi
+
+set -x
+./acpi-update.py >20-acpi-vendor.hwdb.base
+patch -p0 -o- 20-acpi-vendor.hwdb.base <20-acpi-vendor.hwdb.patch >20-acpi-vendor.hwdb
+diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch && exit 1
+
+./ids_parser.py
diff --git a/tools/update-man-rules.py b/tools/update-man-rules.py
new file mode 100755
index 0000000..1c2c9a8
--- /dev/null
+++ b/tools/update-man-rules.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import collections
+import glob
+import pprint
+import sys
+from pathlib import Path
+
+from xml_helper import xml_parse
+
+
+def man(page, number):
+ return f'{page}.{number}'
+
+def add_rules(rules, name):
+ xml = xml_parse(name)
+ # print('parsing {}'.format(name), file=sys.stderr)
+ if xml.getroot().tag != 'refentry':
+ return
+ conditional = xml.getroot().get('conditional') or ''
+ rulegroup = rules[conditional]
+ refmeta = xml.find('./refmeta')
+ title = refmeta.find('./refentrytitle').text
+ number = refmeta.find('./manvolnum').text
+ refnames = xml.findall('./refnamediv/refname')
+ target = man(refnames[0].text, number)
+ if title != refnames[0].text:
+ raise ValueError('refmeta and refnamediv disagree: ' + name)
+ for refname in refnames:
+ assert all(refname not in group
+ for group in rules.values()), "duplicate page name"
+ alias = man(refname.text, number)
+ rulegroup[alias] = target
+ # print('{} => {} [{}]'.format(alias, target, conditional), file=sys.stderr)
+
+def create_rules(xml_files):
+ " {conditional => {alias-name => source-name}} "
+ rules = collections.defaultdict(dict)
+ for name in xml_files:
+ try:
+ add_rules(rules, name)
+ except Exception:
+ print("Failed to process", name, file=sys.stderr)
+ raise
+ return rules
+
+def mjoin(files):
+ return ' \\\n\t'.join(sorted(files) or '#')
+
+MESON_HEADER = '''\
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Do not edit. Generated by update-man-rules.py.
+# Update with:
+# ninja -C build update-man-rules
+manpages = ['''
+
+MESON_FOOTER = '''\
+]
+# Really, do not edit.
+'''
+
+def make_mesonfile(rules, _dist_files):
+ # reformat rules as
+ # grouped = [ [name, section, [alias...], condition], ...]
+ #
+ # but first create a dictionary like
+ # lists = { (name, condition) => [alias...]
+ grouped = collections.defaultdict(list)
+ for condition, items in rules.items():
+ for alias, name in items.items():
+ group = grouped[(name, condition)]
+ if name != alias:
+ group.append(alias)
+
+ lines = [ [p[0][:-2], p[0][-1], sorted(a[:-2] for a in aliases), p[1]]
+ for p, aliases in sorted(grouped.items()) ]
+ return '\n'.join((MESON_HEADER, pprint.pformat(lines)[1:-1], MESON_FOOTER))
+
+def main():
+ source_glob = sys.argv[1]
+ target = Path(sys.argv[2])
+
+ pages = glob.glob(source_glob)
+ pages = (p for p in pages
+ if Path(p).name not in {
+ 'systemd.directives.xml',
+ 'systemd.index.xml',
+ 'directives-template.xml'})
+
+ rules = create_rules(pages)
+ dist_files = (Path(p).name for p in pages)
+ text = make_mesonfile(rules, dist_files)
+
+ tmp = target.with_suffix('.tmp')
+ tmp.write_text(text)
+ tmp.rename(target)
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/update-syscall-tables.sh b/tools/update-syscall-tables.sh
new file mode 100755
index 0000000..fb861e1
--- /dev/null
+++ b/tools/update-syscall-tables.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eu
+
+cd "${1:?}" && shift
+
+curl --fail -L -o syscall-list.txt 'https://raw.githubusercontent.com/hrw/syscalls-table/master/data/syscall-names.text'
+
+for arch in "$@"; do
+ curl --fail -L -o "syscalls-$arch.txt" "https://raw.githubusercontent.com/hrw/syscalls-table/master/data/tables/syscalls-$arch"
+done
diff --git a/tools/xml_helper.py b/tools/xml_helper.py
new file mode 100755
index 0000000..6f71350
--- /dev/null
+++ b/tools/xml_helper.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+from lxml import etree as tree
+
+
+class CustomResolver(tree.Resolver):
+ def resolve(self, url, _id, context):
+ if 'custom-entities.ent' in url:
+ return self.resolve_filename('man/custom-entities.ent', context)
+ if 'ethtool-link-mode' in url:
+ return self.resolve_filename('src/shared/ethtool-link-mode.xml', context)
+
+ return None
+
+_parser = tree.XMLParser()
+# pylint: disable=no-member
+_parser.resolvers.add(CustomResolver())
+
+def xml_parse(page):
+ doc = tree.parse(page, _parser)
+ doc.xinclude()
+ return doc
+
+def xml_print(xml):
+ return tree.tostring(xml, pretty_print=True, encoding='utf-8')