]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #18886 from anitazha/shutdownconsole
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 31 Mar 2021 08:28:26 +0000 (10:28 +0200)
committerGitHub <noreply@github.com>
Wed, 31 Mar 2021 08:28:26 +0000 (10:28 +0200)
logging shutdown to /dev/console

513 files changed:
.github/ISSUE_TEMPLATE/Bug_report.md
.mailmap
.packit.yml
NEWS
TODO
coccinelle/flags-set.cocci
coccinelle/run-coccinelle.sh
coccinelle/strjoina.cocci
docs/CODING_STYLE.md
docs/ENVIRONMENT.md
docs/RELEASE.md
docs/TRANSIENT-SETTINGS.md
docs/USER_NAMES.md
docs/_includes/footer.html
hwdb.d/20-OUI.hwdb
hwdb.d/20-acpi-vendor.hwdb
hwdb.d/20-acpi-vendor.hwdb.patch
hwdb.d/20-pci-vendor-model.hwdb
hwdb.d/20-usb-vendor-model.hwdb
hwdb.d/60-autosuspend-fingerprint-reader.hwdb
hwdb.d/60-evdev.hwdb
hwdb.d/60-keyboard.hwdb
hwdb.d/60-sensor.hwdb
hwdb.d/70-mouse.hwdb
hwdb.d/README [new file with mode: 0644]
hwdb.d/acpi_id_registry.html
hwdb.d/ma-large.txt
hwdb.d/ma-medium.txt
hwdb.d/ma-small.txt
hwdb.d/meson.build
hwdb.d/pci.ids
hwdb.d/pnp_id_registry.html
hwdb.d/usb.ids
man/journald.conf.xml
man/org.freedesktop.systemd1.xml
man/resolvectl.xml
man/rules/meson.build
man/sd-bus.xml
man/sd_bus_add_match.xml
man/sd_bus_add_object.xml
man/sd_bus_request_name.xml
man/systemd-nspawn.xml
man/systemd-rc-local-generator.xml
man/systemd.device.xml
man/systemd.exec.xml
man/systemd.link.xml
man/systemd.netdev.xml
man/systemd.network.xml
man/systemd.service.xml
man/systemd.unit.xml
meson.build
meson_options.txt
modprobe.d/README [new file with mode: 0644]
po/LINGUAS
po/ko.po
po/nl.po [new file with mode: 0644]
po/si.po [new file with mode: 0644]
rules.d/50-udev-default.rules.in
rules.d/60-serial.rules
rules.d/README [new file with mode: 0644]
rules.d/meson.build
shell-completion/bash/systemd-run
shell-completion/zsh/_systemd-run
src/analyze/analyze-security.c
src/analyze/analyze.c
src/ask-password/ask-password.c
src/basic/audit-util.h
src/basic/blockdev-util.c
src/basic/btrfs-util.c
src/basic/capability-util.c
src/basic/capability-util.h
src/basic/cgroup-util.c
src/basic/cgroup-util.h
src/basic/copy.c
src/basic/copy.h
src/basic/device-nodes.c
src/basic/env-file.c
src/basic/escape.c
src/basic/extract-word.c
src/basic/extract-word.h
src/basic/fileio.c
src/basic/fileio.h
src/basic/format-util.c
src/basic/fs-util.c
src/basic/fs-util.h
src/basic/hexdecoct.c
src/basic/io-util.c
src/basic/io-util.h
src/basic/kbd-util.c [deleted file]
src/basic/log.c
src/basic/log.h
src/basic/meson.build
src/basic/missing_syscalls.py
src/basic/mountpoint-util.c
src/basic/namespace-util.c
src/basic/namespace-util.h
src/basic/os-util.c
src/basic/prioq.h
src/basic/process-util.c
src/basic/process-util.h
src/basic/ratelimit.c
src/basic/rm-rf.c
src/basic/rm-rf.h
src/basic/selinux-util.c
src/basic/socket-util.c
src/basic/socket-util.h
src/basic/string-util.c
src/basic/strv.c
src/basic/strv.h
src/basic/syscall-list.txt
src/basic/syscalls-alpha.txt
src/basic/syscalls-arc.txt
src/basic/syscalls-arm.txt
src/basic/syscalls-arm64.txt
src/basic/syscalls-i386.txt
src/basic/syscalls-ia64.txt
src/basic/syscalls-m68k.txt
src/basic/syscalls-mips64.txt
src/basic/syscalls-mips64n32.txt
src/basic/syscalls-mipso32.txt
src/basic/syscalls-powerpc.txt
src/basic/syscalls-powerpc64.txt
src/basic/syscalls-s390.txt
src/basic/syscalls-s390x.txt
src/basic/syscalls-sparc.txt
src/basic/syscalls-x86_64.txt
src/basic/sysctl-util.c [moved from src/shared/sysctl-util.c with 94% similarity]
src/basic/sysctl-util.h [moved from src/shared/sysctl-util.h with 100% similarity]
src/basic/terminal-util.c
src/basic/user-util.c
src/basic/utf8.c
src/basic/utf8.h
src/basic/xattr-util.c
src/boot/bootctl.c
src/boot/efi/boot.c
src/boot/efi/console.c
src/boot/efi/console.h
src/boot/efi/meson.build
src/boot/efi/missing_efi.h
src/boot/efi/util.h
src/busctl/busctl.c
src/cgtop/cgtop.c
src/core/cgroup.c
src/core/core-varlink.c
src/core/dbus-execute.c
src/core/dbus-manager.c
src/core/dbus-service.c
src/core/dbus-unit.c
src/core/execute.c
src/core/execute.h
src/core/load-dropin.c
src/core/load-fragment-gperf.gperf.m4
src/core/load-fragment.c
src/core/load-fragment.h
src/core/main.c
src/core/manager.c
src/core/mount.c
src/core/namespace.c
src/core/namespace.h
src/core/service.c
src/core/service.h
src/core/socket.c
src/core/system.conf.in
src/core/transaction.c
src/coredump/coredump-vacuum.c
src/coredump/coredump.c
src/coredump/coredump.conf
src/coredump/coredumpctl.c
src/coredump/test-coredump-vacuum.c
src/cryptenroll/cryptenroll-tpm2.c
src/cryptsetup/cryptsetup-fido2.c
src/cryptsetup/cryptsetup-generator.c
src/cryptsetup/cryptsetup-pkcs11.c
src/cryptsetup/cryptsetup-tpm2.c
src/cryptsetup/cryptsetup.c
src/dissect/dissect.c
src/firstboot/firstboot.c
src/fstab-generator/fstab-generator.c
src/fuzz/fuzz-main.c
src/fuzz/meson.build
src/home/homectl.c
src/home/homed-home-bus.c
src/home/homed-home.c
src/home/homed-manager-bus.c
src/home/homed-manager.c
src/home/homed.conf
src/home/homework-fscrypt.c
src/home/homework-luks.c
src/import/export-raw.c
src/import/export-tar.c
src/import/import-raw.c
src/import/import-tar.c
src/import/importd.c
src/import/pull-job.c
src/import/pull-raw.c
src/journal-remote/journal-gatewayd.c
src/journal-remote/journal-remote-main.c
src/journal-remote/journal-remote-write.c
src/journal-remote/journal-remote.c
src/journal-remote/journal-upload-journal.c
src/journal-remote/journal-upload.c
src/journal-remote/microhttpd-util.c
src/journal/fuzz-journald-stream.c
src/journal/journalctl.c
src/journal/journald-context.c
src/journal/journald-native.c
src/journal/journald-server.c
src/journal/journald-stream.c
src/journal/journald.conf
src/journal/test-journal-config.c
src/libsystemd-network/dhcp-internal.h
src/libsystemd-network/dhcp-server-internal.h
src/libsystemd-network/dhcp6-internal.h
src/libsystemd-network/dhcp6-option.c
src/libsystemd-network/fuzz-dhcp6-client.c
src/libsystemd-network/fuzz-ndisc-rs.c
src/libsystemd-network/lldp-internal.h
src/libsystemd-network/lldp-neighbor.c
src/libsystemd-network/lldp-network.c
src/libsystemd-network/meson.build
src/libsystemd-network/ndisc-internal.h
src/libsystemd-network/ndisc-router.c
src/libsystemd-network/ndisc-router.h
src/libsystemd-network/network-common.c [new file with mode: 0644]
src/libsystemd-network/network-common.h [new file with mode: 0644]
src/libsystemd-network/radv-internal.h
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp-lease.c
src/libsystemd-network/sd-dhcp-server.c
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-dhcp6-lease.c
src/libsystemd-network/sd-ipv4acd.c
src/libsystemd-network/sd-ipv4ll.c
src/libsystemd-network/sd-lldp.c
src/libsystemd-network/sd-ndisc.c
src/libsystemd-network/sd-radv.c
src/libsystemd-network/test-dhcp-client.c
src/libsystemd-network/test-dhcp6-client.c
src/libsystemd-network/test-ipv4ll.c
src/libsystemd/meson.build
src/libsystemd/sd-bus/bus-control.c
src/libsystemd/sd-bus/bus-creds.c
src/libsystemd/sd-bus/bus-dump.c
src/libsystemd/sd-bus/bus-error.h
src/libsystemd/sd-bus/bus-internal.h
src/libsystemd/sd-bus/bus-match.c
src/libsystemd/sd-bus/bus-match.h
src/libsystemd/sd-bus/bus-message.c
src/libsystemd/sd-bus/bus-socket.c
src/libsystemd/sd-bus/fuzz-bus-match.c [new file with mode: 0644]
src/libsystemd/sd-bus/fuzz-bus-message.c [moved from src/fuzz/fuzz-bus-message.c with 100% similarity]
src/libsystemd/sd-bus/sd-bus.c
src/libsystemd/sd-bus/test-bus-chat.c
src/libsystemd/sd-bus/test-bus-match.c
src/libsystemd/sd-bus/test-bus-objects.c
src/libsystemd/sd-bus/test-bus-server.c
src/libsystemd/sd-device/device-enumerator.c
src/libsystemd/sd-device/device-monitor.c
src/libsystemd/sd-device/device-private.c
src/libsystemd/sd-device/sd-device.c
src/libsystemd/sd-device/test-sd-device-thread.c
src/libsystemd/sd-event/sd-event.c
src/libsystemd/sd-event/test-event.c
src/libsystemd/sd-journal/compress.c
src/libsystemd/sd-journal/journal-file.c
src/libsystemd/sd-journal/sd-journal.c
src/libsystemd/sd-journal/test-journal-interleaving.c
src/libsystemd/sd-journal/test-journal-stream.c
src/libsystemd/sd-journal/test-journal-verify.c
src/libsystemd/sd-journal/test-journal.c
src/libsystemd/sd-login/sd-login.c
src/libsystemd/sd-login/test-login.c
src/libsystemd/sd-netlink/generic-netlink.c
src/libsystemd/sd-netlink/netlink-message.c
src/libsystemd/sd-netlink/netlink-socket.c
src/libsystemd/sd-netlink/nfnl-message.c
src/libsystemd/sd-netlink/sd-netlink.c
src/libsystemd/sd-network/sd-network.c
src/libsystemd/sd-resolve/sd-resolve.c
src/libudev/libudev-monitor.c
src/libudev/test-udev-device-thread.c
src/locale/localed.c
src/login/inhibit.c
src/login/loginctl.c
src/login/logind-brightness.c
src/login/logind-dbus.c
src/login/logind.c
src/login/logind.conf.in
src/login/org.freedesktop.login1.conf
src/login/pam_systemd.c
src/login/sysfs-show.c
src/machine/machine-dbus.c
src/machine/machinectl.c
src/machine/machined-dbus.c
src/mount/mount-tool.c
src/network/meson.build
src/network/netdev/batadv.c
src/network/netdev/netdev.c
src/network/netdev/tunnel.c
src/network/networkctl.c
src/network/networkd-dhcp4.c
src/network/networkd-link-bus.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-lldp-rx.c
src/network/networkd-manager.c
src/network/networkd-manager.h
src/network/networkd-ndisc.c
src/network/networkd-network.c
src/network/networkd-sriov.c
src/network/networkd-state-file.c [new file with mode: 0644]
src/network/networkd-state-file.h [new file with mode: 0644]
src/network/networkd.c
src/network/wait-online/manager.c
src/notify/notify.c
src/nspawn/nspawn-oci.c
src/nspawn/nspawn-settings.c
src/nspawn/nspawn.c
src/oom/oomctl.c
src/oom/oomd-manager.c
src/oom/oomd-manager.h
src/oom/oomd-util.c
src/oom/oomd-util.h
src/oom/oomd.c
src/oom/oomd.conf
src/oom/test-oomd-util.c
src/partition/repart.c
src/partition/test-repart.sh
src/portable/portablectl.c
src/portable/portabled-bus.c
src/pstore/pstore.c
src/resolve/meson.build
src/resolve/resolvectl.c
src/resolve/resolved-bus.c
src/resolve/resolved-conf.c
src/resolve/resolved-dns-answer.c
src/resolve/resolved-dns-answer.h
src/resolve/resolved-dns-cache.c
src/resolve/resolved-dns-dnssec.c
src/resolve/resolved-dns-packet.c
src/resolve/resolved-dns-query.c
src/resolve/resolved-dns-query.h
src/resolve/resolved-dns-question.c
src/resolve/resolved-dns-question.h
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-rr.h
src/resolve/resolved-dns-server.c
src/resolve/resolved-dns-stub.c
src/resolve/resolved-dns-synthesize.c
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-manager.c
src/resolve/resolved-mdns.c
src/resolve/resolved-util.c [new file with mode: 0644]
src/resolve/resolved-util.h [new file with mode: 0644]
src/resolve/resolved-varlink.c
src/resolve/resolved.conf.in
src/run/run.c
src/shared/acpi-fpdt.c
src/shared/ask-password-api.c
src/shared/barrier.c
src/shared/bitmap.c
src/shared/bus-get-properties.c
src/shared/bus-print-properties.c
src/shared/bus-unit-util.c
src/shared/bus-util.c
src/shared/bus-wait-for-jobs.c
src/shared/bus-wait-for-units.c
src/shared/calendarspec.c
src/shared/conf-parser.c
src/shared/conf-parser.h
src/shared/dissect-image.c
src/shared/dissect-image.h
src/shared/efi-loader.c
src/shared/firewall-util-nft.c
src/shared/firewall-util-private.h
src/shared/firewall-util.c
src/shared/firewall-util.h
src/shared/format-table.c
src/shared/format-table.h
src/shared/fstab-util.c
src/shared/fstab-util.h
src/shared/generator.c
src/shared/gpt.c
src/shared/gpt.h
src/shared/install.c
src/shared/install.h
src/shared/json.c
src/shared/json.h
src/shared/kbd-util.c [new file with mode: 0644]
src/shared/kbd-util.h [moved from src/basic/kbd-util.h with 94% similarity]
src/shared/local-addresses.c
src/shared/logs-show.c
src/shared/meson.build
src/shared/nsflags.c
src/shared/nsflags.h
src/shared/pager.c
src/shared/ptyfwd.c
src/shared/seccomp-util.c
src/shared/udev-util.c
src/shared/user-record.c
src/shared/varlink.c
src/shared/verbs.h
src/shutdown/shutdown.c
src/stdio-bridge/stdio-bridge.c
src/sysext/sysext.c
src/systemctl/systemctl-edit.c
src/systemctl/systemctl-list-units.c
src/systemctl/systemctl-show.c
src/systemd/sd-dhcp-client.h
src/systemd/sd-dhcp-server.h
src/systemd/sd-dhcp6-client.h
src/systemd/sd-ipv4acd.h
src/systemd/sd-ipv4ll.h
src/systemd/sd-lldp.h
src/systemd/sd-ndisc.h
src/systemd/sd-radv.h
src/systemd/sd-resolve.h
src/sysusers/sysusers.c
src/test/meson.build
src/test/test-bitmap.c
src/test/test-calendarspec.c
src/test/test-copy.c
src/test/test-device-nodes.c
src/test/test-execute.c
src/test/test-extract-word.c
src/test/test-fileio.c
src/test/test-firewall-util.c
src/test/test-format-table.c
src/test/test-fs-util.c
src/test/test-fstab-util.c
src/test/test-hexdecoct.c
src/test/test-namespace.c
src/test/test-parse-util.c
src/test/test-path-util.c
src/test/test-prioq.c
src/test/test-process-util.c
src/test/test-random-util.c
src/test/test-seccomp.c
src/test/test-socket-netlink.c
src/test/test-socket-util.c
src/test/test-stat-util.c
src/test/test-string-util.c
src/test/test-strv.c
src/test/test-utf8.c
src/timedate/timedated.c
src/timesync/timesyncd-manager.c
src/tty-ask-password-agent/tty-ask-password-agent.c
src/udev/net/link-config.c
src/udev/udev-event.c
src/udev/udev-rules.c
src/userdb/userdbctl.c
src/veritysetup/veritysetup-generator.c
src/xdg-autostart-generator/xdg-autostart-service.c
sysctl.d/README [new file with mode: 0644]
sysctl.d/meson.build
sysusers.d/README [new file with mode: 0644]
sysusers.d/basic.conf.in
sysusers.d/meson.build
test/TEST-17-UDEV-WANTS/test.sh [deleted file]
test/TEST-17-UDEV/Makefile [moved from test/TEST-17-UDEV-WANTS/Makefile with 100% similarity]
test/TEST-17-UDEV/test.sh [moved from test/TEST-29-UDEV-ID_RENAMING/test.sh with 61% similarity]
test/TEST-22-TMPFILES/test.sh
test/TEST-29-PORTABLE/Makefile [moved from test/TEST-29-UDEV-ID_RENAMING/Makefile with 100% similarity]
test/TEST-29-PORTABLE/test.sh [moved from test/TEST-58-PORTABLE/test.sh with 97% similarity]
test/TEST-49-RUNTIME-BIND-PATHS/Makefile [moved from test/TEST-49-UDEV-EVENT-TIMEOUT/Makefile with 100% similarity]
test/TEST-49-RUNTIME-BIND-PATHS/test.sh [moved from test/TEST-57-RUNTIME-BIND-PATHS/test.sh with 89% similarity]
test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh [deleted file]
test/TEST-55-OOMD/Makefile [moved from test/TEST-55-UDEV-TAGS/Makefile with 100% similarity]
test/TEST-55-OOMD/test.sh [moved from test/TEST-56-OOMD/test.sh with 98% similarity]
test/TEST-55-UDEV-TAGS/test.sh [deleted file]
test/TEST-56-EXIT-TYPE/Makefile [moved from test/TEST-56-OOMD/Makefile with 100% similarity]
test/TEST-56-EXIT-TYPE/test.sh [new file with mode: 0755]
test/TEST-57-RUNTIME-BIND-PATHS/Makefile [deleted symlink]
test/TEST-58-PORTABLE/Makefile [deleted symlink]
test/fuzz/fuzz-bus-match/bugzilla1935084.input [new file with mode: 0644]
test/fuzz/fuzz-bus-match/test.input [new file with mode: 0644]
test/fuzz/fuzz-unit-file/directives.service
test/test-execute/exec-systemcallfilter-with-errno-in-allow-list.service [new file with mode: 0644]
test/test-functions
test/units/testsuite-15.sh
test/units/testsuite-17.01.sh [new file with mode: 0755]
test/units/testsuite-17.02.sh [new file with mode: 0755]
test/units/testsuite-17.03.sh [new file with mode: 0755]
test/units/testsuite-17.04.sh [new file with mode: 0755]
test/units/testsuite-17.05.sh [new file with mode: 0755]
test/units/testsuite-17.service
test/units/testsuite-17.sh
test/units/testsuite-29.service
test/units/testsuite-29.sh
test/units/testsuite-49-namespaced.service [moved from test/units/testsuite-57-namespaced.service with 89% similarity]
test/units/testsuite-49-non-namespaced.service [moved from test/units/testsuite-57-non-namespaced.service with 100% similarity]
test/units/testsuite-49.service
test/units/testsuite-49.sh
test/units/testsuite-50.sh
test/units/testsuite-55-slowgrowth.sh [moved from test/units/testsuite-56-slowgrowth.sh with 100% similarity]
test/units/testsuite-55-testbloat.service [moved from test/units/testsuite-56-testbloat.service with 68% similarity]
test/units/testsuite-55-testchill.service [moved from test/units/testsuite-56-testchill.service with 68% similarity]
test/units/testsuite-55-testmunch.service [new file with mode: 0644]
test/units/testsuite-55-workload.slice [moved from test/units/testsuite-56-workload.slice with 100% similarity]
test/units/testsuite-55.service
test/units/testsuite-55.sh
test/units/testsuite-56-testmunch.service [deleted file]
test/units/testsuite-56.service
test/units/testsuite-56.sh
test/units/testsuite-57.service [deleted file]
test/units/testsuite-57.sh [deleted file]
test/units/testsuite-58.service [deleted file]
test/units/testsuite-58.sh [deleted file]
tmpfiles.d/README [new file with mode: 0644]
tmpfiles.d/meson.build
tools/chromiumos/gen_autosuspend_rules.py
tools/git-contrib.sh
units/systemd-localed.service.in

index 61e4b984a567bd00e5735b502dcd918f81196b5c..ca8213863c1133e959516c5119b0fd099134f2a1 100644 (file)
@@ -7,8 +7,10 @@ about: A report of an error in a recent systemd version
 **systemd version the issue has been seen with**
  > …
 
-<!-- **NOTE:** Do not submit bug reports about anything but the two most recently released (non-rc) systemd versions upstream! -->
-<!-- See https://github.com/systemd/systemd/releases for the list of most recent releases. -->
+<!-- **NOTE:** Do not submit bug reports about anything but the two most recently released *major* systemd versions upstream! -->
+<!--           If there have been multiple stable releases for that major version, please consider updating to a recent one before reporting an issue. -->
+<!--           When using a distro package, please make sure that the version reported is meaningful for upstream. -->
+<!-- See https://github.com/systemd/systemd-stable/releases for the list of most recent releases. -->
 <!-- For older version please use distribution trackers (see https://systemd.io/CONTRIBUTING#filing-issues). -->
 
 **Used distribution**
index 662ea13a609f11c53599ded097eb23d972f7d673..7abaedc87996f3f127afbf35042b777052327395 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -115,12 +115,14 @@ Michael Biebl <biebl@debian.org> <mbiebl@gmail.com>
 Michael Buesch <mbuesch@freenet.de>
 Michael Hoy <rimmington@gmail.com>
 Michael Olbrich <m.olbrich@pengutronix.de>
+Michael Trapp <michael.trapp@sap.com>
 Michal Soltys <soltys@ziu.info> <nozo@ziu.info>
 Michal Suchanek <msuchanek@suse.de>
 Michal Suchanek <msuchanek@suse.de> <hramrach@gmail.com>
 Michal Sekletár <msekleta@redhat.com>
 Michał Szczepański <skrzatu@hotmail.com> <skrzatu@gmail.com>
 Michel Kraus <github@demonsphere.de> <27o@users.noreply.github.com>
+Michele Guerini Rocco <rnhmjoj@inventati.org>
 Miklos Vajna <vmiklos@frugalware.org> <vmiklos@gmail.com>
 Milan Pässler <me@petabyteboy.de>
 Neil Brown <neil@brown.name>
@@ -209,3 +211,4 @@ Andrey Yashkin <38919268+AndreyYashkin@users.noreply.github.com>
 Ronald Tschalär <ronald@innovation.ch>
 Jay Burger <jay.burger@fujitsu.com> <root@new-host-3.home>
 Yi Gao <ymuemc@163.com>
+Weblate <noreply@weblate.org>
index e1ace861ddc4cdd78c7c22a3f88ce3e568f9a331..75f9d3abc9c3eebf93d4611a0a673e4f6cd57eab 100644 (file)
@@ -21,19 +21,14 @@ actions:
     # Drop backported patches from the specfile, but keep the downstream-only ones
     # - Patch0000-0499: backported patches from upstream
     # - Patch0500-9999: downstream-only patches
-    - "sed -ri '/^Patch0[0-4][0-9]{2}+\\:.+\\.patch/d' .packit_rpm/systemd.spec"
-    # Build the RPMs with -Werror to catch possible compiler warnings. Since
-    # --werror in meson doesn't seem to work with -Db_lto=true [0], let's use
-    # -Dc_args= and -Dcpp_args= instead.
-    #
-    # Exceptions:
-    #   - use -Wno-deprecated-declarations to get around mallinfo() use in
-    #     basic/selinux-util.c
-    #   - don't use -Werror on x86 architectures, otherwise all function checks
-    #     will fail (with error: cast from pointer to integer of different size)
+    - "sed -ri '/^Patch0[0-4]?[0-9]{0,2}\\:.+\\.patch/d' .packit_rpm/systemd.spec"
+    # Build the RPM with --werror. Even though --werror doesn't work in all
+    # cases (see [0]), we can't use -Dc_args=/-Dcpp_args= here because of the
+    # RPM hardening macros, that use $CFLAGS/$CPPFLAGS (see [1]).
     #
     # [0] https://github.com/mesonbuild/meson/issues/7360
-    - 'sed -i "/^CONFIGURE_OPTS=(/a%ifnarch i386 i686\n-Dc_args=\"-Werror -Wno-deprecated-declarations\" -Dcpp_args=\"-Werror -Wno-deprecated-declarations\"\n%endif" .packit_rpm/systemd.spec'
+    # [1] https://github.com/systemd/systemd/pull/18908#issuecomment-792250110
+    - 'sed -i "/^CONFIGURE_OPTS=(/a--werror" .packit_rpm/systemd.spec'
 
 jobs:
 - job: copr_build
diff --git a/NEWS b/NEWS
index 3a3004543f2848df2b50cfea2748324752d71fa0..52c646f864b6610b7474a89bbcbb9ca1118cb8d0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,10 @@ CHANGES WITH 248:
           file hierarchy of specific services, following the same rules and
           constraints.
 
+        * Support for a new special "root=tmpfs" kernel command-line option has
+          been added. When specified, a tmpfs is mounted on /, and mount.usr=
+          should be used to point to the operating system implementation.
+
         * A new configuration file /etc/veritytab may be used to configure
           dm-verity integrity protection for block devices. Each line is in the
           format "volume-name data-device hash-device roothash options",
@@ -123,6 +127,13 @@ CHANGES WITH 248:
           unified v2 cgroup hierarchy is used, and "v1" means that legacy v1
           hierarchy or the hybrid hierarchy are used.
 
+        * A new PrivateIPC= setting on a unit file allows executed processes to
+          be moved into a private IPC namespace, with separate System V IPC
+          identifiers and POSIX message queues.
+
+          A new IPCNamespacePath= allows the unit to be joined to an existing
+          IPC namespace.
+
         * The tables of system calls in seccomp filters are now automatically
           generated from kernel lists exported on
           https://fedora.juszkiewicz.com.pl/syscalls.html.
@@ -185,6 +196,13 @@ CHANGES WITH 248:
           GenericSegmentOffloadMaxSegments= allow capping the packet size and
           the number of segments accepted in Generic Segment Offload.
 
+        * systemd-networkd gained support for the "B.A.T.M.A.N. advanced"
+          wireless routing protocol that operates on ISO/OSI Layer 2 only and
+          uses ethernet frames to route/bridge packets. This encompasses a new
+          "batadv" netdev Type=, a new [BatmanAdvanced] section with a bunch of
+          new settings in .netdev files, and a new BatmanAdvanced= setting in
+          .network files.
+
         * systemd.network files gained a [Network] RouteTable= configuration
           switch to select the routing policy table.
 
@@ -203,10 +221,10 @@ CHANGES WITH 248:
           systemd.network files gained a [DHCPv6PrefixDelegation]
           ManageTemporaryAddress= switch.
 
-          .network files gained a new ActivationPolicy= setting which allows
-          configuration how the UP state of an interface shall be managed,
+          systemd.network files gained a new ActivationPolicy= setting which
+          allows configuring how the UP state of an interface shall be managed,
           i.e. whether the interface is always upped, always downed, or may be
-          upped/downed by the user using "ip dev".
+          upped/downed by the user using "ip link set dev".
 
         * The default for the Broadcast= setting in .network files has slightly
           changed: the broadcast address will not be configured for wireguard
@@ -362,6 +380,12 @@ CHANGES WITH 248:
           "tainted", to make it clearer that using the legacy hierarchy is not
           recommended.
 
+        * systemd-localed will now refuse to configure a keymap which is not
+          installed in the file system. This is intended as a bug fix, but
+          could break cases where systemd-localed was used to configure the
+          keymap in advanced of it being installed. It is necessary to install
+          the keymap file first.
+
         * The main git development branch has been renamed to 'main'.
 
         * mmcblk[0-9]boot[0-9] devices will no longer be probed automatically
@@ -413,37 +437,48 @@ CHANGES WITH 248:
         * portablectl gained a new "reattach" verb for detaching/reattaching a
           portable service image, useful for updating images on-the-fly.
 
-        Contributions from: Adam Nielsen, Adrian Vovk, AJ Jordan, Alan Perry,
-        Alexander Batischev, Ali Abdallah, Andrew Balmos, Anita Zhang, Ansgar
-        Burchardt, Antonius Frie, Ardy, Arian van Putten, Ariel Fermani, Arnaud
-        T, A S Alam, Bastien Nocera, Benjamin Berg, Benjamin Robin, Björn
-        Daase, chri2, Christian Ehrhardt, Christian Hesse, Christopher Obbard,
-        clayton craft, corvusnix, cprn, d032747, Daan De Meyer, Daniele Medri,
-        Dan Streetman, Darren Ng, David Edmundson, Deepak Rawat, Devon Pringle,
-        Dmitry Borodaenko, dropsignal, Einsler Lee, Endre Szabo, Evgeny
-        Vereshchagin, Fabian Affolter, Felipe Borges, feliperodriguesfr, Felix
-        Stupp, Florian Hülsmann, Florian Klink, Florian Westphal, Franck Bui,
-        Frantisek Sumsal, Gablegritule, Gaël PORTAY, Gaurav, Giedrius
-        Statkevičius, Greg Depoire--Ferrer, Hans de Goede, heretoenhance, Iago
-        López Galeiras, igo95862, Ilya Dmitrichenko, Jameer Pathan, Jan Tojnar,
-        Jiehong, Jinyuan Si, John Slade, Jonathan G. Underwood, Jonathan
-        McDowell, Josh Triplett, Joshua Watt, Julia Cartwright, Julien Humbert,
-        Kairui Song, Karel Zak, Kevin P. Fleming, Khem Raj, Konomi, krissgjeng,
-        l4gfcm, Lennart Poettering, Luca Boccassi, Luca BRUNO, Lucas
-        Werkmeister, Luka Kudra, Luna Jernberg, Marc-André Lureau, Matthias
-        Klumpp, Matt Turner, Michael Marley, Michal Fabik, Michał Kopeć, Michal
-        Sekletár, Mike Gilbert, milovlad, moson-mo, Nick, nihilix-melix, Oğuz
-        Ersen, Ondrej Mosnacek, pali, Pavel Hrdina, Pavel Sapezhko, Peter
-        Hutterer, Pierre Dubouilh, Piotr Drąg, Richard Laager, rnhmjoj,
-        RussianNeuroMancer, Sebastiaan van Stijn, Sergey Bugaev, shenyangyang4,
-        Simonas Kazlauskas, Stefan Agner, Steve Ramage, Susant Sahani, Sven
-        Mueller, Tad Fisher, Takashi Iwai, Thomas Haller, Topi Miettinen,
-        Torsten Hilbrich, Tyler Hicks, Ulrich Ölmann, Vinnie Magro, Vito
-        Caputo, Vlad, walbit-de, Weblate, Weblate (bot), Whired Planck, wouter
-        bolsterlee, Yuri Chornoivan, Yu Watanabe, Zach Smith, Zbigniew
-        Jędrzejewski-Szmek, Zmicer Turok, Дамјан Георгиевски
-
-        — Warsaw, 2021-02-23
+        * Intel SGX enclave device nodes (which expose a security feature of
+          newer Intel CPUs) will now be owned by a new system group "sgx".
+
+        Contributions from: Adam Nielsen, Adrian Vovk, AJ Jordan, Alan Perry,
+        Alastair Pharo, Alexander Batischev, Ali Abdallah, Andrew Balmos,
+        Anita Zhang, Annika Wickert, Ansgar Burchardt, Antonio Terceiro,
+        Antonius Frie, Ardy, Arian van Putten, Ariel Fermani, Arnaud T,
+        A S Alam, Bastien Nocera, Benjamin Berg, Benjamin Robin, Björn Daase,
+        caoxia, Carlo Wood, Charles Lee, ChopperRob, chri2, Christian Ehrhardt,
+        Christian Hesse, Christopher Obbard, clayton craft, corvusnix, cprn,
+        Daan De Meyer, Daniele Medri, Daniel Rusek, Dan Sanders, Dan Streetman,
+        Darren Ng, David Edmundson, David Tardon, Deepak Rawat, Devon Pringle,
+        Dmitry Borodaenko, dropsignal, Einsler Lee, Endre Szabo,
+        Evgeny Vereshchagin, Fabian Affolter, Fangrui Song, Felipe Borges,
+        feliperodriguesfr, Felix Stupp, Florian Hülsmann, Florian Klink,
+        Florian Westphal, Franck Bui, Frantisek Sumsal, Gablegritule,
+        Gaël PORTAY, Gaurav, Giedrius Statkevičius, Greg Depoire-Ferrer,
+        Gustavo Costa, Hans de Goede, Hela Basa, heretoenhance, hide,
+        Iago López Galeiras, igo95862, Ilya Dmitrichenko, Jameer Pathan,
+        Jan Tojnar, Jiehong, Jinyuan Si, Joerg Behrmann, John Slade,
+        Jonathan G. Underwood, Jonathan McDowell, Josh Triplett, Joshua Watt,
+        Julia Cartwright, Julien Humbert, Kairui Song, Karel Zak,
+        Kevin Backhouse, Kevin P. Fleming, Khem Raj, Konomi, krissgjeng,
+        l4gfcm, Lajos Veres, Lennart Poettering, Lincoln Ramsay, Luca Boccassi,
+        Luca BRUNO, Lucas Werkmeister, Luka Kudra, Luna Jernberg,
+        Marc-André Lureau, Martin Wilck, Matthias Klumpp, Matt Turner,
+        Michael Gisbers, Michael Marley, Michael Trapp, Michal Fabik,
+        Michał Kopeć, Michal Koutný, Michal Sekletár, Michele Guerini Rocco,
+        Mike Gilbert, milovlad, moson-mo, Nick, nihilix-melix, Oğuz Ersen,
+        Ondrej Mosnacek, pali, Pavel Hrdina, Pavel Sapezhko, Perry Yuan,
+        Peter Hutterer, Pierre Dubouilh, Piotr Drąg, Pjotr Vertaalt,
+        Richard Laager, RussianNeuroMancer, Sam Lunt, Sebastiaan van Stijn,
+        Sergey Bugaev, shenyangyang4, simmon, Simonas Kazlauskas,
+        Slimane Selyan Amiri, Stefan Agner, Steve Ramage, Susant Sahani,
+        Sven Mueller, Tad Fisher, Takashi Iwai, Thomas Haller, Tom Shield,
+        Topi Miettinen, Torsten Hilbrich, tpgxyz, Tyler Hicks, ulf-f,
+        Ulrich Ölmann, Vincent Pelletier, Vinnie Magro, Vito Caputo, Vlad,
+        walbit-de, Whired Planck, wouter bolsterlee, Xℹ Ruoyao, Yangyang Shen,
+        Yuri Chornoivan, Yu Watanabe, Zach Smith, Zbigniew Jędrzejewski-Szmek,
+        Zmicer Turok, Дамјан Георгиевски
+
+        — Berlin, 2021-03-30
 
 CHANGES WITH 247:
 
diff --git a/TODO b/TODO
index 87a92af8061aa2a1b3b2f05ff23c59c6cb7c3b59..451d9f34c0bd9547f0940ea427050a19b0eaa912 100644 (file)
--- a/TODO
+++ b/TODO
@@ -7,6 +7,8 @@ Bugfixes:
 * userdbctl: "Password OK: yes" is shown even when there are no passwords
   or the password is locked.
 
+* Get rid of nftw(). We should refuse to use such useless APIs on principle.
+
 External:
 
 * Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
@@ -20,6 +22,50 @@ Janitorial Clean-ups:
 
 Features:
 
+* maybe add a tool that displays most recent journal logs as QR code to scan
+  off screen and run it automatically on boot failures, emergency logs and
+  such. Use DRM APIs directly, see
+  https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset.c for an example
+  for doing that.
+
+* pass systemd-detect-virt result to generators as env var. Modifying behaviour
+  based on whether we are virtualized or not is a pretty common thing, hence
+  maybe just pass that info along for free in an env var. We cache the result
+  anyway, so it's basically free.
+
+* systemd-repart: read LUKS encryption key from $CREDENTIALS_PATH
+
+* introduce /dev/disk/root/* symlinks that allow referencing partitions on the
+  disk the rootfs is on in a reasonably secure way.
+
+* systemd-repart: add a switch to factory reset the partition table without
+  immediately applying the new configuration again. i.e. --factory-reset=leave
+  or so. (this is useful to factory reset an image, then putting it into
+  another machine, ensuring that luks key is generated on new machine, not old)
+
+* move logind udev rules to top-level rule.d/ directory
+
+* move multiseat vid/pid matches from logind udev rule to hwdb
+
+* nspawn: default to 1:1 userns
+
+* Provide a reasonably bespoke solution for mounting host $HOME directories
+  into containers:
+  • add new option --mount-user=$USER for mounting $HOME of the user into the
+    container at the same place
+  • check /etc/passwd for UID or user name clashes. If UID clash pick a different
+    UID in container, and map via userns. If user name clash, refuse. If
+    matching user already exists use that.
+  • otherwise: write user record of specified user into /run/host/passwd or so
+  • in nss-systemd pick up user record from there and make available to system
+  With all that in place if nspawn host and container payload are up-to-date
+  enough we have a very simple way to make host users available in containers.
+
+* systemd-sysusers: pick up passwords from credentials logic, so that users can
+  easily set root user pw. enable cred inheriting for root user from PID 1, so
+  that for containers we can configure the root pw automatically via nspawn's
+  --set-credential= switch. (Also do this for systemd-firstboot)
+
 * whenever we receive fds via SCM_RIGHTS make sure none got dropped due to the
   reception limit the kernel silently enforces.
 
index f6cc8ba68a08aac2ddbb286e58171bf452bd45d5..22620f184903b470ea3bc9645977d556e599ff9d 100644 (file)
@@ -8,7 +8,8 @@ position p : script:python() {
                  p[0].current_element == "log_set_max_level_realm" or
                  p[0].current_element == "unichar_is_valid")
         };
-expression x, y;
+expression x;
+constant y;
 @@
 (
 - ((x@p) & (y)) == (y)
index 871547a881d20c6a0b3dba06d64329976573b7d1..d1af412acce427636e788e75194531a578871de5 100755 (executable)
@@ -7,6 +7,7 @@ EXCLUDED_PATHS=(
     "src/basic/linux/*"
     # Symlinked to test-bus-vtable-cc.cc, which causes issues with the IN_SET macro
     "src/libsystemd/sd-bus/test-bus-vtable.c"
+    "src/libsystemd/sd-journal/lookup3.c"
 )
 
 top="$(git rev-parse --show-toplevel)"
index a6236eb0f9686e26236b405610b281adfe8583ff..b2096334805a61153f6653f34a9cd76312089a79 100644 (file)
@@ -1,6 +1,7 @@
 @@
+position p : script:python() { p[0].current_element != "test_strjoina" };
 expression n, m;
 expression list s;
 @@
-- n = strjoina(m, s, NULL);
+- n = strjoina@p(m, s, NULL);
 + n = strjoina(m, s);
index 851676bc2bda1bdcb0d16083cc0968d41f0daf83..e4b0d91833c28198c554a0ce20fa5f7e73701ef3 100644 (file)
@@ -587,6 +587,12 @@ layout: default
   time you need that please immediately undefine `basename()`, and add a
   comment about it, so that no code ever ends up using the POSIX version!
 
+- Never use `FILENAME_MAX`. Use `PATH_MAX` instead (for checking maximum size
+  of paths) and `NAME_MAX` (for checking maximum size of filenames).
+  `FILENAME_MAX` is not POSIX, and is a confusingly named alias for `PATH_MAX`
+  on Linux. Note the `NAME_MAX` does not include space for a trailing `NUL`,
+  but `PATH_MAX` does. UNIX FTW!
+
 ## Committing to git
 
 - Commit message subject lines should be prefixed with an appropriate component
index ab10a4fc7e8a4747ed5093ad319171a563b5ac14..ad2d3ad84b8edef0d3bd2c41a73586bfd9c3bc4a 100644 (file)
@@ -301,3 +301,15 @@ installed systemd tests:
 
 * `$SYSTEMD_SYSVRCND_PATH` — Controls where `systemd-sysv-generator` looks for
   SysV init script runlevel link farms.
+
+fuzzers:
+
+* `$SYSTEMD_FUZZ_OUTPUT` — A boolean that specifies whether to write output to
+  stdout. Setting to true is useful in manual invocations, since all output is
+  suppressed by default.
+
+* `$SYSTEMD_FUZZ_RUNS` — The number of times execution should be repeated in
+  manual invocations.
+
+Note that is may be also useful to set `$SYSTEMD_LOG_LEVEL`, since all logging
+is suppressed by default.
index 31a06515a114eec91b9caceb54eac5192f4db692..cafe766e0373e375497539b0c3fd86007b129c0f 100644 (file)
@@ -9,14 +9,15 @@ layout: default
 1. Add all items to NEWS
 2. Update the contributors list in NEWS (`meson compile -C build git-contrib`)
 3. Update the time and place in NEWS
-4. [RC1] Update version and library numbers in `meson.build`
-5. Check dbus docs with `meson compile -C build update-dbus-docs`
-6. Tag the release: `version=vXXX-rcY && git tag -s "${version}" -m "systemd ${version}"`
-7. Do `meson compile -C build`
-8. Make sure that the version string and package string match: `build/systemctl --version`
-9. Upload the documentation: `meson compile -C build doc-sync`
-10. [FINAL] Close the github milestone and open a new one (https://github.com/systemd/systemd/milestones)
-11. "Draft" a new release on github (https://github.com/systemd/systemd/releases/new), mark "This is a pre-release" if appropriate.
-12. Check that announcement to systemd-devel, with a copy&paste from NEWS, was sent. This should happen automatically.
-13. Update IRC topic (`/msg chanserv TOPIC #systemd Version NNN released`)
-14. [FINAL] Push commits to stable, create an empty -stable branch: `git push systemd-stable origin/master:master origin/master:refs/heads/${version}-stable`, and change the default branch to latest release (https://github.com/systemd/systemd-stable/settings/branches).
+4. Update hwb (`meson compile -C build update-hwdb update-hwdb-autosuspend`)
+5. [RC1] Update version and library numbers in `meson.build`
+6. Check dbus docs with `meson compile -C build update-dbus-docs`
+7. Tag the release: `version=vXXX-rcY && git tag -s "${version}" -m "systemd ${version}"`
+8. Do `meson compile -C build`
+9. Make sure that the version string and package string match: `build/systemctl --version`
+10. Upload the documentation: `meson compile -C build doc-sync`
+11. [FINAL] Close the github milestone and open a new one (https://github.com/systemd/systemd/milestones)
+12. "Draft" a new release on github (https://github.com/systemd/systemd/releases/new), mark "This is a pre-release" if appropriate.
+13. Check that announcement to systemd-devel, with a copy&paste from NEWS, was sent. This should happen automatically.
+14. Update IRC topic (`/msg chanserv TOPIC #systemd Version NNN released`)
+15. [FINAL] Push commits to stable, create an empty -stable branch: `git push systemd-stable origin/master:master origin/master:refs/heads/${version}-stable`, and change the default branch to latest release (https://github.com/systemd/systemd-stable/settings/branches).
index 9f69a3162a0d8e7cb1c08a51eba8f26dee2479af..9fa856ec21c91ecc6e42fd8f558f71a9714dbc37 100644 (file)
@@ -303,6 +303,7 @@ Most service unit settings are available for transient units.
 ✓ ExecStartPre=
 ✓ ExecStop=
 ✓ ExecStopPost=
+✓ ExitType=
 ✓ FileDescriptorStoreMax=
 ✓ GuessMainPID=
 ✓ NonBlocking=
index ec07b19f306b44b17332fac374e7ba022742d5c8..daafdf2dce0ca5b32613b68a72c9fc9073451f1e 100644 (file)
@@ -87,8 +87,8 @@ hyphen. A size limit is enforced: the minimum of `sysconf(_SC_LOGIN_NAME_MAX)`
 (typically 256 on Linux; rationale: this is how POSIX suggests to detect the
 limit), `UT_NAMESIZE-1` (typically 31 on Linux; rationale: names longer than
 this cannot correctly appear in `utmp`/`wtmp` and create ambiguity with login
-accounting) and `FILENAME_MAX` (4096 on Linux; rationale: user names typically
-appear in directory names, i.e. the home directory), thus MIN(256, 31, 4096) =
+accounting) and `NAME_MAX` (255 on Linux; rationale: user names typically
+appear in directory names, i.e. the home directory), thus MIN(256, 31, 255) =
 31.
 
 Note that these rules are both more strict and more relaxed than all of the
index 95289732b7b350353887b77a4e977303a2aa029c..e103a278c4032e0861770aa269e045c36a4df6f8 100644 (file)
@@ -1,5 +1,5 @@
 <footer class="site-footer">
-  <p>&copy; systemd, 2020</p>
+  <p>&copy; systemd, 2021</p>
 
-  <p><a href="https://github.com/systemd/systemd">Website source</a></p>
+  <p><a href="https://github.com/systemd/systemd/tree/main/docs">Website source</a></p>
 </footer>
index 13aa1916c50b963faf485b4ca82657b113eae6b9..5deed1b78504c93ba04ff7de2a754b40f38991a1 100644 (file)
@@ -2418,7 +2418,7 @@ OUI:000323*
  ID_OUI_FROM_DATABASE=Cornet Technology, Inc.
 
 OUI:000324*
- ID_OUI_FROM_DATABASE=SANYO Consumer Electronics Co., Ltd.
+ ID_OUI_FROM_DATABASE=SANYO Techno Solutions Tottori Co., Ltd.
 
 OUI:000325*
  ID_OUI_FROM_DATABASE=Arima Computer Corp.
@@ -8544,7 +8544,7 @@ OUI:000B39*
  ID_OUI_FROM_DATABASE=Keisoku Giken Co.,Ltd.
 
 OUI:000B3A*
- ID_OUI_FROM_DATABASE=QuStream Corporation
+ ID_OUI_FROM_DATABASE=PESA
 
 OUI:000B3B*
  ID_OUI_FROM_DATABASE=devolo AG
@@ -27045,7 +27045,7 @@ OUI:002288*
  ID_OUI_FROM_DATABASE=Sagrad, Inc.
 
 OUI:002289*
- ID_OUI_FROM_DATABASE=Vandelrande APC inc.
+ ID_OUI_FROM_DATABASE=Vanderlande APC inc.
 
 OUI:00228A*
  ID_OUI_FROM_DATABASE=Teratronik elektronische systeme gmbh
@@ -39339,7 +39339,7 @@ OUI:00E421*
  ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
 OUI:00E5E4*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:00E666*
  ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
@@ -39431,6 +39431,9 @@ OUI:00FA21*
 OUI:00FA3B*
  ID_OUI_FROM_DATABASE=CLOOS ELECTRONIC GMBH
 
+OUI:00FAB6*
+ ID_OUI_FROM_DATABASE=Kontakt Micro-Location Sp z o.o.
+
 OUI:00FC58*
  ID_OUI_FROM_DATABASE=WebSilicon Ltd.
 
@@ -39843,7 +39846,7 @@ OUI:046B1B*
  ID_OUI_FROM_DATABASE=SYSDINE Co., Ltd.
 
 OUI:046B25*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:046C59*
  ID_OUI_FROM_DATABASE=Intel Corporate
@@ -39908,6 +39911,9 @@ OUI:04714BD*
 OUI:04714BE*
  ID_OUI_FROM_DATABASE=Gimso Mobile Ltd
 
+OUI:047153*
+ ID_OUI_FROM_DATABASE=SERNET (SUZHOU) TECHNOLOGIES CORPORATION
+
 OUI:047295*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -40103,6 +40109,9 @@ OUI:04B466*
 OUI:04B648*
  ID_OUI_FROM_DATABASE=ZENNER
 
+OUI:04B9E3*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:04BA1C*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
@@ -40412,6 +40421,9 @@ OUI:04EE03*
 OUI:04EE91*
  ID_OUI_FROM_DATABASE=x-fabric GmbH
 
+OUI:04EEEE*
+ ID_OUI_FROM_DATABASE=Laplace System Co., Ltd.
+
 OUI:04F021*
  ID_OUI_FROM_DATABASE=Compex Systems Pte Ltd
 
@@ -40902,7 +40914,7 @@ OUI:080090*
  ID_OUI_FROM_DATABASE=SONOMA SYSTEMS
 
 OUI:08010F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:08028E*
  ID_OUI_FROM_DATABASE=NETGEAR
@@ -40919,6 +40931,9 @@ OUI:080581*
 OUI:0805CD*
  ID_OUI_FROM_DATABASE=DongGuang EnMai Electronic Product Co.Ltd.
 
+OUI:0805E2*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
 OUI:0808C2*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -41234,6 +41249,9 @@ OUI:0868EA*
 OUI:086A0A*
  ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
+OUI:086AC5*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:086BD1*
  ID_OUI_FROM_DATABASE=Shenzhen SuperElectron Technology Co.,Ltd.
 
@@ -41402,6 +41420,9 @@ OUI:08A6BC*
 OUI:08A7C0*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
+OUI:08A842*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:08A8A1*
  ID_OUI_FROM_DATABASE=Cyclotronics Power Concepts, Inc
 
@@ -41870,6 +41891,9 @@ OUI:0C41E9*
 OUI:0C42A1*
  ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
+OUI:0C4314*
+ ID_OUI_FROM_DATABASE=Silicon Laboratories
+
 OUI:0C45BA*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -41996,6 +42020,9 @@ OUI:0C5CD8*
 OUI:0C5F35*
  ID_OUI_FROM_DATABASE=Niagara Video Corporation
 
+OUI:0C6046*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:0C6076*
  ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
@@ -42194,6 +42221,9 @@ OUI:0C8CDC*
 OUI:0C8D98*
  ID_OUI_FROM_DATABASE=TOP EIGHT IND CORP
 
+OUI:0C8DCA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:0C8DDB*
  ID_OUI_FROM_DATABASE=Cisco Meraki
 
@@ -42233,6 +42263,9 @@ OUI:0C96E6*
 OUI:0C9838*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
+OUI:0C9A3C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:0C9A42*
  ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
@@ -42368,6 +42401,9 @@ OUI:0CC844*
 OUI:0CC9C6*
  ID_OUI_FROM_DATABASE=Samwin Hong Kong Limited
 
+OUI:0CCB0C*
+ ID_OUI_FROM_DATABASE=iSYS RTS GmbH
+
 OUI:0CCB85*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
@@ -42725,6 +42761,9 @@ OUI:1008B1*
 OUI:10090C*
  ID_OUI_FROM_DATABASE=Janome Sewing Machine Co., Ltd.
 
+OUI:1009F9*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:100BA9*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -42771,7 +42810,7 @@ OUI:101250*
  ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
 OUI:1012B4*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:1012FB*
  ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
@@ -42800,6 +42839,9 @@ OUI:101D51*
 OUI:101DC0*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:101EDA*
+ ID_OUI_FROM_DATABASE=INGENICO TERMINALS SAS
+
 OUI:101F74*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -42977,6 +43019,9 @@ OUI:105172*
 OUI:10521C*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
+OUI:105403*
+ ID_OUI_FROM_DATABASE=INTARSO GmbH
+
 OUI:105611*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -43055,6 +43100,9 @@ OUI:10683F*
 OUI:106F3F*
  ID_OUI_FROM_DATABASE=BUFFALO.INC
 
+OUI:106FD9*
+ ID_OUI_FROM_DATABASE=CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.
+
 OUI:106FEF*
  ID_OUI_FROM_DATABASE=Ad-Sol Nissin Corp
 
@@ -43106,6 +43154,9 @@ OUI:107B44*
 OUI:107BA4*
  ID_OUI_FROM_DATABASE=Olive & Dove Co.,Ltd.
 
+OUI:107BCE*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:107BEF*
  ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
 
@@ -43454,6 +43505,9 @@ OUI:10E3C7*
 OUI:10E4AF*
  ID_OUI_FROM_DATABASE=APR, LLC
 
+OUI:10E4C2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:10E68F*
  ID_OUI_FROM_DATABASE=KWANGSUNG ELECTRONICS KOREA CO.,LTD.
 
@@ -43697,6 +43751,9 @@ OUI:14205E*
 OUI:142233*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:14223B*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
 OUI:1422DB*
  ID_OUI_FROM_DATABASE=eero inc.
 
@@ -43977,7 +44034,7 @@ OUI:146308*
  ID_OUI_FROM_DATABASE=JABIL CIRCUIT (SHANGHAI) LTD.
 
 OUI:1469A2*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:146A0B*
  ID_OUI_FROM_DATABASE=Cypress Electronics Limited
@@ -44045,6 +44102,9 @@ OUI:14876A*
 OUI:1488E6*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:148919*
+ ID_OUI_FROM_DATABASE=2bps
+
 OUI:14893E*
  ID_OUI_FROM_DATABASE=VIXTEL TECHNOLOGIES LIMTED
 
@@ -44057,6 +44117,9 @@ OUI:1489FD*
 OUI:148A70*
  ID_OUI_FROM_DATABASE=ADS GmbH
 
+OUI:148C4A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:148F21*
  ID_OUI_FROM_DATABASE=Garmin International
 
@@ -44727,7 +44790,7 @@ OUI:18502A*
  ID_OUI_FROM_DATABASE=SOARNEX
 
 OUI:185207*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:185253*
  ID_OUI_FROM_DATABASE=Pixord Corporation
@@ -44849,8 +44912,23 @@ OUI:1871D5*
 OUI:18742E*
  ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
+OUI:1874E21*
+ ID_OUI_FROM_DATABASE=Sartorius Lab Instruments GmbH & Co. KG
+
+OUI:1874E25*
+ ID_OUI_FROM_DATABASE=HANGZHOU ZHOUJU ELECTRONIC TECHNOLOGICAL CO.,LTD
+
+OUI:1874E27*
+ ID_OUI_FROM_DATABASE=Sansec Technology Co.,Ltd
+
+OUI:1874E28*
+ ID_OUI_FROM_DATABASE=Kano Computing Limited
+
+OUI:1874E2C*
+ ID_OUI_FROM_DATABASE=NextGen RF Design, Inc.
+
 OUI:187532*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:1878D4*
  ID_OUI_FROM_DATABASE=Verizon
@@ -45608,6 +45686,9 @@ OUI:1C3B8F*
 OUI:1C3BF3*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:1C3CD4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:1C3D2F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -46635,7 +46716,7 @@ OUI:1CFEA7*
  ID_OUI_FROM_DATABASE=IDentytech Solutins Ltd.
 
 OUI:1CFF59*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:20014F*
  ID_OUI_FROM_DATABASE=Linea Research Ltd
@@ -46763,9 +46844,15 @@ OUI:201BC9*
 OUI:201D03*
  ID_OUI_FROM_DATABASE=Elatec GmbH
 
+OUI:201E88*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:201F31*
  ID_OUI_FROM_DATABASE=Inteno Broadband Technology AB
 
+OUI:201F3B*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
 OUI:2021A5*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -46847,6 +46934,9 @@ OUI:203B69*
 OUI:203CAE*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:203CC0*
+ ID_OUI_FROM_DATABASE=Beijing Tosee Technology Co., Ltd.
+
 OUI:203D66*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -47270,6 +47360,9 @@ OUI:20C047*
 OUI:20C06D*
  ID_OUI_FROM_DATABASE=SHENZHEN SPACETEK TECHNOLOGY CO.,LTD
 
+OUI:20C19B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:20C1AF*
  ID_OUI_FROM_DATABASE=i Wit Digital Co., Limited
 
@@ -47300,18 +47393,60 @@ OUI:20CD39*
 OUI:20CD6E*
  ID_OUI_FROM_DATABASE=Realme Chongqing Mobile Telecommunications Corp.,Ltd.
 
+OUI:20CE2A0*
+ ID_OUI_FROM_DATABASE=Annapurna labs
+
 OUI:20CE2A1*
  ID_OUI_FROM_DATABASE=Shanghai Digicube Info&Tech Co.,Ltd.
 
+OUI:20CE2A2*
+ ID_OUI_FROM_DATABASE=Jabil
+
+OUI:20CE2A3*
+ ID_OUI_FROM_DATABASE=Cuculus GmbH
+
+OUI:20CE2A4*
+ ID_OUI_FROM_DATABASE=Annapurna labs
+
+OUI:20CE2A5*
+ ID_OUI_FROM_DATABASE=Zaber Technologies Inc.
+
+OUI:20CE2A6*
+ ID_OUI_FROM_DATABASE=Radarxense BV
+
 OUI:20CE2A7*
  ID_OUI_FROM_DATABASE=Beijing Huadianzhongxin Tech.Co.,Ltd
 
+OUI:20CE2A8*
+ ID_OUI_FROM_DATABASE=Intelligraphics
+
+OUI:20CE2A9*
+ ID_OUI_FROM_DATABASE=Rugged Monitoring
+
+OUI:20CE2AA*
+ ID_OUI_FROM_DATABASE=MeshPlusPlus, Inc.
+
+OUI:20CE2AB*
+ ID_OUI_FROM_DATABASE=Swarovski Optik KG
+
+OUI:20CE2AC*
+ ID_OUI_FROM_DATABASE=Ariston Thermo s.p.a.
+
+OUI:20CE2AD*
+ ID_OUI_FROM_DATABASE=LAUDA DR R WOBSER GMBH & CO KG
+
+OUI:20CE2AE*
+ ID_OUI_FROM_DATABASE=Funkwerk Systems GmbH
+
 OUI:20CEC4*
  ID_OUI_FROM_DATABASE=Peraso Technologies
 
 OUI:20CF30*
  ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
+OUI:20CFAE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:20D160*
  ID_OUI_FROM_DATABASE=Private
 
@@ -47321,6 +47456,9 @@ OUI:20D21F*
 OUI:20D25F*
  ID_OUI_FROM_DATABASE=SmartCap Technologies
 
+OUI:20D276*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
 OUI:20D390*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -47639,6 +47777,9 @@ OUI:24240E*
 OUI:242642*
  ID_OUI_FROM_DATABASE=SHARP Corporation.
 
+OUI:2428FD*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
 OUI:2429FE*
  ID_OUI_FROM_DATABASE=KYOCERA Corporation
 
@@ -48003,7 +48144,7 @@ OUI:248A07*
  ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
 OUI:248BE0*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:2491BB*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -48032,6 +48173,9 @@ OUI:249504*
 OUI:2497ED*
  ID_OUI_FROM_DATABASE=Techvision Intelligent Technology Limited
 
+OUI:249AC8*
+ ID_OUI_FROM_DATABASE=Shenzhen Skyworth  Digital  Technology  CO., Ltd
+
 OUI:249AD8*
  ID_OUI_FROM_DATABASE=YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD.
 
@@ -48071,6 +48215,9 @@ OUI:24A534*
 OUI:24A65E*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:24A799*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:24A7DC*
  ID_OUI_FROM_DATABASE=BSkyB Ltd
 
@@ -48237,7 +48384,7 @@ OUI:24DFA7*
  ID_OUI_FROM_DATABASE=Hangzhou BroadLink Technology Co.,Ltd
 
 OUI:24E124*
- ID_OUI_FROM_DATABASE=Xiamen Ursalink Technology Co., Ltd.
+ ID_OUI_FROM_DATABASE=Xiamen Milesight IoT Co., Ltd.
 
 OUI:24E271*
  ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
@@ -48380,6 +48527,9 @@ OUI:280E8B*
 OUI:280FC5*
  ID_OUI_FROM_DATABASE=Beijing Leadsec Technology Co., Ltd.
 
+OUI:280FEB*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
 OUI:28101B*
  ID_OUI_FROM_DATABASE=MagnaCom
 
@@ -48389,6 +48539,9 @@ OUI:28107B*
 OUI:2811A5*
  ID_OUI_FROM_DATABASE=Bose Corporation
 
+OUI:2811A8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:2811EC*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -48821,6 +48974,9 @@ OUI:28940F*
 OUI:2894AF*
  ID_OUI_FROM_DATABASE=Samhwa Telecom
 
+OUI:2897B8*
+ ID_OUI_FROM_DATABASE=myenergi Ltd
+
 OUI:28987B*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -49118,6 +49274,9 @@ OUI:28DEE5*
 OUI:28DEF6*
  ID_OUI_FROM_DATABASE=bioMerieux Inc.
 
+OUI:28DFEB*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:28E02C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -49253,12 +49412,18 @@ OUI:28F537E*
 OUI:28F606*
  ID_OUI_FROM_DATABASE=Syes srl
 
+OUI:28FA19*
+ ID_OUI_FROM_DATABASE=Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd
+
 OUI:28FA7A*
  ID_OUI_FROM_DATABASE=Zhejiang Tmall Technology Co., Ltd.
 
 OUI:28FAA0*
  ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
+OUI:28FBAE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:28FBD3*
  ID_OUI_FROM_DATABASE=Ragentek Technology Group
 
@@ -49757,6 +49922,9 @@ OUI:2C4835D*
 OUI:2C4835E*
  ID_OUI_FROM_DATABASE=IROOTECH TECHNOLOGY CO.,LTD
 
+OUI:2C4881*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:2C4A11*
  ID_OUI_FROM_DATABASE=Ciena Corporation
 
@@ -49866,7 +50034,7 @@ OUI:2C6289*
  ID_OUI_FROM_DATABASE=Regenersis (Glenrothes) Ltd
 
 OUI:2C6373*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:2C641F*
  ID_OUI_FROM_DATABASE=Vizio, Inc
@@ -49934,6 +50102,9 @@ OUI:2C6B7D*
 OUI:2C6BF5*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
+OUI:2C6DC1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:2C6E85*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -50250,7 +50421,7 @@ OUI:2CD141C*
  ID_OUI_FROM_DATABASE=PIN SHANG LED Co., LTD.
 
 OUI:2CD141D*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=Square Inc.
 
 OUI:2CD141E*
  ID_OUI_FROM_DATABASE=CITA SMART SOLUTIONS LTD
@@ -50294,6 +50465,9 @@ OUI:2CDD95*
 OUI:2CDDA3*
  ID_OUI_FROM_DATABASE=Point Grey Research Inc.
 
+OUI:2CDDE9*
+ ID_OUI_FROM_DATABASE=Arista Networks
+
 OUI:2CE2A8*
  ID_OUI_FROM_DATABASE=DeviceDesign
 
@@ -50312,6 +50486,9 @@ OUI:2CE871*
 OUI:2CEA7F*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
+OUI:2CEADC*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+
 OUI:2CEDEB*
  ID_OUI_FROM_DATABASE=Alpheus Digital Company Limited
 
@@ -50721,7 +50898,7 @@ OUI:304950C*
  ID_OUI_FROM_DATABASE=Anacove LLC
 
 OUI:304950D*
- ID_OUI_FROM_DATABASE=Xio Research, Inc
+ ID_OUI_FROM_DATABASE=Merlyn Mind, Inc.
 
 OUI:304950E*
  ID_OUI_FROM_DATABASE=IoTmaxx GmbH
@@ -50981,6 +51158,9 @@ OUI:309FFB*
 OUI:30A023*
  ID_OUI_FROM_DATABASE=ROCK PATH S.R.L
 
+OUI:30A176*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:30A1FA*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -51044,6 +51224,9 @@ OUI:30B216*
 OUI:30B237*
  ID_OUI_FROM_DATABASE=GD Midea Air-Conditioning Equipment Co.,Ltd.
 
+OUI:30B346*
+ ID_OUI_FROM_DATABASE=CJSC NORSI-TRANS
+
 OUI:30B3A2*
  ID_OUI_FROM_DATABASE=Shenzhen Heguang Measurement & Control Technology Co.,Ltd
 
@@ -52307,6 +52490,9 @@ OUI:34FA9F*
 OUI:34FC6F*
  ID_OUI_FROM_DATABASE=ALCEA
 
+OUI:34FCA1*
+ ID_OUI_FROM_DATABASE=Micronet union Technology(Chengdu)Co., Ltd.
+
 OUI:34FCB9*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
@@ -52394,6 +52580,9 @@ OUI:3810D5*
 OUI:3810F0*
  ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
 
+OUI:381428*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
 OUI:38144E*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -53141,6 +53330,9 @@ OUI:38E26E*
 OUI:38E2DD*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:38E39F*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
 OUI:38E3C5*
  ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
@@ -53444,6 +53636,9 @@ OUI:3C18A0*
 OUI:3C1915*
  ID_OUI_FROM_DATABASE=GFI Chrono Time
 
+OUI:3C195E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:3C197D*
  ID_OUI_FROM_DATABASE=Ericsson AB
 
@@ -53582,6 +53777,9 @@ OUI:3C363D*
 OUI:3C36E4*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:3C3712*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+
 OUI:3C3786*
  ID_OUI_FROM_DATABASE=NETGEAR
 
@@ -54737,6 +54935,9 @@ OUI:40562D*
 OUI:405662*
  ID_OUI_FROM_DATABASE=GuoTengShengHua Electronics LTD.
 
+OUI:405899*
+ ID_OUI_FROM_DATABASE=Logitech Far East
+
 OUI:405A9B*
  ID_OUI_FROM_DATABASE=ANOVO
 
@@ -55115,6 +55316,9 @@ OUI:40C245*
 OUI:40C3C6*
  ID_OUI_FROM_DATABASE=SnapRoute
 
+OUI:40C48C*
+ ID_OUI_FROM_DATABASE=N-iTUS CO.,LTD.
+
 OUI:40C4D6*
  ID_OUI_FROM_DATABASE=ChongQing Camyu Technology Development Co.,Ltd.
 
@@ -55353,7 +55557,7 @@ OUI:40F413*
  ID_OUI_FROM_DATABASE=Rubezh
 
 OUI:40F420*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:40F4EC*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
@@ -55566,7 +55770,7 @@ OUI:4434A7*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
 OUI:44356F*
- ID_OUI_FROM_DATABASE=Neterix
+ ID_OUI_FROM_DATABASE=Neterix Ltd
 
 OUI:443583*
  ID_OUI_FROM_DATABASE=Apple, Inc.
@@ -55674,7 +55878,7 @@ OUI:4456B7*
  ID_OUI_FROM_DATABASE=Spawn Labs, Inc
 
 OUI:4456E2*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:445829*
  ID_OUI_FROM_DATABASE=Cisco SPVTG
@@ -55688,6 +55892,9 @@ OUI:44599F*
 OUI:4459E3*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:445BED*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
 OUI:445CE9*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -55733,6 +55940,9 @@ OUI:4466FC*
 OUI:446747*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:446752*
+ ID_OUI_FROM_DATABASE=Wistron INFOCOMM (Zhongshan) CORPORATION
+
 OUI:446755*
  ID_OUI_FROM_DATABASE=Orbit Irrigation
 
@@ -56022,7 +56232,7 @@ OUI:44B994*
  ID_OUI_FROM_DATABASE=Douglas Lighting Controls
 
 OUI:44BA46*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:44BB3B*
  ID_OUI_FROM_DATABASE=Google, Inc.
@@ -56177,6 +56387,9 @@ OUI:44D884*
 OUI:44D9E7*
  ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
+OUI:44DB60*
+ ID_OUI_FROM_DATABASE=Nanjing Baihezhengliu Technology Co., Ltd
+
 OUI:44DC4E*
  ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
@@ -56303,6 +56516,9 @@ OUI:48049F*
 OUI:4805E2*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:48062B*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:48066A*
  ID_OUI_FROM_DATABASE=Tempered Networks, Inc.
 
@@ -56405,6 +56621,9 @@ OUI:48210B*
 OUI:48216C*
  ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
+OUI:482218*
+ ID_OUI_FROM_DATABASE=Shenzhen Yipingfang Network Technology Co., Ltd.
+
 OUI:482335*
  ID_OUI_FROM_DATABASE=Dialog Semiconductor Hellas SA
 
@@ -56813,6 +57032,9 @@ OUI:489D24*
 OUI:489DD1*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:489EBD*
+ ID_OUI_FROM_DATABASE=HP Inc.
+
 OUI:48A0F8*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -57038,6 +57260,9 @@ OUI:48E695*
 OUI:48E6C0*
  ID_OUI_FROM_DATABASE=SIMCom Wireless Solutions Co.,Ltd.
 
+OUI:48E7DA*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+
 OUI:48E9F1*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -57101,6 +57326,9 @@ OUI:48F8DB*
 OUI:48F8E1*
  ID_OUI_FROM_DATABASE=Nokia
 
+OUI:48F8FF*
+ ID_OUI_FROM_DATABASE=CHENGDU KT ELECTRONIC HI-TECH CO.,LTD
+
 OUI:48F925*
  ID_OUI_FROM_DATABASE=Maestronic
 
@@ -57302,6 +57530,9 @@ OUI:4C3909*
 OUI:4C3910*
  ID_OUI_FROM_DATABASE=Newtek Electronics co., Ltd.
 
+OUI:4C3B6C*
+ ID_OUI_FROM_DATABASE=GARO AB
+
 OUI:4C3B74*
  ID_OUI_FROM_DATABASE=VOGTEC(H.K.) Co., Ltd
 
@@ -57527,6 +57758,9 @@ OUI:4C710C*
 OUI:4C710D*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:4C7167*
+ ID_OUI_FROM_DATABASE=PoLabs d.o.o.
+
 OUI:4C72B9*
  ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
@@ -57962,6 +58196,12 @@ OUI:4CD0CB*
 OUI:4CD1A1*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:4CD3AF*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
+
+OUI:4CD577*
+ ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
+
 OUI:4CD637*
  ID_OUI_FROM_DATABASE=Qsono Electronics Co., Ltd
 
@@ -58103,6 +58343,9 @@ OUI:4CF55B*
 OUI:4CF5A0*
  ID_OUI_FROM_DATABASE=Scalable Network Technologies Inc
 
+OUI:4CF5DC*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
 OUI:4CF737*
  ID_OUI_FROM_DATABASE=SamJi Electronics Co., Ltd
 
@@ -58160,6 +58403,9 @@ OUI:5006AB*
 OUI:500959*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
+OUI:5009E5*
+ ID_OUI_FROM_DATABASE=Drimsys,Inc
+
 OUI:500B32*
  ID_OUI_FROM_DATABASE=Foxda Technology Industrial(ShenZhen)Co.,LTD
 
@@ -58409,6 +58655,9 @@ OUI:50465D*
 OUI:5048EB*
  ID_OUI_FROM_DATABASE=BEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD.
 
+OUI:5049B0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:504A5E*
  ID_OUI_FROM_DATABASE=Masimo Corporation
 
@@ -58604,6 +58853,9 @@ OUI:506F9A*
 OUI:507043*
  ID_OUI_FROM_DATABASE=BSkyB Ltd
 
+OUI:507097*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
 OUI:5070E5*
  ID_OUI_FROM_DATABASE=He Shan World Fair Electronics Technology Limited
 
@@ -58667,6 +58919,9 @@ OUI:5087B8*
 OUI:508965*
  ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
+OUI:508A06*
+ ID_OUI_FROM_DATABASE=Tuya Smart Inc.
+
 OUI:508A0F*
  ID_OUI_FROM_DATABASE=SHENZHEN FISE TECHNOLOGY HOLDING CO.,LTD.
 
@@ -59339,6 +59594,9 @@ OUI:5435DF*
 OUI:54369B*
  ID_OUI_FROM_DATABASE=1Verge Internet Technology (Beijing) Co., Ltd.
 
+OUI:5437BB*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+
 OUI:543968*
  ID_OUI_FROM_DATABASE=Edgewater Networks Inc
 
@@ -59459,6 +59717,9 @@ OUI:5465DE*
 OUI:54666C*
  ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
+OUI:5466F9*
+ ID_OUI_FROM_DATABASE=ConMet
+
 OUI:546751*
  ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
 
@@ -59750,6 +60011,9 @@ OUI:54AE27*
 OUI:54AED0*
  ID_OUI_FROM_DATABASE=DASAN Networks, Inc.
 
+OUI:54AED2*
+ ID_OUI_FROM_DATABASE=CSL Dualcom Ltd
+
 OUI:54B121*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -59789,6 +60053,9 @@ OUI:54BEF7*
 OUI:54BF64*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
+OUI:54C250*
+ ID_OUI_FROM_DATABASE=Iskratel d.o.o.
+
 OUI:54C33E*
  ID_OUI_FROM_DATABASE=Ciena Corporation
 
@@ -59825,6 +60092,9 @@ OUI:54D0ED*
 OUI:54D163*
  ID_OUI_FROM_DATABASE=MAX-TECH,INC
 
+OUI:54D17D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:54D1B0*
  ID_OUI_FROM_DATABASE=Universal Laser Systems, Inc
 
@@ -59868,7 +60138,7 @@ OUI:54E032*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
 OUI:54E061*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:54E140*
  ID_OUI_FROM_DATABASE=INGENICO
@@ -60020,6 +60290,9 @@ OUI:5810B7*
 OUI:581243*
  ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
 
+OUI:5813D3*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+
 OUI:581626*
  ID_OUI_FROM_DATABASE=Avaya Inc
 
@@ -60131,6 +60404,9 @@ OUI:582F40*
 OUI:582F42*
  ID_OUI_FROM_DATABASE=Universal Electric Corporation
 
+OUI:582FF7*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:583112*
  ID_OUI_FROM_DATABASE=DRUST
 
@@ -60206,6 +60482,9 @@ OUI:584C19*
 OUI:584CEE*
  ID_OUI_FROM_DATABASE=Digital One Technologies, Limited
 
+OUI:584D42*
+ ID_OUI_FROM_DATABASE=Dragos, Inc.
+
 OUI:585076*
  ID_OUI_FROM_DATABASE=Linear Equipamentos Eletronicos SA
 
@@ -60377,6 +60656,9 @@ OUI:588E81*
 OUI:589043*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
+OUI:589153*
+ ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
+
 OUI:5891CF*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -60620,6 +60902,9 @@ OUI:58D56E*
 OUI:58D67A*
  ID_OUI_FROM_DATABASE=TCPlink
 
+OUI:58D697*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:58D6D3*
  ID_OUI_FROM_DATABASE=Dairy Cheq Inc
 
@@ -60824,6 +61109,9 @@ OUI:58FCDBF*
 OUI:58FD20*
  ID_OUI_FROM_DATABASE=Systemhouse Solutions AB
 
+OUI:58FD5D*
+ ID_OUI_FROM_DATABASE=Hangzhou Xinyun technology Co., Ltd.
+
 OUI:58FDB1*
  ID_OUI_FROM_DATABASE=LG Electronics
 
@@ -61017,7 +61305,7 @@ OUI:5C497D*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:5C4A1F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:5C4A26*
  ID_OUI_FROM_DATABASE=Enguity Technology Corp
@@ -61308,7 +61596,7 @@ OUI:5C9AD8*
  ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
 OUI:5CA176*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:5CA178*
  ID_OUI_FROM_DATABASE=TableTop Media (dba Ziosk)
@@ -61334,6 +61622,9 @@ OUI:5CA5BC*
 OUI:5CA62D*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:5CA721*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:5CA86A*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -61439,6 +61730,9 @@ OUI:5CC6E9*
 OUI:5CC7D7*
  ID_OUI_FROM_DATABASE=AZROAD TECHNOLOGY COMPANY LIMITED
 
+OUI:5CC8E3*
+ ID_OUI_FROM_DATABASE=Shintec Hozumi co.ltd.
+
 OUI:5CC999*
  ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
 
@@ -61547,6 +61841,9 @@ OUI:5CE30E*
 OUI:5CE3B6*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:5CE42A*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:5CE50C*
  ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
 
@@ -61856,6 +62153,9 @@ OUI:6023A4*
 OUI:6024C1*
  ID_OUI_FROM_DATABASE=Jiangsu Zhongxun Electronic Technology Co., Ltd
 
+OUI:6026EF*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
 OUI:60271C*
  ID_OUI_FROM_DATABASE=VIDEOR E. Hartig GmbH
 
@@ -61916,6 +62216,9 @@ OUI:60391F*
 OUI:603A7C*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:603AAF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:603CEE*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -62135,6 +62438,9 @@ OUI:6089B1*
 OUI:6089B7*
  ID_OUI_FROM_DATABASE=KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ
 
+OUI:608A10*
+ ID_OUI_FROM_DATABASE=Microchip Technology Inc.
+
 OUI:608B0E*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -62243,6 +62549,9 @@ OUI:609AC1*
 OUI:609B2D*
  ID_OUI_FROM_DATABASE=JMACS Japan Co., Ltd.
 
+OUI:609BB4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:609BC8*
  ID_OUI_FROM_DATABASE=Hipad Intelligent Technology Co., Ltd.
 
@@ -62276,6 +62585,9 @@ OUI:60A4B7*
 OUI:60A4D0*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:60A5E2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:60A730*
  ID_OUI_FROM_DATABASE=Shenzhen Yipinfang Internet Technology Co.,Ltd
 
@@ -62324,6 +62636,9 @@ OUI:60B606*
 OUI:60B617*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:60B6E1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:60B76E*
  ID_OUI_FROM_DATABASE=Google, Inc.
 
@@ -62492,6 +62807,9 @@ OUI:60DA23*
 OUI:60DA83*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
+OUI:60DB15*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
 OUI:60DB2A*
  ID_OUI_FROM_DATABASE=HNS
 
@@ -62519,6 +62837,9 @@ OUI:60E3AC*
 OUI:60E6BC*
  ID_OUI_FROM_DATABASE=Sino-Telecom Technology Co.,Ltd.
 
+OUI:60E6F0*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+
 OUI:60E701*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -62582,6 +62903,9 @@ OUI:60F677*
 OUI:60F81D*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:60F8F2*
+ ID_OUI_FROM_DATABASE=Synaptec
+
 OUI:60FA9D*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -62826,7 +63150,7 @@ OUI:64351C*
  ID_OUI_FROM_DATABASE=e-CON SYSTEMS INDIA PVT LTD
 
 OUI:643AB1*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:643AEA*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
@@ -62913,7 +63237,7 @@ OUI:645D86*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
 OUI:645D92*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:645DD7*
  ID_OUI_FROM_DATABASE=Shenzhen Lifesense Medical Electronics Co., Ltd.
@@ -63242,6 +63566,9 @@ OUI:64B310*
 OUI:64B370*
  ID_OUI_FROM_DATABASE=PowerComm Solutions LLC
 
+OUI:64B379*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:64B473*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
@@ -63321,7 +63648,7 @@ OUI:64CFD9*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
 OUI:64D02D*
- ID_OUI_FROM_DATABASE=Next Generation Integration (NGI)
+ ID_OUI_FROM_DATABASE=NEXT GENERATION INTEGRATION LIMITED (NGI)
 
 OUI:64D154*
  ID_OUI_FROM_DATABASE=Routerboard.com
@@ -63627,7 +63954,7 @@ OUI:68234B*
  ID_OUI_FROM_DATABASE=Nihon Dengyo Kousaku
 
 OUI:68262A*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:682719*
  ID_OUI_FROM_DATABASE=Microchip Technology Inc.
@@ -63680,6 +64007,9 @@ OUI:683943*
 OUI:683A1E*
  ID_OUI_FROM_DATABASE=Cisco Meraki
 
+OUI:683A48*
+ ID_OUI_FROM_DATABASE=SAMJIN Co., Ltd.
+
 OUI:683B1E*
  ID_OUI_FROM_DATABASE=Countwise LTD
 
@@ -64232,6 +64562,9 @@ OUI:68DCE8*
 OUI:68DD26*
  ID_OUI_FROM_DATABASE=Shanghai Focus Vision Security Technology Co.,Ltd
 
+OUI:68DDD9*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
+
 OUI:68DFDD*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
@@ -64259,6 +64592,9 @@ OUI:68EBC5*
 OUI:68EC62*
  ID_OUI_FROM_DATABASE=YODO Technology Corp. Ltd.
 
+OUI:68EC8A*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:68ECC5*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -64364,6 +64700,9 @@ OUI:6C0EE6*
 OUI:6C0F6A*
  ID_OUI_FROM_DATABASE=JDC Tech Co., Ltd.
 
+OUI:6C108B*
+ ID_OUI_FROM_DATABASE=WeLink Communications
+
 OUI:6C13D5*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -64538,6 +64877,9 @@ OUI:6C416A*
 OUI:6C42AB*
  ID_OUI_FROM_DATABASE=Subscriber Networks, Inc.
 
+OUI:6C433C*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
+
 OUI:6C4418*
  ID_OUI_FROM_DATABASE=Zappware
 
@@ -64604,6 +64946,9 @@ OUI:6C5976*
 OUI:6C5A34*
  ID_OUI_FROM_DATABASE=Shenzhen Haitianxiong Electronic Co., Ltd.
 
+OUI:6C5AB0*
+ ID_OUI_FROM_DATABASE=TP-Link Corporation Limited
+
 OUI:6C5AB5*
  ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
 
@@ -64736,6 +65081,9 @@ OUI:6C7637*
 OUI:6C7660*
  ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
+OUI:6C79B8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:6C81FE*
  ID_OUI_FROM_DATABASE=Mitsuba Corporation
 
@@ -64781,6 +65129,9 @@ OUI:6C92BF*
 OUI:6C9354*
  ID_OUI_FROM_DATABASE=Yaojin Technology (Shenzhen) Co., LTD.
 
+OUI:6C9466*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:6C94F8*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -65786,6 +66137,9 @@ OUI:709383*
 OUI:7093F8*
  ID_OUI_FROM_DATABASE=Space Monkey, Inc.
 
+OUI:709741*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
+
 OUI:709756*
  ID_OUI_FROM_DATABASE=Happyelectronics Co.,Ltd
 
@@ -65831,6 +66185,9 @@ OUI:70A41C*
 OUI:70A66A*
  ID_OUI_FROM_DATABASE=Prox Dynamics AS
 
+OUI:70A6CC*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:70A84C*
  ID_OUI_FROM_DATABASE=MONAD., Inc.
 
@@ -66033,7 +66390,7 @@ OUI:70B3D5035*
  ID_OUI_FROM_DATABASE=HKW-Elektronik GmbH
 
 OUI:70B3D5036*
- ID_OUI_FROM_DATABASE=PARAGON ID
+ ID_OUI_FROM_DATABASE=Vema Venturi AB
 
 OUI:70B3D5037*
  ID_OUI_FROM_DATABASE=EIFFAGE ENERGIE ELECTRONIQUE
@@ -66224,6 +66581,9 @@ OUI:70B3D5074*
 OUI:70B3D5075*
  ID_OUI_FROM_DATABASE=Mo-Sys Engineering Ltd
 
+OUI:70B3D5076*
+ ID_OUI_FROM_DATABASE=Private Enterprise Scientific and Production Private EnterpriseSparing-Vist Center
+
 OUI:70B3D5077*
  ID_OUI_FROM_DATABASE=InAccess Networks SA
 
@@ -66545,6 +66905,9 @@ OUI:70B3D50E0*
 OUI:70B3D50E1*
  ID_OUI_FROM_DATABASE=MiWave Consulting, LLC
 
+OUI:70B3D50E2*
+ ID_OUI_FROM_DATABASE=JESE Ltd
+
 OUI:70B3D50E3*
  ID_OUI_FROM_DATABASE=SinTau SrL
 
@@ -66722,6 +67085,9 @@ OUI:70B3D511C*
 OUI:70B3D511D*
  ID_OUI_FROM_DATABASE=Dakton Microlabs LLC
 
+OUI:70B3D511E*
+ ID_OUI_FROM_DATABASE=KBPR LLC
+
 OUI:70B3D511F*
  ID_OUI_FROM_DATABASE=Geppetto Electronics
 
@@ -66794,6 +67160,9 @@ OUI:70B3D5135*
 OUI:70B3D5136*
  ID_OUI_FROM_DATABASE=Miguel Corporate Services Pte Ltd
 
+OUI:70B3D5137*
+ ID_OUI_FROM_DATABASE=Subject Link Inc
+
 OUI:70B3D5138*
  ID_OUI_FROM_DATABASE=SMITEC S.p.A.
 
@@ -67082,6 +67451,9 @@ OUI:70B3D5196*
 OUI:70B3D5197*
  ID_OUI_FROM_DATABASE=Lattech Systems Pty Ltd
 
+OUI:70B3D5198*
+ ID_OUI_FROM_DATABASE=Beijing Muniulinghang Technology Co., Ltd
+
 OUI:70B3D5199*
  ID_OUI_FROM_DATABASE=Smart Controls LLC
 
@@ -67187,6 +67559,9 @@ OUI:70B3D51BA*
 OUI:70B3D51BB*
  ID_OUI_FROM_DATABASE=EFENTO T P SZYDŁOWSKI K ZARĘBA SPÓŁKA JAWNA
 
+OUI:70B3D51BC*
+ ID_OUI_FROM_DATABASE=Flextronics International Kft
+
 OUI:70B3D51BD*
  ID_OUI_FROM_DATABASE=Shenzhen Siera Technology Ltd
 
@@ -67328,6 +67703,9 @@ OUI:70B3D51EA*
 OUI:70B3D51EB*
  ID_OUI_FROM_DATABASE=Xavant
 
+OUI:70B3D51ED*
+ ID_OUI_FROM_DATABASE=SUS Corporation
+
 OUI:70B3D51EE*
  ID_OUI_FROM_DATABASE=MEGGITT
 
@@ -67352,6 +67730,9 @@ OUI:70B3D51F4*
 OUI:70B3D51F5*
  ID_OUI_FROM_DATABASE=Martec S.p.A.
 
+OUI:70B3D51F6*
+ ID_OUI_FROM_DATABASE=LinkAV Technology Co., Ltd
+
 OUI:70B3D51F7*
  ID_OUI_FROM_DATABASE=Morgan Schaffer Inc.
 
@@ -67364,6 +67745,9 @@ OUI:70B3D51F9*
 OUI:70B3D51FA*
  ID_OUI_FROM_DATABASE=EBZ SysTec GmbH
 
+OUI:70B3D51FB*
+ ID_OUI_FROM_DATABASE=Crane-elec. Co., LTD.
+
 OUI:70B3D51FC*
  ID_OUI_FROM_DATABASE=Guan Show Technologe Co., Ltd.
 
@@ -67409,6 +67793,9 @@ OUI:70B3D5209*
 OUI:70B3D520A*
  ID_OUI_FROM_DATABASE=Golden Grid Systems
 
+OUI:70B3D520B*
+ ID_OUI_FROM_DATABASE=KST technology
+
 OUI:70B3D520C*
  ID_OUI_FROM_DATABASE=Siemens Healthcare Diagnostics
 
@@ -67478,6 +67865,9 @@ OUI:70B3D5221*
 OUI:70B3D5222*
  ID_OUI_FROM_DATABASE=Marioff Corporation Oy
 
+OUI:70B3D5223*
+ ID_OUI_FROM_DATABASE=Research Laboratory of Design Automation, Ltd.
+
 OUI:70B3D5224*
  ID_OUI_FROM_DATABASE=Urbana Smart Solutions Pte Ltd
 
@@ -67706,6 +68096,9 @@ OUI:70B3D526F*
 OUI:70B3D5270*
  ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
+OUI:70B3D5271*
+ ID_OUI_FROM_DATABASE=Code Blue Corporation
+
 OUI:70B3D5272*
  ID_OUI_FROM_DATABASE=TELECOM SANTE
 
@@ -67820,6 +68213,9 @@ OUI:70B3D5296*
 OUI:70B3D5297*
  ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
 
+OUI:70B3D5298*
+ ID_OUI_FROM_DATABASE=Reflexion Medical
+
 OUI:70B3D5299*
  ID_OUI_FROM_DATABASE=KMtronic ltd
 
@@ -67907,6 +68303,9 @@ OUI:70B3D52B4*
 OUI:70B3D52B5*
  ID_OUI_FROM_DATABASE=Dosepack India LLP
 
+OUI:70B3D52B6*
+ ID_OUI_FROM_DATABASE=HLT Micro
+
 OUI:70B3D52B7*
  ID_OUI_FROM_DATABASE=Matrix Orbital Corporation
 
@@ -67952,6 +68351,9 @@ OUI:70B3D52C4*
 OUI:70B3D52C5*
  ID_OUI_FROM_DATABASE=MECT SRL
 
+OUI:70B3D52C6*
+ ID_OUI_FROM_DATABASE=AM General Contractor
+
 OUI:70B3D52C7*
  ID_OUI_FROM_DATABASE=Worldsensing
 
@@ -68183,12 +68585,18 @@ OUI:70B3D5313*
 OUI:70B3D5314*
  ID_OUI_FROM_DATABASE=Grau Elektronik GmbH
 
+OUI:70B3D5315*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:70B3D5316*
  ID_OUI_FROM_DATABASE=Austco Marketing & Service (USA) ltd.
 
 OUI:70B3D5317*
  ID_OUI_FROM_DATABASE=Iotopia Solutions
 
+OUI:70B3D5318*
+ ID_OUI_FROM_DATABASE=Exemplar Medical, LLC
+
 OUI:70B3D5319*
  ID_OUI_FROM_DATABASE=ISO/TC 22/SC 31
 
@@ -68267,6 +68675,9 @@ OUI:70B3D5331*
 OUI:70B3D5332*
  ID_OUI_FROM_DATABASE=InnoSenT
 
+OUI:70B3D5333*
+ ID_OUI_FROM_DATABASE=Orlaco Products B.V.
+
 OUI:70B3D5334*
  ID_OUI_FROM_DATABASE=Dokuen Co. Ltd.
 
@@ -68285,6 +68696,9 @@ OUI:70B3D5338*
 OUI:70B3D5339*
  ID_OUI_FROM_DATABASE=Sierra Nevada Corporation
 
+OUI:70B3D533A*
+ ID_OUI_FROM_DATABASE=AudioTEC LLC
+
 OUI:70B3D533B*
  ID_OUI_FROM_DATABASE=Seal Shield, LLC
 
@@ -68531,6 +68945,9 @@ OUI:70B3D538C*
 OUI:70B3D538D*
  ID_OUI_FROM_DATABASE=IMP-TELEKOMUNIKACIJE DOO
 
+OUI:70B3D538E*
+ ID_OUI_FROM_DATABASE=China Telecom Fufu Information Technology CO.,LTD
+
 OUI:70B3D538F*
  ID_OUI_FROM_DATABASE=Sorynorydotcom Inc
 
@@ -68648,6 +69065,9 @@ OUI:70B3D53B4*
 OUI:70B3D53B5*
  ID_OUI_FROM_DATABASE=Preston Industries dba PolyScience
 
+OUI:70B3D53B6*
+ ID_OUI_FROM_DATABASE=MedRx, Inc
+
 OUI:70B3D53B7*
  ID_OUI_FROM_DATABASE=Paul Scherrer Institut (PSI)
 
@@ -68918,6 +69338,9 @@ OUI:70B3D540F*
 OUI:70B3D5410*
  ID_OUI_FROM_DATABASE=Avant Technologies, Inc
 
+OUI:70B3D5411*
+ ID_OUI_FROM_DATABASE=Mi-Fi Networks Pvt Ltd
+
 OUI:70B3D5412*
  ID_OUI_FROM_DATABASE=TATTILE SRL
 
@@ -69098,6 +69521,9 @@ OUI:70B3D544E*
 OUI:70B3D544F*
  ID_OUI_FROM_DATABASE=Velvac Incorporated
 
+OUI:70B3D5451*
+ ID_OUI_FROM_DATABASE=Perform3-D LLC
+
 OUI:70B3D5452*
  ID_OUI_FROM_DATABASE=ITALIANA PONTI RADIO SRL
 
@@ -69458,6 +69884,9 @@ OUI:70B3D54C9*
 OUI:70B3D54CA*
  ID_OUI_FROM_DATABASE=PCB Piezotronics
 
+OUI:70B3D54CB*
+ ID_OUI_FROM_DATABASE=Cucos Retail Systems GmbH
+
 OUI:70B3D54CC*
  ID_OUI_FROM_DATABASE=FRESENIUS MEDICAL CARE
 
@@ -69470,6 +69899,9 @@ OUI:70B3D54CE*
 OUI:70B3D54CF*
  ID_OUI_FROM_DATABASE=GREEN HOUSE CO., LTD.
 
+OUI:70B3D54D0*
+ ID_OUI_FROM_DATABASE=Codewerk GmbH
+
 OUI:70B3D54D1*
  ID_OUI_FROM_DATABASE=Contraves Advanced Devices Sdn. Bhd.
 
@@ -69533,6 +69965,9 @@ OUI:70B3D54E4*
 OUI:70B3D54E5*
  ID_OUI_FROM_DATABASE=viZaar industrial imaging AG
 
+OUI:70B3D54E6*
+ ID_OUI_FROM_DATABASE=Santa Barbara Imaging Systems
+
 OUI:70B3D54E7*
  ID_OUI_FROM_DATABASE=Digital Domain
 
@@ -69551,6 +69986,9 @@ OUI:70B3D54EB*
 OUI:70B3D54EC*
  ID_OUI_FROM_DATABASE=Hangzhou Youshi Industry Co., Ltd.
 
+OUI:70B3D54ED*
+ ID_OUI_FROM_DATABASE=Panoramic Power
+
 OUI:70B3D54EE*
  ID_OUI_FROM_DATABASE=NOA Co., Ltd.
 
@@ -70139,6 +70577,9 @@ OUI:70B3D55B1*
 OUI:70B3D55B2*
  ID_OUI_FROM_DATABASE=Peter Huber Kaeltemaschinenbau AG
 
+OUI:70B3D55B3*
+ ID_OUI_FROM_DATABASE=STENTORIUS by ADI
+
 OUI:70B3D55B4*
  ID_OUI_FROM_DATABASE=Systems Technologies
 
@@ -70217,6 +70658,9 @@ OUI:70B3D55CC*
 OUI:70B3D55CD*
  ID_OUI_FROM_DATABASE=MVT Video Technologies R + H Maedler GbR
 
+OUI:70B3D55CE*
+ ID_OUI_FROM_DATABASE=IP Devices
+
 OUI:70B3D55CF*
  ID_OUI_FROM_DATABASE=PROEL TSI s.r.l.
 
@@ -70763,6 +71207,9 @@ OUI:70B3D5683*
 OUI:70B3D5684*
  ID_OUI_FROM_DATABASE=LECO Corporation
 
+OUI:70B3D5685*
+ ID_OUI_FROM_DATABASE=LDA Audiotech
+
 OUI:70B3D5686*
  ID_OUI_FROM_DATABASE=Access Protocol Pty Ltd
 
@@ -70817,6 +71264,9 @@ OUI:70B3D5696*
 OUI:70B3D5697*
  ID_OUI_FROM_DATABASE=Alazar Technologies Inc.
 
+OUI:70B3D5698*
+ ID_OUI_FROM_DATABASE=ZIEHL-ABEGG SE
+
 OUI:70B3D5699*
  ID_OUI_FROM_DATABASE=Flextronics International Kft
 
@@ -70824,7 +71274,7 @@ OUI:70B3D569A*
  ID_OUI_FROM_DATABASE=Altaneos
 
 OUI:70B3D569B*
- ID_OUI_FROM_DATABASE=Horizon Co., Ltd
+ ID_OUI_FROM_DATABASE=HORIZON.INC
 
 OUI:70B3D569C*
  ID_OUI_FROM_DATABASE=Keepen
@@ -71219,6 +71669,9 @@ OUI:70B3D571D*
 OUI:70B3D571E*
  ID_OUI_FROM_DATABASE=Motec Pty Ltd
 
+OUI:70B3D571F*
+ ID_OUI_FROM_DATABASE=Grayshift
+
 OUI:70B3D5720*
  ID_OUI_FROM_DATABASE=Jeio Tech
 
@@ -71286,7 +71739,7 @@ OUI:70B3D5735*
  ID_OUI_FROM_DATABASE=Swiss Audio
 
 OUI:70B3D5736*
- ID_OUI_FROM_DATABASE=Jabil, Inc.
+ ID_OUI_FROM_DATABASE=Jabil
 
 OUI:70B3D5737*
  ID_OUI_FROM_DATABASE=SD Biosensor
@@ -71810,6 +72263,9 @@ OUI:70B3D57E4*
 OUI:70B3D57E5*
  ID_OUI_FROM_DATABASE=Megaflex Oy
 
+OUI:70B3D57E6*
+ ID_OUI_FROM_DATABASE=11811347 CANADA Inc.
+
 OUI:70B3D57E7*
  ID_OUI_FROM_DATABASE=Atessa, Inc.
 
@@ -71978,6 +72434,9 @@ OUI:70B3D581D*
 OUI:70B3D581E*
  ID_OUI_FROM_DATABASE=Novathings
 
+OUI:70B3D581F*
+ ID_OUI_FROM_DATABASE=CAR-connect GmbH
+
 OUI:70B3D5820*
  ID_OUI_FROM_DATABASE=Becker Nachrichtentechnik GmbH
 
@@ -72521,6 +72980,9 @@ OUI:70B3D58D4*
 OUI:70B3D58D5*
  ID_OUI_FROM_DATABASE=Guangzhou Wanglu
 
+OUI:70B3D58D6*
+ ID_OUI_FROM_DATABASE=Beijing Xiansheng Technology Co., Ltd
+
 OUI:70B3D58D7*
  ID_OUI_FROM_DATABASE=Schneider Electric Motion USA
 
@@ -72944,6 +73406,9 @@ OUI:70B3D5963*
 OUI:70B3D5964*
  ID_OUI_FROM_DATABASE=Visility
 
+OUI:70B3D5965*
+ ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
+
 OUI:70B3D5966*
  ID_OUI_FROM_DATABASE=dA Tomato Limited
 
@@ -72956,6 +73421,9 @@ OUI:70B3D5968*
 OUI:70B3D5969*
  ID_OUI_FROM_DATABASE=Emtel System Sp. z o.o.
 
+OUI:70B3D596A*
+ ID_OUI_FROM_DATABASE=Anello Photonics
+
 OUI:70B3D596B*
  ID_OUI_FROM_DATABASE=FOCAL-JMLab
 
@@ -73283,6 +73751,9 @@ OUI:70B3D59D6*
 OUI:70B3D59D7*
  ID_OUI_FROM_DATABASE=KM OptoElektronik GmbH
 
+OUI:70B3D59D8*
+ ID_OUI_FROM_DATABASE=JOLANYEE  Technology Co., Ltd.
+
 OUI:70B3D59D9*
  ID_OUI_FROM_DATABASE=ATX Networks Corp
 
@@ -73436,6 +73907,9 @@ OUI:70B3D5A0A*
 OUI:70B3D5A0B*
  ID_OUI_FROM_DATABASE=ambiHome GmbH
 
+OUI:70B3D5A0C*
+ ID_OUI_FROM_DATABASE=Lumiplan Duhamel
+
 OUI:70B3D5A0D*
  ID_OUI_FROM_DATABASE=Globalcom Engineering SPA
 
@@ -73457,6 +73931,9 @@ OUI:70B3D5A12*
 OUI:70B3D5A13*
  ID_OUI_FROM_DATABASE=Uplevel Systems Inc
 
+OUI:70B3D5A14*
+ ID_OUI_FROM_DATABASE=aelettronica group srl
+
 OUI:70B3D5A15*
  ID_OUI_FROM_DATABASE=Intercore GmbH
 
@@ -73691,6 +74168,9 @@ OUI:70B3D5A61*
 OUI:70B3D5A62*
  ID_OUI_FROM_DATABASE=Environexus
 
+OUI:70B3D5A63*
+ ID_OUI_FROM_DATABASE=DesignA Electronics Limited
+
 OUI:70B3D5A64*
  ID_OUI_FROM_DATABASE=Newshine
 
@@ -73820,6 +74300,9 @@ OUI:70B3D5A8D*
 OUI:70B3D5A8E*
  ID_OUI_FROM_DATABASE=OMESH CITY GROUP
 
+OUI:70B3D5A8F*
+ ID_OUI_FROM_DATABASE=VK Integrated Systems
+
 OUI:70B3D5A90*
  ID_OUI_FROM_DATABASE=ERA a.s.
 
@@ -74003,6 +74486,9 @@ OUI:70B3D5ACC*
 OUI:70B3D5ACD*
  ID_OUI_FROM_DATABASE=CRDE
 
+OUI:70B3D5ACE*
+ ID_OUI_FROM_DATABASE=FARHO DOMOTICA SL
+
 OUI:70B3D5ACF*
  ID_OUI_FROM_DATABASE=APG Cash Drawer, LLC
 
@@ -74141,6 +74627,9 @@ OUI:70B3D5AFB*
 OUI:70B3D5AFC*
  ID_OUI_FROM_DATABASE=BAE Systems
 
+OUI:70B3D5AFD*
+ ID_OUI_FROM_DATABASE=dongsheng
+
 OUI:70B3D5AFE*
  ID_OUI_FROM_DATABASE=MESOTECHNIC
 
@@ -74615,6 +75104,9 @@ OUI:70B3D5B9E*
 OUI:70B3D5B9F*
  ID_OUI_FROM_DATABASE=Yuksek Kapasite Radyolink Sistemleri San. ve Tic. A.S.
 
+OUI:70B3D5BA0*
+ ID_OUI_FROM_DATABASE=Season Electronics Ltd
+
 OUI:70B3D5BA1*
  ID_OUI_FROM_DATABASE=Cathwell AS
 
@@ -74873,6 +75365,9 @@ OUI:70B3D5BF5*
 OUI:70B3D5BF6*
  ID_OUI_FROM_DATABASE=comtac AG
 
+OUI:70B3D5BF7*
+ ID_OUI_FROM_DATABASE=Fischer Connectors
+
 OUI:70B3D5BF8*
  ID_OUI_FROM_DATABASE=RCH ITALIA SPA
 
@@ -74972,6 +75467,9 @@ OUI:70B3D5C17*
 OUI:70B3D5C18*
  ID_OUI_FROM_DATABASE=Sanmina Israel
 
+OUI:70B3D5C19*
+ ID_OUI_FROM_DATABASE=Zumbach Electronic AG
+
 OUI:70B3D5C1A*
  ID_OUI_FROM_DATABASE=Xylon
 
@@ -75233,6 +75731,9 @@ OUI:70B3D5C6F*
 OUI:70B3D5C70*
  ID_OUI_FROM_DATABASE=Magnetek
 
+OUI:70B3D5C71*
+ ID_OUI_FROM_DATABASE=The Engineerix Group
+
 OUI:70B3D5C72*
  ID_OUI_FROM_DATABASE=Scharco Elektronik GmbH
 
@@ -75581,6 +76082,9 @@ OUI:70B3D5CE4*
 OUI:70B3D5CE5*
  ID_OUI_FROM_DATABASE=GridBridge Inc
 
+OUI:70B3D5CE6*
+ ID_OUI_FROM_DATABASE=Dynim Oy
+
 OUI:70B3D5CE7*
  ID_OUI_FROM_DATABASE=June Automation Singapore Pte. Ltd.
 
@@ -75710,6 +76214,9 @@ OUI:70B3D5D11*
 OUI:70B3D5D12*
  ID_OUI_FROM_DATABASE=FIDELTRONIK POLAND SP. Z O.O.
 
+OUI:70B3D5D13*
+ ID_OUI_FROM_DATABASE=IRT Technologies
+
 OUI:70B3D5D14*
  ID_OUI_FROM_DATABASE=LIGPT
 
@@ -75929,6 +76436,9 @@ OUI:70B3D5D5B*
 OUI:70B3D5D5C*
  ID_OUI_FROM_DATABASE=Critical Link LLC
 
+OUI:70B3D5D5D*
+ ID_OUI_FROM_DATABASE=SEASONS 4 INC
+
 OUI:70B3D5D5E*
  ID_OUI_FROM_DATABASE=Barcelona Smart Technologies
 
@@ -76271,6 +76781,9 @@ OUI:70B3D5DCE*
 OUI:70B3D5DCF*
  ID_OUI_FROM_DATABASE=KLS Netherlands B.V.
 
+OUI:70B3D5DD0*
+ ID_OUI_FROM_DATABASE=Deep Secure Limited
+
 OUI:70B3D5DD1*
  ID_OUI_FROM_DATABASE=em-tec GmbH
 
@@ -76386,7 +76899,7 @@ OUI:70B3D5DF6*
  ID_OUI_FROM_DATABASE=Tiab Limited
 
 OUI:70B3D5DF7*
- ID_OUI_FROM_DATABASE=Refecor Oy
+ ID_OUI_FROM_DATABASE=ScopeSensor Oy
 
 OUI:70B3D5DF8*
  ID_OUI_FROM_DATABASE=RMA Mess- und Regeltechnik GmbH & Co.KG
@@ -76421,9 +76934,15 @@ OUI:70B3D5E01*
 OUI:70B3D5E02*
  ID_OUI_FROM_DATABASE=YEHL & JORDAN LLC
 
+OUI:70B3D5E03*
+ ID_OUI_FROM_DATABASE=MBJ
+
 OUI:70B3D5E04*
  ID_OUI_FROM_DATABASE=Combilent
 
+OUI:70B3D5E05*
+ ID_OUI_FROM_DATABASE=Lobaro GmbH
+
 OUI:70B3D5E06*
  ID_OUI_FROM_DATABASE=System West dba ICS Electronics
 
@@ -76448,6 +76967,9 @@ OUI:70B3D5E0C*
 OUI:70B3D5E0D*
  ID_OUI_FROM_DATABASE=Sigma Connectivity AB
 
+OUI:70B3D5E0E*
+ ID_OUI_FROM_DATABASE=VulcanForms
+
 OUI:70B3D5E0F*
  ID_OUI_FROM_DATABASE=Vtron Pty Ltd
 
@@ -76685,6 +77207,9 @@ OUI:70B3D5E5D*
 OUI:70B3D5E5E*
  ID_OUI_FROM_DATABASE=Critical Link LLC
 
+OUI:70B3D5E5F*
+ ID_OUI_FROM_DATABASE=CesiumAstro Inc.
+
 OUI:70B3D5E60*
  ID_OUI_FROM_DATABASE=Davitor AB
 
@@ -76907,6 +77432,9 @@ OUI:70B3D5EA8*
 OUI:70B3D5EA9*
  ID_OUI_FROM_DATABASE=Zhuhai Lonl electric Co.,Ltd.
 
+OUI:70B3D5EAA*
+ ID_OUI_FROM_DATABASE=Druck Ltd.
+
 OUI:70B3D5EAB*
  ID_OUI_FROM_DATABASE=APEN GROUP SpA (VAT IT08767740155)
 
@@ -76970,6 +77498,9 @@ OUI:70B3D5EBE*
 OUI:70B3D5EBF*
  ID_OUI_FROM_DATABASE=AUTOMATICA Y REGULACION S.A.
 
+OUI:70B3D5EC0*
+ ID_OUI_FROM_DATABASE=ProtoConvert Pty Ltd
+
 OUI:70B3D5EC1*
  ID_OUI_FROM_DATABASE=Xafax Nederland bv
 
@@ -77033,6 +77564,9 @@ OUI:70B3D5ED4*
 OUI:70B3D5ED5*
  ID_OUI_FROM_DATABASE=hangzhou battle link technology Co.,Ltd
 
+OUI:70B3D5ED6*
+ ID_OUI_FROM_DATABASE=Metrasens Limited
+
 OUI:70B3D5ED7*
  ID_OUI_FROM_DATABASE=WAVE
 
@@ -77345,6 +77879,9 @@ OUI:70B3D5F3E*
 OUI:70B3D5F3F*
  ID_OUI_FROM_DATABASE=comtac AG
 
+OUI:70B3D5F40*
+ ID_OUI_FROM_DATABASE=HORIZON.INC
+
 OUI:70B3D5F41*
  ID_OUI_FROM_DATABASE=DUEVI SRL
 
@@ -77498,6 +78035,9 @@ OUI:70B3D5F72*
 OUI:70B3D5F73*
  ID_OUI_FROM_DATABASE=ASL Holdings
 
+OUI:70B3D5F74*
+ ID_OUI_FROM_DATABASE=TESSA AGRITECH SRL
+
 OUI:70B3D5F75*
  ID_OUI_FROM_DATABASE=Enlaps
 
@@ -77924,6 +78464,9 @@ OUI:70B7E2*
 OUI:70B921*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
+OUI:70B950*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:70BAEF*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
@@ -78551,6 +79094,9 @@ OUI:745C4B*
 OUI:745C9F*
  ID_OUI_FROM_DATABASE=TCT mobile ltd
 
+OUI:745D68*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:745E1C*
  ID_OUI_FROM_DATABASE=PIONEER CORPORATION
 
@@ -78923,6 +79469,9 @@ OUI:74CD0C*
 OUI:74CE56*
  ID_OUI_FROM_DATABASE=Packet Force Technology Limited Company
 
+OUI:74CF00*
+ ID_OUI_FROM_DATABASE=Shenzhen SuperElectron Technology Co.,Ltd.
+
 OUI:74D02B*
  ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
@@ -79043,6 +79592,9 @@ OUI:74E19A*
 OUI:74E1B6*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:74E20C*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:74E277*
  ID_OUI_FROM_DATABASE=Vizmonet Pte Ltd
 
@@ -79449,7 +80001,7 @@ OUI:78471D*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:7847E3*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:784859*
  ID_OUI_FROM_DATABASE=Hewlett Packard
@@ -79628,6 +80180,9 @@ OUI:7884EE*
 OUI:7885F4*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:7886B6*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+
 OUI:78870D*
  ID_OUI_FROM_DATABASE=Unifiedgateways India Private Limited
 
@@ -79827,7 +80382,7 @@ OUI:78B81A*
  ID_OUI_FROM_DATABASE=INTER SALES A/S
 
 OUI:78B84B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:78B8D6*
  ID_OUI_FROM_DATABASE=Zebra Technologies Inc.
@@ -79838,6 +80393,9 @@ OUI:78BAD0*
 OUI:78BAF9*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:78BB88*
+ ID_OUI_FROM_DATABASE=Maxio Technology (Hangzhou) Ltd.
+
 OUI:78BC1A*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -79872,7 +80430,7 @@ OUI:78C2C05*
  ID_OUI_FROM_DATABASE=ShenZhen TuLing Robot CO.,LTD
 
 OUI:78C2C06*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:78C2C07*
  ID_OUI_FROM_DATABASE=Guangzhou Hongcai Stage Equipment co.,ltd
@@ -80078,6 +80636,9 @@ OUI:78D66F*
 OUI:78D6B2*
  ID_OUI_FROM_DATABASE=Toshiba
 
+OUI:78D6DC*
+ ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
+
 OUI:78D6F0*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
@@ -80423,6 +80984,9 @@ OUI:7C2634*
 OUI:7C2664*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
+OUI:7C27BC*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+
 OUI:7C2A31*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -80480,6 +81044,9 @@ OUI:7C3CB6*
 OUI:7C3D2B*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:7C3E74*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:7C3E9D*
  ID_OUI_FROM_DATABASE=PATECH
 
@@ -80732,6 +81299,9 @@ OUI:7C70BCE*
 OUI:7C70BCF*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:7C70DB*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:7C7176*
  ID_OUI_FROM_DATABASE=Wuxi iData Technology Company Ltd.
 
@@ -80792,6 +81362,9 @@ OUI:7C8274*
 OUI:7C8306*
  ID_OUI_FROM_DATABASE=Glen Dimplex Nordic as
 
+OUI:7C8530*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:7C8956*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -81138,7 +81711,7 @@ OUI:7CCBE2E*
  ID_OUI_FROM_DATABASE=Aplex Technology Inc.
 
 OUI:7CCC1F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:7CCCB8*
  ID_OUI_FROM_DATABASE=Intel Corporate
@@ -81275,6 +81848,9 @@ OUI:7CF31B*
 OUI:7CF429*
  ID_OUI_FROM_DATABASE=NUUO Inc.
 
+OUI:7CF462*
+ ID_OUI_FROM_DATABASE=BEIJING HUAWOO TECHNOLOGIES CO.LTD
+
 OUI:7CF666*
  ID_OUI_FROM_DATABASE=Tuya Smart Inc.
 
@@ -81585,7 +82161,7 @@ OUI:804786*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
 OUI:8048A5*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:804971*
  ID_OUI_FROM_DATABASE=Apple, Inc.
@@ -81668,6 +82244,9 @@ OUI:806459*
 OUI:80647A*
  ID_OUI_FROM_DATABASE=Ola Sense Inc
 
+OUI:806559*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
 OUI:80656D*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -81959,6 +82538,9 @@ OUI:80B575*
 OUI:80B624*
  ID_OUI_FROM_DATABASE=IVS
 
+OUI:80B655*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:80B686*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -82028,6 +82610,9 @@ OUI:80CA4B*
 OUI:80CC12*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
+OUI:80CC9C*
+ ID_OUI_FROM_DATABASE=NETGEAR
+
 OUI:80CE62*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -83189,6 +83774,9 @@ OUI:84EB18*
 OUI:84EB3E*
  ID_OUI_FROM_DATABASE=Vivint Smart Home
 
+OUI:84EBEF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:84ED33*
  ID_OUI_FROM_DATABASE=BBMC Co.,Ltd
 
@@ -83816,6 +84404,9 @@ OUI:889FFA*
 OUI:88A084*
  ID_OUI_FROM_DATABASE=Formation Data Systems
 
+OUI:88A0BE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:88A25E*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -83906,6 +84497,9 @@ OUI:88AE07*
 OUI:88AE1D*
  ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
+OUI:88AEDD*
+ ID_OUI_FROM_DATABASE=EliteGroup Computer Systems Co., LTD
+
 OUI:88B111*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -83984,6 +84578,51 @@ OUI:88C626*
 OUI:88C663*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:88C9B30*
+ ID_OUI_FROM_DATABASE=ADOPT NETTECH PVT LTD
+
+OUI:88C9B31*
+ ID_OUI_FROM_DATABASE=Cervoz Technology Co; Ltd.
+
+OUI:88C9B32*
+ ID_OUI_FROM_DATABASE=shenzhen franklin ESS technology CO.,Ltd
+
+OUI:88C9B33*
+ ID_OUI_FROM_DATABASE=Fortive Setra-ICG(Tianjin)Co.,Ltd
+
+OUI:88C9B34*
+ ID_OUI_FROM_DATABASE=Hasbro Inc
+
+OUI:88C9B35*
+ ID_OUI_FROM_DATABASE=Brabender Technologie GmbH & Co, KG
+
+OUI:88C9B36*
+ ID_OUI_FROM_DATABASE=Hugo Techno
+
+OUI:88C9B37*
+ ID_OUI_FROM_DATABASE=Robert Bosch JuP1
+
+OUI:88C9B38*
+ ID_OUI_FROM_DATABASE=Divelbiss Corporation
+
+OUI:88C9B39*
+ ID_OUI_FROM_DATABASE=Richbeam (Beijing) Technology Co., Ltd.
+
+OUI:88C9B3A*
+ ID_OUI_FROM_DATABASE=Gefran Drive & Motion srl
+
+OUI:88C9B3B*
+ ID_OUI_FROM_DATABASE=Shenzhen MMUI Co.,Ltd
+
+OUI:88C9B3C*
+ ID_OUI_FROM_DATABASE=Shenzhen Viewsmart Technology Co.,Ltd
+
+OUI:88C9B3D*
+ ID_OUI_FROM_DATABASE=Origins Technology Limited
+
+OUI:88C9B3E*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
 OUI:88C9D0*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -84143,6 +84782,9 @@ OUI:88F7C7*
 OUI:88F872*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:88FCA6*
+ ID_OUI_FROM_DATABASE=devolo AG
+
 OUI:88FD15*
  ID_OUI_FROM_DATABASE=LINEEYE CO., LTD
 
@@ -84680,6 +85322,9 @@ OUI:8C640B*
 OUI:8C6422*
  ID_OUI_FROM_DATABASE=Sony Mobile Communications Inc
 
+OUI:8C64A2*
+ ID_OUI_FROM_DATABASE=OnePlus Technology (Shenzhen) Co., Ltd
+
 OUI:8C64D4*
  ID_OUI_FROM_DATABASE=Hyeco Smart Tech Co.,Ltd
 
@@ -84692,6 +85337,9 @@ OUI:8C6878*
 OUI:8C68C8*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:8C6A8D*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
 OUI:8C6AE4*
  ID_OUI_FROM_DATABASE=Viogem Limited
 
@@ -84854,6 +85502,9 @@ OUI:8C9351*
 OUI:8C941F*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:8C94CC*
+ ID_OUI_FROM_DATABASE=SFR
+
 OUI:8C94CF*
  ID_OUI_FROM_DATABASE=Encell Technology, Inc.
 
@@ -84875,6 +85526,9 @@ OUI:8CA048*
 OUI:8CA2FD*
  ID_OUI_FROM_DATABASE=Starry, Inc.
 
+OUI:8CA399*
+ ID_OUI_FROM_DATABASE=SERVERCOM (INDIA) PRIVATE LIMITED
+
 OUI:8CA5A1*
  ID_OUI_FROM_DATABASE=Oregano Systems - Design & Consulting GmbH
 
@@ -85211,6 +85865,9 @@ OUI:8CFABA*
 OUI:8CFCA0*
  ID_OUI_FROM_DATABASE=Shenzhen Smart Device Technology Co., LTD.
 
+OUI:8CFD15*
+ ID_OUI_FROM_DATABASE=Imagine Marketing Private Limited
+
 OUI:8CFD18*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -85619,6 +86276,9 @@ OUI:9067F3*
 OUI:9068C3*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
+OUI:906976*
+ ID_OUI_FROM_DATABASE=Withrobot Inc.
+
 OUI:906CAC*
  ID_OUI_FROM_DATABASE=Fortinet, Inc.
 
@@ -85694,6 +86354,9 @@ OUI:907EBA*
 OUI:907F61*
  ID_OUI_FROM_DATABASE=Chicony Electronics Co., Ltd.
 
+OUI:908060*
+ ID_OUI_FROM_DATABASE=Nilfisk A/S
+
 OUI:90808F*
  ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
 
@@ -85722,7 +86385,7 @@ OUI:90848B*
  ID_OUI_FROM_DATABASE=HDR10+ Technologies, LLC
 
 OUI:908674*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:90869B*
  ID_OUI_FROM_DATABASE=zte corporation
@@ -85778,6 +86441,9 @@ OUI:909497*
 OUI:9094E4*
  ID_OUI_FROM_DATABASE=D-Link International
 
+OUI:9096F3*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
+
 OUI:9097D5*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
@@ -86609,6 +87275,9 @@ OUI:948FCF*
 OUI:948FEE*
  ID_OUI_FROM_DATABASE=Verizon Telematics
 
+OUI:949010*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:949034*
  ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
 
@@ -86684,6 +87353,9 @@ OUI:94A7B7*
 OUI:94A7BC*
  ID_OUI_FROM_DATABASE=BodyMedia, Inc.
 
+OUI:94AA0A*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
 OUI:94AAB8*
  ID_OUI_FROM_DATABASE=Joview(Beijing) Technology Co. Ltd.
 
@@ -87443,6 +88115,9 @@ OUI:984265*
 OUI:9843DA*
  ID_OUI_FROM_DATABASE=INTERTECH
 
+OUI:9843FA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:9844B6*
  ID_OUI_FROM_DATABASE=INFRANOR SAS
 
@@ -87467,6 +88142,9 @@ OUI:984874*
 OUI:984914*
  ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
+OUI:98499F*
+ ID_OUI_FROM_DATABASE=Domo Tactical Communications
+
 OUI:9849E1*
  ID_OUI_FROM_DATABASE=Boeing Defence Australia
 
@@ -87641,6 +88319,9 @@ OUI:987A14*
 OUI:987BF3*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:987DDD*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
 OUI:987E46*
  ID_OUI_FROM_DATABASE=Emizon Networks Limited
 
@@ -87977,6 +88658,9 @@ OUI:98EF9B*
 OUI:98F058*
  ID_OUI_FROM_DATABASE=Lynxspring, Incl.
 
+OUI:98F083*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:98F0AB*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -87989,6 +88673,9 @@ OUI:98F181*
 OUI:98F199*
  ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
+OUI:98F217*
+ ID_OUI_FROM_DATABASE=Castlenet Technology Inc.
+
 OUI:98F2B3*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
@@ -88278,7 +88965,7 @@ OUI:9C31C3*
  ID_OUI_FROM_DATABASE=BSkyB Ltd
 
 OUI:9C32A9*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:9C32CE*
  ID_OUI_FROM_DATABASE=CANON INC.
@@ -88424,6 +89111,9 @@ OUI:9C57AD*
 OUI:9C5A44*
  ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
+OUI:9C5A81*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:9C5B96*
  ID_OUI_FROM_DATABASE=NMR Corporation
 
@@ -88455,7 +89145,7 @@ OUI:9C611D*
  ID_OUI_FROM_DATABASE=Panasonic Corporation of North America
 
 OUI:9C6121*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:9C62AB*
  ID_OUI_FROM_DATABASE=Sumavision Technologies Co.,Ltd
@@ -88704,7 +89394,7 @@ OUI:9C9C1F*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
 OUI:9C9C40*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:9C9D5D*
  ID_OUI_FROM_DATABASE=Raden Inc
@@ -88712,6 +89402,9 @@ OUI:9C9D5D*
 OUI:9C9D7E*
  ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
 
+OUI:9C9E71*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:9CA10A*
  ID_OUI_FROM_DATABASE=SCLE SFE
 
@@ -89750,6 +90443,9 @@ OUI:A09E1A*
 OUI:A09F10*
  ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
 
+OUI:A0A0DC*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:A0A130*
  ID_OUI_FROM_DATABASE=DLI Taiwan Branch office
 
@@ -89801,6 +90497,9 @@ OUI:A0AFBD*
 OUI:A0B045*
  ID_OUI_FROM_DATABASE=Halong Mining
 
+OUI:A0B086*
+ ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
+
 OUI:A0B100*
  ID_OUI_FROM_DATABASE=ShenZhen Cando Electronics Co.,Ltd
 
@@ -89996,6 +90695,9 @@ OUI:A0D3C1*
 OUI:A0D635*
  ID_OUI_FROM_DATABASE=WBS Technology
 
+OUI:A0D722*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:A0D795*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -90062,6 +90764,9 @@ OUI:A0E617*
 OUI:A0E6F8*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:A0E70B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:A0E9DB*
  ID_OUI_FROM_DATABASE=Ningbo FreeWings Technologies Co.,Ltd
 
@@ -90317,6 +91022,9 @@ OUI:A42985*
 OUI:A429B7*
  ID_OUI_FROM_DATABASE=bluesky
 
+OUI:A42A71*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
+
 OUI:A42B8C*
  ID_OUI_FROM_DATABASE=NETGEAR
 
@@ -90590,6 +91298,9 @@ OUI:A453EEC*
 OUI:A453EED*
  ID_OUI_FROM_DATABASE=SSK CORPORATION
 
+OUI:A45590*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
 OUI:A45602*
  ID_OUI_FROM_DATABASE=fenglian Technology Co.,Ltd.
 
@@ -90725,6 +91436,9 @@ OUI:A47758*
 OUI:A47760*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
+OUI:A47806*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:A47886*
  ID_OUI_FROM_DATABASE=Avaya Inc
 
@@ -91044,7 +91758,7 @@ OUI:A4CFD2*
  ID_OUI_FROM_DATABASE=Ubee Interactive Co., Limited
 
 OUI:A4D094*
- ID_OUI_FROM_DATABASE=Erwin Peters Systemtechnik GmbH
+ ID_OUI_FROM_DATABASE=VIVAVIS AG
 
 OUI:A4D18C*
  ID_OUI_FROM_DATABASE=Apple, Inc.
@@ -91067,6 +91781,9 @@ OUI:A4D4B2*
 OUI:A4D578*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:A4D73C*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+
 OUI:A4D795*
  ID_OUI_FROM_DATABASE=Wingtech Mobile Communications Co.,Ltd
 
@@ -91373,6 +92090,9 @@ OUI:A81FAF*
 OUI:A82066*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:A82316*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:A823FE*
  ID_OUI_FROM_DATABASE=LG Electronics
 
@@ -91539,7 +92259,7 @@ OUI:A854B2*
  ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
 OUI:A8556A*
- ID_OUI_FROM_DATABASE=Pocketnet Technology Inc.
+ ID_OUI_FROM_DATABASE=3S System Technology Inc.
 
 OUI:A8574E*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
@@ -91598,6 +92318,9 @@ OUI:A863F2*
 OUI:A86405*
  ID_OUI_FROM_DATABASE=nimbus 9, Inc
 
+OUI:A864F1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:A865B2*
  ID_OUI_FROM_DATABASE=DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED
 
@@ -91652,6 +92375,9 @@ OUI:A875D6*
 OUI:A875E2*
  ID_OUI_FROM_DATABASE=Aventura Technologies, Inc.
 
+OUI:A87650*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:A8776F*
  ID_OUI_FROM_DATABASE=Zonoff
 
@@ -92513,6 +93239,9 @@ OUI:AC7289*
 OUI:AC7409*
  ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
+OUI:AC74B1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:AC74C4*
  ID_OUI_FROM_DATABASE=Maytronics Ltd.
 
@@ -92621,6 +93350,9 @@ OUI:AC9403*
 OUI:AC9572*
  ID_OUI_FROM_DATABASE=Jovision Technology Co., Ltd.
 
+OUI:AC976C*
+ ID_OUI_FROM_DATABASE=Greenliant
+
 OUI:AC9929*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -92810,6 +93542,9 @@ OUI:ACD618*
 OUI:ACD657*
  ID_OUI_FROM_DATABASE=Shaanxi GuoLian Digital TV Technology Co.,Ltd.
 
+OUI:ACD829*
+ ID_OUI_FROM_DATABASE=Bouffalo Lab (Nanjing) Co., Ltd.
+
 OUI:ACD9D6*
  ID_OUI_FROM_DATABASE=tci GmbH
 
@@ -92834,6 +93569,9 @@ OUI:ACE010*
 OUI:ACE069*
  ID_OUI_FROM_DATABASE=ISAAC Instruments
 
+OUI:ACE14F*
+ ID_OUI_FROM_DATABASE=Autonomic Controls, Inc.
+
 OUI:ACE215*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -92859,7 +93597,7 @@ OUI:ACE64B*
  ID_OUI_FROM_DATABASE=Shenzhen Baojia Battery Technology Co., Ltd.
 
 OUI:ACE77B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:ACE87B*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -93077,6 +93815,9 @@ OUI:B02628*
 OUI:B02680*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:B027CF*
+ ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
+
 OUI:B02A1F*
  ID_OUI_FROM_DATABASE=Wingtech Group (HongKong)Limited
 
@@ -93455,6 +94196,9 @@ OUI:B0A72A*
 OUI:B0A737*
  ID_OUI_FROM_DATABASE=Roku, Inc.
 
+OUI:B0A7B9*
+ ID_OUI_FROM_DATABASE=TP-Link Corporation Limited
+
 OUI:B0A86E*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
@@ -93713,6 +94457,9 @@ OUI:B0D7C5*
 OUI:B0D7CC*
  ID_OUI_FROM_DATABASE=Tridonic GmbH & Co KG
 
+OUI:B0D888*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation Automotive
+
 OUI:B0DA00*
  ID_OUI_FROM_DATABASE=CERA ELECTRONIQUE
 
@@ -94814,12 +95561,18 @@ OUI:B810D4*
 OUI:B8114B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:B81332*
+ ID_OUI_FROM_DATABASE=AMPAK Technology,Inc.
+
 OUI:B813E9*
  ID_OUI_FROM_DATABASE=Trace Live Network
 
 OUI:B81413*
  ID_OUI_FROM_DATABASE=Keen High Holding(HK) Ltd.
 
+OUI:B8145C*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:B814DB*
  ID_OUI_FROM_DATABASE=OHSUNG
 
@@ -94851,7 +95604,7 @@ OUI:B820E7*
  ID_OUI_FROM_DATABASE=Guangzhou Horizontal Information & Network Integration Co. Ltd
 
 OUI:B8224F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:B82410*
  ID_OUI_FROM_DATABASE=Magneti Marelli Slovakia s.r.o.
@@ -94865,6 +95618,9 @@ OUI:B824F0*
 OUI:B8259A*
  ID_OUI_FROM_DATABASE=Thalmic Labs
 
+OUI:B825B5*
+ ID_OUI_FROM_DATABASE=Trakm8 Ltd
+
 OUI:B8266C*
  ID_OUI_FROM_DATABASE=ANOV France
 
@@ -95231,6 +95987,9 @@ OUI:B89BE4*
 OUI:B89F09*
  ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
+OUI:B8A14A*
+ ID_OUI_FROM_DATABASE=Raisecom Technology CO.,LTD
+
 OUI:B8A175*
  ID_OUI_FROM_DATABASE=Roku, Inc.
 
@@ -95285,6 +96044,9 @@ OUI:B8B3DC*
 OUI:B8B42E*
  ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co,Ltd.ShenZhen
 
+OUI:B8B77D*
+ ID_OUI_FROM_DATABASE=Guangdong Transtek Medical Electronics CO.,Ltd
+
 OUI:B8B7D7*
  ID_OUI_FROM_DATABASE=2GIG Technologies
 
@@ -95414,6 +96176,9 @@ OUI:B8D50B*
 OUI:B8D526*
  ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
 
+OUI:B8D56B*
+ ID_OUI_FROM_DATABASE=Mirka Ltd.
+
 OUI:B8D6F6*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -96245,6 +97010,9 @@ OUI:BCA042*
 OUI:BCA13A*
  ID_OUI_FROM_DATABASE=SES-imagotag
 
+OUI:BCA37F*
+ ID_OUI_FROM_DATABASE=Rail-Mil Sp. z o.o. Sp. K.
+
 OUI:BCA4E1*
  ID_OUI_FROM_DATABASE=Nabto
 
@@ -96437,6 +97205,9 @@ OUI:BCEC23*
 OUI:BCEC5D*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:BCECA0*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+
 OUI:BCEE7B*
  ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
@@ -96552,7 +97323,7 @@ OUI:C01ADA*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
 OUI:C01B23*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:C01C30*
  ID_OUI_FROM_DATABASE=Shenzhen WIFI-3L Technology Co.,Ltd
@@ -96566,6 +97337,9 @@ OUI:C0210D*
 OUI:C02250*
  ID_OUI_FROM_DATABASE=Koss Corporation
 
+OUI:C0238D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:C02506*
  ID_OUI_FROM_DATABASE=AVM GmbH
 
@@ -96653,6 +97427,9 @@ OUI:C0395A*
 OUI:C03B8F*
  ID_OUI_FROM_DATABASE=Minicom Digital Signage
 
+OUI:C03C04*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
 OUI:C03C59*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -97197,7 +97974,7 @@ OUI:C0CBF1*
  ID_OUI_FROM_DATABASE=Mobiwire Mobiles (NingBo) Co., LTD
 
 OUI:C0CC42*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:C0CCF8*
  ID_OUI_FROM_DATABASE=Apple, Inc.
@@ -97379,6 +98156,54 @@ OUI:C0F945*
 OUI:C0F991*
  ID_OUI_FROM_DATABASE=GME Standard Communications P/L
 
+OUI:C0F9B0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:C0FBF90*
+ ID_OUI_FROM_DATABASE=Xerox Corporation
+
+OUI:C0FBF91*
+ ID_OUI_FROM_DATABASE=LIXIL Corporation
+
+OUI:C0FBF92*
+ ID_OUI_FROM_DATABASE=Dongguan Chuan OptoElectronics Limited
+
+OUI:C0FBF93*
+ ID_OUI_FROM_DATABASE=SHENZHEN HEQIANG ELECTRONICS LIMITED
+
+OUI:C0FBF94*
+ ID_OUI_FROM_DATABASE=Minato Advanced Technologies inc
+
+OUI:C0FBF95*
+ ID_OUI_FROM_DATABASE=HAGUENET
+
+OUI:C0FBF96*
+ ID_OUI_FROM_DATABASE=IVT corporation
+
+OUI:C0FBF97*
+ ID_OUI_FROM_DATABASE=LongSung Technology (Shanghai) Co.,Ltd.
+
+OUI:C0FBF98*
+ ID_OUI_FROM_DATABASE=Dongmengling
+
+OUI:C0FBF99*
+ ID_OUI_FROM_DATABASE=zxsolution
+
+OUI:C0FBF9A*
+ ID_OUI_FROM_DATABASE=Tiandi(Changzhou) Automation Co., Ltd.
+
+OUI:C0FBF9B*
+ ID_OUI_FROM_DATABASE=SHENZHEN COMIX HST CLOUD COMPUTING CO., LTD.
+
+OUI:C0FBF9C*
+ ID_OUI_FROM_DATABASE=SHENZHEN ELSKY TECHNOLOGY CO., LTD
+
+OUI:C0FBF9D*
+ ID_OUI_FROM_DATABASE=Dropbeats Technology Co., Ltd.
+
+OUI:C0FBF9E*
+ ID_OUI_FROM_DATABASE=Navitas Digital Safety Ltd
+
 OUI:C0FD84*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -97505,6 +98330,9 @@ OUI:C41ECE*
 OUI:C421C8*
  ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
+OUI:C42360*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:C4237A*
  ID_OUI_FROM_DATABASE=WhizNets Inc.
 
@@ -97715,6 +98543,9 @@ OUI:C45D83*
 OUI:C45DD8*
  ID_OUI_FROM_DATABASE=HDMI Forum
 
+OUI:C45E5C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:C46044*
  ID_OUI_FROM_DATABASE=Everex Electronics Limited
 
@@ -97802,6 +98633,9 @@ OUI:C4731E*
 OUI:C4741E*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:C47469*
+ ID_OUI_FROM_DATABASE=BT9
+
 OUI:C474F8*
  ID_OUI_FROM_DATABASE=Hot Pepper, Inc.
 
@@ -97811,6 +98645,9 @@ OUI:C477AB*
 OUI:C477AF*
  ID_OUI_FROM_DATABASE=Advanced Digital Broadcast SA
 
+OUI:C478A2*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C47B2F*
  ID_OUI_FROM_DATABASE=Beijing JoinHope Image Technology Ltd.
 
@@ -97877,6 +98714,12 @@ OUI:C47DFE*
 OUI:C47F51*
  ID_OUI_FROM_DATABASE=Inventek Systems
 
+OUI:C48025*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
+OUI:C4808A*
+ ID_OUI_FROM_DATABASE=Cloud Diagnostics Canada ULC
+
 OUI:C4823F*
  ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co,.Ltd.
 
@@ -98019,7 +98862,7 @@ OUI:C49FF3*
  ID_OUI_FROM_DATABASE=Mciao Technologies, Inc.
 
 OUI:C4A151*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:C4A366*
  ID_OUI_FROM_DATABASE=zte corporation
@@ -98276,6 +99119,9 @@ OUI:C4FEE2*
 OUI:C4FF1F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:C4FF22*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C4FFBC0*
  ID_OUI_FROM_DATABASE=Danego BV
 
@@ -98339,6 +99185,9 @@ OUI:C802A6*
 OUI:C803F5*
  ID_OUI_FROM_DATABASE=Ruckus Wireless
 
+OUI:C8059E*
+ ID_OUI_FROM_DATABASE=Hefei Symboltek Co.,Ltd
+
 OUI:C80718*
  ID_OUI_FROM_DATABASE=TDSi
 
@@ -98594,6 +99443,9 @@ OUI:C850CE*
 OUI:C850E9*
  ID_OUI_FROM_DATABASE=Raisecom Technology CO., LTD
 
+OUI:C85142*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:C85195*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -98873,6 +99725,9 @@ OUI:C89C1D*
 OUI:C89CDC*
  ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
+OUI:C89D18*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
 OUI:C89F1D*
  ID_OUI_FROM_DATABASE=SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD
 
@@ -98978,6 +99833,9 @@ OUI:C8BCC8*
 OUI:C8BCE5*
  ID_OUI_FROM_DATABASE=Sense Things Japan INC.
 
+OUI:C8BD69*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
 OUI:C8BE19*
  ID_OUI_FROM_DATABASE=D-Link International
 
@@ -99155,6 +100013,51 @@ OUI:C8F386*
 OUI:C8F406*
  ID_OUI_FROM_DATABASE=Avaya Inc
 
+OUI:C8F5D60*
+ ID_OUI_FROM_DATABASE=MEIRYO TECHNICA CORPORATION
+
+OUI:C8F5D61*
+ ID_OUI_FROM_DATABASE=Valeo Interior Controls (Shenzhen) Co.,Ltd
+
+OUI:C8F5D62*
+ ID_OUI_FROM_DATABASE=Qbic Technology Co., Ltd
+
+OUI:C8F5D63*
+ ID_OUI_FROM_DATABASE=BBPOS International Limited
+
+OUI:C8F5D64*
+ ID_OUI_FROM_DATABASE=EVOTOR LLC
+
+OUI:C8F5D65*
+ ID_OUI_FROM_DATABASE=Pinmicro K K
+
+OUI:C8F5D66*
+ ID_OUI_FROM_DATABASE=Jabil
+
+OUI:C8F5D67*
+ ID_OUI_FROM_DATABASE=Oscars Pro
+
+OUI:C8F5D68*
+ ID_OUI_FROM_DATABASE=Yarward Electronics  Co., Ltd.
+
+OUI:C8F5D69*
+ ID_OUI_FROM_DATABASE=Shanghai Mo xiang Network Technology CO.,Ltd
+
+OUI:C8F5D6A*
+ ID_OUI_FROM_DATABASE=HENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.
+
+OUI:C8F5D6B*
+ ID_OUI_FROM_DATABASE=United Barcode Systems
+
+OUI:C8F5D6C*
+ ID_OUI_FROM_DATABASE=Eltako GmbH
+
+OUI:C8F5D6D*
+ ID_OUI_FROM_DATABASE=Volansys technologies pvt ltd
+
+OUI:C8F5D6E*
+ ID_OUI_FROM_DATABASE=HEITEC AG
+
 OUI:C8F650*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -99260,6 +100163,9 @@ OUI:CC09C8*
 OUI:CC0CDA*
  ID_OUI_FROM_DATABASE=Miljovakt AS
 
+OUI:CC0DE7*
+ ID_OUI_FROM_DATABASE=B METERS S.R.L.
+
 OUI:CC0DEC*
  ID_OUI_FROM_DATABASE=Cisco SPVTG
 
@@ -99272,6 +100178,9 @@ OUI:CC10A3*
 OUI:CC14A6*
  ID_OUI_FROM_DATABASE=Yichun MyEnergy Domain, Inc
 
+OUI:CC1531*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:CC167E*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -99471,7 +100380,7 @@ OUI:CC3A61*
  ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
 OUI:CC3ADF*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=Neptune Technology Group Inc.
 
 OUI:CC3B27*
  ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
@@ -99852,7 +100761,7 @@ OUI:CCA223*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
 OUI:CCA260*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:CCA374*
  ID_OUI_FROM_DATABASE=Guangdong Guanglian Electronic Technology Co.Ltd
@@ -99899,6 +100808,9 @@ OUI:CCB3F8*
 OUI:CCB55A*
  ID_OUI_FROM_DATABASE=Fraunhofer ITWM
 
+OUI:CCB5D1*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
 OUI:CCB691*
  ID_OUI_FROM_DATABASE=NECMagnusCommunications
 
@@ -100373,6 +101285,9 @@ OUI:D015A6*
 OUI:D016B4*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:D01769*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
 OUI:D0176A*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -100391,6 +101306,9 @@ OUI:D01C3C*
 OUI:D01CBB*
  ID_OUI_FROM_DATABASE=Beijing Ctimes Digital Technology Co., Ltd.
 
+OUI:D01E1D*
+ ID_OUI_FROM_DATABASE=SaiNXT Technologies LLP
+
 OUI:D021AC*
  ID_OUI_FROM_DATABASE=Yo Labs LLC
 
@@ -100484,6 +101402,9 @@ OUI:D03169*
 OUI:D03311*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
+OUI:D035E5*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
 OUI:D03742*
  ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
 
@@ -100514,6 +101435,9 @@ OUI:D03DC3*
 OUI:D03E5C*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:D03E7D*
+ ID_OUI_FROM_DATABASE=CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.
+
 OUI:D03FAA*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -100529,6 +101453,9 @@ OUI:D0431E*
 OUI:D046DC*
  ID_OUI_FROM_DATABASE=Southwest Research Institute
 
+OUI:D047C1*
+ ID_OUI_FROM_DATABASE=Elma Electronic AG
+
 OUI:D048F3*
  ID_OUI_FROM_DATABASE=DATTUS Inc
 
@@ -100565,6 +101492,9 @@ OUI:D05349*
 OUI:D0542D*
  ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
+OUI:D05475*
+ ID_OUI_FROM_DATABASE=SAVI Controls
+
 OUI:D05509*
  ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
@@ -100901,6 +101831,51 @@ OUI:D09D0A*
 OUI:D09DAB*
  ID_OUI_FROM_DATABASE=TCT mobile ltd
 
+OUI:D09FD90*
+ ID_OUI_FROM_DATABASE=Lemei Intelligent IOT (Shenzhen) Co., Ltd
+
+OUI:D09FD91*
+ ID_OUI_FROM_DATABASE=elecgator bvba
+
+OUI:D09FD92*
+ ID_OUI_FROM_DATABASE=Westar Display Technologies
+
+OUI:D09FD93*
+ ID_OUI_FROM_DATABASE=Sanken-Densetsu Co.,LTD.
+
+OUI:D09FD94*
+ ID_OUI_FROM_DATABASE=Poten (Shanghai) Technology Co.,Ltd.
+
+OUI:D09FD95*
+ ID_OUI_FROM_DATABASE=Carbon Mobile GmbH
+
+OUI:D09FD96*
+ ID_OUI_FROM_DATABASE=Elevoc Technology Co., Ltd.
+
+OUI:D09FD97*
+ ID_OUI_FROM_DATABASE=Raymax Technology Ltd.
+
+OUI:D09FD98*
+ ID_OUI_FROM_DATABASE=Queclink Wireless Solutions Co., Ltd.
+
+OUI:D09FD99*
+ ID_OUI_FROM_DATABASE=ENTTEC Pty Ltd.
+
+OUI:D09FD9A*
+ ID_OUI_FROM_DATABASE=Eurolan Ltd
+
+OUI:D09FD9B*
+ ID_OUI_FROM_DATABASE=Cablewireless Laboratory Co., Ltd
+
+OUI:D09FD9C*
+ ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co,.Ltd.
+
+OUI:D09FD9D*
+ ID_OUI_FROM_DATABASE=Shenzhen eloT Technology Co.,Ltd
+
+OUI:D09FD9E*
+ ID_OUI_FROM_DATABASE=Minibems Ltd
+
 OUI:D0A0D6*
  ID_OUI_FROM_DATABASE=Chengdu TD Tech Ltd.
 
@@ -101252,6 +102227,9 @@ OUI:D404FF*
 OUI:D40598*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
+OUI:D40868*
+ ID_OUI_FROM_DATABASE=Beijing Lanxum Computer Technology CO.,LTD.
+
 OUI:D40AA9*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
@@ -101463,7 +102441,7 @@ OUI:D440F0*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
 OUI:D44165*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:D443A8*
  ID_OUI_FROM_DATABASE=Changzhou Haojie Electric Co., Ltd.
@@ -101534,6 +102512,9 @@ OUI:D45383*
 OUI:D453AF*
  ID_OUI_FROM_DATABASE=VIGO System S.A.
 
+OUI:D4548B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:D45556*
  ID_OUI_FROM_DATABASE=Fiber Mountain Inc.
 
@@ -102683,6 +103664,9 @@ OUI:D89ED4*
 OUI:D89EF3*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
+OUI:D8A011*
+ ID_OUI_FROM_DATABASE=WiZ
+
 OUI:D8A01D*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
@@ -103013,6 +103997,9 @@ OUI:DC0265*
 OUI:DC028E*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:DC0398*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
 OUI:DC052F*
  ID_OUI_FROM_DATABASE=National Products Inc.
 
@@ -103094,6 +104081,12 @@ OUI:DC1EA3*
 OUI:DC2008*
  ID_OUI_FROM_DATABASE=ASD Electronics Ltd
 
+OUI:DC2148*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:DC215C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
 OUI:DC21B9*
  ID_OUI_FROM_DATABASE=Sentec Co.Ltd
 
@@ -104121,7 +105114,7 @@ OUI:E04F43*
  ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
 OUI:E04FBD*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:E0508B*
  ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
@@ -104169,7 +105162,7 @@ OUI:E05A9F7*
  ID_OUI_FROM_DATABASE=OMB Guitars LLC
 
 OUI:E05A9F8*
- ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co.,Ltd.
+ ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co,.Ltd.
 
 OUI:E05A9F9*
  ID_OUI_FROM_DATABASE=Gemalto Document Readers
@@ -104535,7 +105528,7 @@ OUI:E0C3F3*
  ID_OUI_FROM_DATABASE=zte corporation
 
 OUI:E0C63C*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:E0C6B3*
  ID_OUI_FROM_DATABASE=MilDef AB
@@ -104753,6 +105746,12 @@ OUI:E40439*
 OUI:E405F8*
  ID_OUI_FROM_DATABASE=Bytedance
 
+OUI:E408E7*
+ ID_OUI_FROM_DATABASE=Quectel Wireless Solutions Co.,Ltd.
+
+OUI:E40CFD*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
 OUI:E40EEE*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -105623,6 +106622,9 @@ OUI:E804F3*
 OUI:E8056D*
  ID_OUI_FROM_DATABASE=Nortel Networks
 
+OUI:E805DC*
+ ID_OUI_FROM_DATABASE=Verifone Inc.
+
 OUI:E80688*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -105914,6 +106916,9 @@ OUI:E85BB7*
 OUI:E85BF0*
  ID_OUI_FROM_DATABASE=Imaging Diagnostics
 
+OUI:E85C0A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
 OUI:E85D6B*
  ID_OUI_FROM_DATABASE=Luminate Wireless
 
@@ -106277,6 +107282,9 @@ OUI:E8C1B8*
 OUI:E8C1D7*
  ID_OUI_FROM_DATABASE=Philips
 
+OUI:E8C1E8*
+ ID_OUI_FROM_DATABASE=Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd.
+
 OUI:E8C229*
  ID_OUI_FROM_DATABASE=H-Displays (MSC) Bhd
 
@@ -106346,6 +107354,9 @@ OUI:E8D819*
 OUI:E8D8D1*
  ID_OUI_FROM_DATABASE=HP Inc.
 
+OUI:E8DA00*
+ ID_OUI_FROM_DATABASE=Kivo Technology, Inc.
+
 OUI:E8DA20*
  ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
@@ -106508,6 +107519,9 @@ OUI:EC0441*
 OUI:EC086B*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
+OUI:EC08E5*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
 OUI:EC0BAE*
  ID_OUI_FROM_DATABASE=Hangzhou BroadLink Technology Co.,Ltd
 
@@ -106862,6 +107876,9 @@ OUI:EC89F5*
 OUI:EC8A4C*
  ID_OUI_FROM_DATABASE=zte corporation
 
+OUI:EC8AC4*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
 OUI:EC8AC7*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -107190,7 +108207,7 @@ OUI:ECF72B*
  ID_OUI_FROM_DATABASE=HD DIGITAL TECH CO., LTD.
 
 OUI:ECF8EB*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:ECFA03*
  ID_OUI_FROM_DATABASE=FCA
@@ -107739,7 +108756,7 @@ OUI:F0921C*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
 OUI:F092B4*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:F0933A*
  ID_OUI_FROM_DATABASE=NxtConect
@@ -107960,6 +108977,9 @@ OUI:F0C42F*
 OUI:F0C77F*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
+OUI:F0C814*
+ ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
+
 OUI:F0C850*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -108473,6 +109493,9 @@ OUI:F44D30*
 OUI:F44E05*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
+OUI:F44E38*
+ ID_OUI_FROM_DATABASE=Olibra LLC
+
 OUI:F44EE3*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -108530,6 +109553,9 @@ OUI:F45FF7*
 OUI:F4600D*
  ID_OUI_FROM_DATABASE=Panoptic Technology, Inc
 
+OUI:F46077*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
 OUI:F460E2*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
@@ -108542,6 +109568,9 @@ OUI:F4631F*
 OUI:F46349*
  ID_OUI_FROM_DATABASE=Diffon Corporation
 
+OUI:F463E7*
+ ID_OUI_FROM_DATABASE=Nanjing Maxon O.E. Tech. Co., LTD
+
 OUI:F4645D*
  ID_OUI_FROM_DATABASE=Toshiba
 
@@ -108626,6 +109655,9 @@ OUI:F46E95*
 OUI:F46F4E*
  ID_OUI_FROM_DATABASE=Echowell
 
+OUI:F46FA4*
+ ID_OUI_FROM_DATABASE=Physik Instrumente GmbH & Co. KG
+
 OUI:F46FED*
  ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
@@ -108896,6 +109928,9 @@ OUI:F4BF80*
 OUI:F4BFA8*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
+OUI:F4C02F*
+ ID_OUI_FROM_DATABASE=BlueBite
+
 OUI:F4C114*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
@@ -109019,6 +110054,9 @@ OUI:F4E204*
 OUI:F4E3FB*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
+OUI:F4E451*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
 OUI:F4E4AD*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -109739,6 +110777,9 @@ OUI:F88DEF*
 OUI:F88E85*
  ID_OUI_FROM_DATABASE=Comtrend Corporation
 
+OUI:F88EA1*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
+
 OUI:F88F07*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -109946,6 +110987,9 @@ OUI:F8B7E2*
 OUI:F8B95A*
  ID_OUI_FROM_DATABASE=LG Innotek
 
+OUI:F8BAE6*
+ ID_OUI_FROM_DATABASE=Nokia
+
 OUI:F8BBBF*
  ID_OUI_FROM_DATABASE=eero inc.
 
@@ -110358,7 +111402,7 @@ OUI:FC35E6*
  ID_OUI_FROM_DATABASE=Visteon corp
 
 OUI:FC372B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
 
 OUI:FC3964*
  ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
@@ -110618,6 +111662,9 @@ OUI:FC9114*
 OUI:FC923B*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
+OUI:FC9257*
+ ID_OUI_FROM_DATABASE=Renesas Electronics (Penang) Sdn. Bhd.
+
 OUI:FC9435*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
index 776030da0bcf30d48db20181c03d442fe48be80d..c6d3798e1b18980b471b2b01d6d801fc213bc87e 100644 (file)
@@ -51,6 +51,9 @@ acpi:ATML*:
 acpi:AUTH*:
  ID_VENDOR_FROM_DATABASE=AuthenTec
 
+acpi:BABA*:
+ ID_VENDOR_FROM_DATABASE=Alibaba Co., Ltd.
+
 acpi:BOOT*:
  ID_VENDOR_FROM_DATABASE=Coreboot Project
 
@@ -93,6 +96,9 @@ acpi:ESSX*:
 acpi:EXAR*:
  ID_VENDOR_FROM_DATABASE=Exar Corporation
 
+acpi:FRMW*:
+ ID_VENDOR_FROM_DATABASE=Framework Computer LLC
+
 acpi:FRSC*:
  ID_VENDOR_FROM_DATABASE=Freescale, Inc
 
@@ -168,6 +174,9 @@ acpi:IP3T*:
 acpi:IPHI*:
  ID_VENDOR_FROM_DATABASE=Inphi Corporation
 
+acpi:JSYS*:
+ ID_VENDOR_FROM_DATABASE=Juniper Systems, Inc.
+
 acpi:KIOX*:
  ID_VENDOR_FROM_DATABASE=Kionix, Inc.
 
@@ -228,6 +237,9 @@ acpi:PHYT*:
 acpi:PIXA*:
  ID_VENDOR_FROM_DATABASE=PixArt imaging inc.
 
+acpi:PNSO*:
+ ID_VENDOR_FROM_DATABASE=Pensando Systems, Inc.
+
 acpi:QCOM*:
  ID_VENDOR_FROM_DATABASE=Qualcomm Inc
 
@@ -243,6 +255,9 @@ acpi:RKCP*:
 acpi:RZSN*:
  ID_VENDOR_FROM_DATABASE=Rozsnyó, s.r.o.
 
+acpi:SECC*:
+ ID_VENDOR_FROM_DATABASE=Seiko Epson Corporation
+
 acpi:SHRP*:
  ID_VENDOR_FROM_DATABASE=Sharp Corporation
 
@@ -592,7 +607,7 @@ acpi:ALO*:
  ID_VENDOR_FROM_DATABASE=Algolith Inc.
 
 acpi:ALP*:
- ID_VENDOR_FROM_DATABASE=Alps Electric Company Ltd
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
 
 acpi:ALR*:
  ID_VENDOR_FROM_DATABASE=Advanced Logic
@@ -718,7 +733,7 @@ acpi:APD*:
  ID_VENDOR_FROM_DATABASE=AppliAdata
 
 acpi:APE*:
- ID_VENDOR_FROM_DATABASE=Alpine Electronics, Inc.
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
 
 acpi:APG*:
  ID_VENDOR_FROM_DATABASE=Horner Electric Inc
@@ -883,7 +898,7 @@ acpi:AUG*:
  ID_VENDOR_FROM_DATABASE=August Home, Inc.
 
 acpi:AUI*:
- ID_VENDOR_FROM_DATABASE=Alps Electric Inc
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
 
 acpi:AUO*:
  ID_VENDOR_FROM_DATABASE=AU Optronics
@@ -1473,6 +1488,9 @@ acpi:CLM*:
 acpi:CLO*:
  ID_VENDOR_FROM_DATABASE=Clone Computers
 
+acpi:CLR*:
+ ID_VENDOR_FROM_DATABASE=Clover Electronics
+
 acpi:CLT*:
  ID_VENDOR_FROM_DATABASE=automated computer control systems
 
@@ -1521,6 +1539,9 @@ acpi:CNB*:
 acpi:CNC*:
  ID_VENDOR_FROM_DATABASE=Alvedon Computers Ltd
 
+acpi:CND*:
+ ID_VENDOR_FROM_DATABASE=Micro-Star Int'l Co., Ltd.
+
 acpi:CNE*:
  ID_VENDOR_FROM_DATABASE=Cine-tal
 
@@ -1620,6 +1641,9 @@ acpi:CRI*:
 acpi:CRL*:
  ID_VENDOR_FROM_DATABASE=Creative Logic
 
+acpi:CRM*:
+ ID_VENDOR_FROM_DATABASE=CORSAIR MEMORY Inc.
+
 acpi:CRN*:
  ID_VENDOR_FROM_DATABASE=Cornerstone Imaging
 
@@ -3891,6 +3915,9 @@ acpi:KTK*:
 acpi:KTN*:
  ID_VENDOR_FROM_DATABASE=Katron Tech Inc
 
+acpi:KTS*:
+ ID_VENDOR_FROM_DATABASE=Kyokko Communication System Co., Ltd.
+
 acpi:KUR*:
  ID_VENDOR_FROM_DATABASE=Kurta Corporation
 
@@ -4986,6 +5013,9 @@ acpi:NVT*:
 acpi:NWC*:
  ID_VENDOR_FROM_DATABASE=NW Computer Engineering
 
+acpi:NWL*:
+ ID_VENDOR_FROM_DATABASE=Newline Interactive Inc.
+
 acpi:NWP*:
  ID_VENDOR_FROM_DATABASE=NovaWeb Technologies Inc
 
@@ -6816,6 +6846,9 @@ acpi:TMI*:
 acpi:TMM*:
  ID_VENDOR_FROM_DATABASE=Time Management, Inc.
 
+acpi:TMO*:
+ ID_VENDOR_FROM_DATABASE=Terumo Corporation
+
 acpi:TMR*:
  ID_VENDOR_FROM_DATABASE=Taicom International Inc
 
index bc5e3b7a60322de1abefc6a4a3242badcabab170..a5f1dacda156c47b91331ac036c389dac42acb95 100644 (file)
@@ -1,5 +1,5 @@
---- 20-acpi-vendor.hwdb.base   2021-02-12 15:42:10.664053745 +0100
-+++ 20-acpi-vendor.hwdb        2021-02-12 15:42:10.706054210 +0100
+--- 20-acpi-vendor.hwdb.base   2021-03-30 13:03:54.632421502 +0200
++++ 20-acpi-vendor.hwdb        2021-03-30 13:03:54.650421692 +0200
 @@ -3,6 +3,8 @@
  # Data imported from:
  #     https://uefi.org/uefi-pnp-export
@@ -19,7 +19,7 @@
  acpi:AMDI*:
   ID_VENDOR_FROM_DATABASE=AMD
  
-@@ -295,6 +294,9 @@
+@@ -310,6 +309,9 @@
  acpi:AAA*:
   ID_VENDOR_FROM_DATABASE=Avolites Ltd
  
@@ -29,7 +29,7 @@
  acpi:AAE*:
   ID_VENDOR_FROM_DATABASE=Anatek Electronics Inc.
  
-@@ -322,6 +324,9 @@
+@@ -337,6 +339,9 @@
  acpi:ABO*:
   ID_VENDOR_FROM_DATABASE=D-Link Systems Inc
  
@@ -39,7 +39,7 @@
  acpi:ABS*:
   ID_VENDOR_FROM_DATABASE=Abaco Systems, Inc.
  
-@@ -367,7 +372,7 @@
+@@ -382,7 +387,7 @@
  acpi:ACO*:
   ID_VENDOR_FROM_DATABASE=Allion Computer Inc.
  
@@ -48,7 +48,7 @@
   ID_VENDOR_FROM_DATABASE=Aspen Tech Inc
  
  acpi:ACR*:
-@@ -640,6 +645,9 @@
+@@ -655,6 +660,9 @@
  acpi:AMT*:
   ID_VENDOR_FROM_DATABASE=AMT International Industry
  
@@ -58,7 +58,7 @@
  acpi:AMX*:
   ID_VENDOR_FROM_DATABASE=AMX LLC
  
-@@ -688,6 +696,9 @@
+@@ -703,6 +711,9 @@
  acpi:AOA*:
   ID_VENDOR_FROM_DATABASE=AOpen Inc.
  
@@ -68,7 +68,7 @@
  acpi:AOE*:
   ID_VENDOR_FROM_DATABASE=Advanced Optics Electronics, Inc.
  
-@@ -697,6 +708,9 @@
+@@ -712,6 +723,9 @@
  acpi:AOT*:
   ID_VENDOR_FROM_DATABASE=Alcatel
  
@@ -78,8 +78,8 @@
  acpi:APC*:
   ID_VENDOR_FROM_DATABASE=American Power Conversion
  
-@@ -872,7 +886,7 @@
-  ID_VENDOR_FROM_DATABASE=Alps Electric Inc
+@@ -887,7 +901,7 @@
+  ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
  
  acpi:AUO*:
 - ID_VENDOR_FROM_DATABASE=DO NOT USE - AUO
@@ -87,7 +87,7 @@
  
  acpi:AUR*:
   ID_VENDOR_FROM_DATABASE=Aureal Semiconductor
-@@ -952,6 +966,9 @@
+@@ -967,6 +981,9 @@
  acpi:AXE*:
   ID_VENDOR_FROM_DATABASE=Axell Corporation
  
@@ -97,7 +97,7 @@
  acpi:AXI*:
   ID_VENDOR_FROM_DATABASE=American Magnetics
  
-@@ -1102,6 +1119,9 @@
+@@ -1117,6 +1134,9 @@
  acpi:BML*:
   ID_VENDOR_FROM_DATABASE=BIOMED Lab
  
  acpi:BMS*:
   ID_VENDOR_FROM_DATABASE=BIOMEDISYS
  
-@@ -1114,6 +1134,9 @@
+@@ -1129,6 +1149,9 @@
  acpi:BNO*:
   ID_VENDOR_FROM_DATABASE=Bang & Olufsen
  
  acpi:BNS*:
   ID_VENDOR_FROM_DATABASE=Boulder Nonlinear Systems
  
-@@ -1357,6 +1380,9 @@
+@@ -1372,6 +1395,9 @@
  acpi:CHA*:
   ID_VENDOR_FROM_DATABASE=Chase Research PLC
  
  acpi:CHD*:
   ID_VENDOR_FROM_DATABASE=ChangHong Electric Co.,Ltd
  
-@@ -1513,6 +1539,9 @@
+@@ -1534,6 +1560,9 @@
  acpi:COD*:
   ID_VENDOR_FROM_DATABASE=CODAN Pty. Ltd.
  
  acpi:COI*:
   ID_VENDOR_FROM_DATABASE=Codec Inc.
  
-@@ -1919,7 +1948,7 @@
+@@ -1943,7 +1972,7 @@
   ID_VENDOR_FROM_DATABASE=Dragon Information Technology
  
  acpi:DJE*:
  
  acpi:DJP*:
   ID_VENDOR_FROM_DATABASE=Maygay Machines, Ltd
-@@ -2251,6 +2280,9 @@
+@@ -2275,6 +2304,9 @@
  acpi:EIN*:
   ID_VENDOR_FROM_DATABASE=Elegant Invention
  
  acpi:EKA*:
   ID_VENDOR_FROM_DATABASE=MagTek Inc.
  
-@@ -2512,6 +2544,9 @@
+@@ -2536,6 +2568,9 @@
  acpi:FCG*:
   ID_VENDOR_FROM_DATABASE=First International Computer Ltd
  
  acpi:FCS*:
   ID_VENDOR_FROM_DATABASE=Focus Enhancements, Inc.
  
-@@ -2885,7 +2920,7 @@
+@@ -2909,7 +2944,7 @@
   ID_VENDOR_FROM_DATABASE=General Standards Corporation
  
  acpi:GSM*:
  
  acpi:GSN*:
   ID_VENDOR_FROM_DATABASE=Grandstream Networks, Inc.
-@@ -2986,6 +3021,9 @@
+@@ -3010,6 +3045,9 @@
  acpi:HEC*:
   ID_VENDOR_FROM_DATABASE=Hisense Electric Co., Ltd.
  
  acpi:HEL*:
   ID_VENDOR_FROM_DATABASE=Hitachi Micro Systems Europe Ltd
  
-@@ -3115,6 +3153,9 @@
+@@ -3139,6 +3177,9 @@
  acpi:HSD*:
   ID_VENDOR_FROM_DATABASE=HannStar Display Corp
  
  acpi:HSM*:
   ID_VENDOR_FROM_DATABASE=AT&T Microelectronics
  
-@@ -3238,6 +3279,9 @@
+@@ -3262,6 +3303,9 @@
  acpi:ICI*:
   ID_VENDOR_FROM_DATABASE=Infotek Communication Inc
  
  acpi:ICM*:
   ID_VENDOR_FROM_DATABASE=Intracom SA
  
-@@ -3334,6 +3378,9 @@
+@@ -3358,6 +3402,9 @@
  acpi:IKE*:
   ID_VENDOR_FROM_DATABASE=Ikegami Tsushinki Co. Ltd.
  
  acpi:IKS*:
   ID_VENDOR_FROM_DATABASE=Ikos Systems Inc
  
-@@ -3379,6 +3426,9 @@
+@@ -3403,6 +3450,9 @@
  acpi:IMT*:
   ID_VENDOR_FROM_DATABASE=Inmax Technology Corporation
  
  acpi:INA*:
   ID_VENDOR_FROM_DATABASE=Inventec Corporation
  
-@@ -3886,6 +3936,9 @@
+@@ -3913,6 +3963,9 @@
  acpi:LAN*:
   ID_VENDOR_FROM_DATABASE=Sodeman Lancom Inc
  
  acpi:LAS*:
   ID_VENDOR_FROM_DATABASE=LASAT Comm. A/S
  
-@@ -3931,6 +3984,9 @@
+@@ -3958,6 +4011,9 @@
  acpi:LED*:
   ID_VENDOR_FROM_DATABASE=Long Engineering Design Inc
  
  acpi:LEG*:
   ID_VENDOR_FROM_DATABASE=Legerity, Inc
  
-@@ -3946,6 +4002,9 @@
+@@ -3973,6 +4029,9 @@
  acpi:LGC*:
   ID_VENDOR_FROM_DATABASE=Logic Ltd
  
  acpi:LGI*:
   ID_VENDOR_FROM_DATABASE=Logitech Inc
  
-@@ -4000,6 +4059,9 @@
+@@ -4027,6 +4086,9 @@
  acpi:LND*:
   ID_VENDOR_FROM_DATABASE=Land Computer Company Ltd
  
  acpi:LNK*:
   ID_VENDOR_FROM_DATABASE=Link Tech Inc
  
-@@ -4034,7 +4096,7 @@
+@@ -4061,7 +4123,7 @@
   ID_VENDOR_FROM_DATABASE=Design Technology
  
  acpi:LPL*:
  
  acpi:LSC*:
   ID_VENDOR_FROM_DATABASE=LifeSize Communications
-@@ -4210,6 +4272,9 @@
+@@ -4237,6 +4299,9 @@
  acpi:MCX*:
   ID_VENDOR_FROM_DATABASE=Millson Custom Solutions Inc.
  
  acpi:MDA*:
   ID_VENDOR_FROM_DATABASE=Media4 Inc
  
-@@ -4450,6 +4515,9 @@
+@@ -4477,6 +4542,9 @@
  acpi:MOM*:
   ID_VENDOR_FROM_DATABASE=Momentum Data Systems
  
  acpi:MOS*:
   ID_VENDOR_FROM_DATABASE=Moses Corporation
  
-@@ -4678,6 +4746,9 @@
+@@ -4705,6 +4773,9 @@
  acpi:NAL*:
   ID_VENDOR_FROM_DATABASE=Network Alchemy
  
  acpi:NAT*:
   ID_VENDOR_FROM_DATABASE=NaturalPoint Inc.
  
-@@ -5185,6 +5256,9 @@
+@@ -5215,6 +5286,9 @@
  acpi:PCX*:
   ID_VENDOR_FROM_DATABASE=PC Xperten
  
  acpi:PDM*:
   ID_VENDOR_FROM_DATABASE=Psion Dacom Plc.
  
-@@ -5248,9 +5322,6 @@
+@@ -5278,9 +5352,6 @@
  acpi:PHE*:
   ID_VENDOR_FROM_DATABASE=Philips Medical Systems Boeblingen GmbH
  
  acpi:PHL*:
   ID_VENDOR_FROM_DATABASE=Philips Consumer Electronics Company
  
-@@ -5338,9 +5409,6 @@
+@@ -5368,9 +5439,6 @@
  acpi:PNL*:
   ID_VENDOR_FROM_DATABASE=Panelview, Inc.
  
  acpi:PNR*:
   ID_VENDOR_FROM_DATABASE=Planar Systems, Inc.
  
-@@ -5476,15 +5544,9 @@
+@@ -5506,15 +5574,9 @@
  acpi:PTS*:
   ID_VENDOR_FROM_DATABASE=Plain Tree Systems Inc
  
  acpi:PVG*:
   ID_VENDOR_FROM_DATABASE=Proview Global Co., Ltd
  
-@@ -5800,9 +5862,6 @@
+@@ -5830,9 +5892,6 @@
  acpi:RTI*:
   ID_VENDOR_FROM_DATABASE=Rancho Tech Inc
  
  acpi:RTL*:
   ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Company Ltd
  
-@@ -5968,9 +6027,6 @@
+@@ -5998,9 +6057,6 @@
  acpi:SEE*:
   ID_VENDOR_FROM_DATABASE=SeeColor Corporation
  
  acpi:SEI*:
   ID_VENDOR_FROM_DATABASE=Seitz & Associates Inc
  
-@@ -6430,6 +6486,9 @@
+@@ -6460,6 +6516,9 @@
  acpi:SVD*:
   ID_VENDOR_FROM_DATABASE=SVD Computer
  
  acpi:SVI*:
   ID_VENDOR_FROM_DATABASE=Sun Microsystems
  
-@@ -6514,6 +6573,9 @@
+@@ -6544,6 +6603,9 @@
  acpi:SZM*:
   ID_VENDOR_FROM_DATABASE=Shenzhen MTC Co., Ltd
  
  acpi:TAA*:
   ID_VENDOR_FROM_DATABASE=Tandberg
  
-@@ -6604,6 +6666,9 @@
+@@ -6634,6 +6696,9 @@
  acpi:TDG*:
   ID_VENDOR_FROM_DATABASE=Six15 Technologies
  
  acpi:TDM*:
   ID_VENDOR_FROM_DATABASE=Tandem Computer Europe Inc
  
-@@ -6646,6 +6711,9 @@
+@@ -6676,6 +6741,9 @@
  acpi:TEV*:
   ID_VENDOR_FROM_DATABASE=Televés, S.A.
  
  acpi:TEZ*:
   ID_VENDOR_FROM_DATABASE=Tech Source Inc.
  
-@@ -6763,9 +6831,6 @@
+@@ -6796,9 +6864,6 @@
  acpi:TNC*:
   ID_VENDOR_FROM_DATABASE=TNC Industrial Company Ltd
  
  acpi:TNM*:
   ID_VENDOR_FROM_DATABASE=TECNIMAGEN SA
  
-@@ -7072,14 +7137,14 @@
+@@ -7105,14 +7170,14 @@
  acpi:UNC*:
   ID_VENDOR_FROM_DATABASE=Unisys Corporation
  
  
  acpi:UNI*:
   ID_VENDOR_FROM_DATABASE=Uniform Industry Corp.
-@@ -7114,6 +7179,9 @@
+@@ -7147,6 +7212,9 @@
  acpi:USA*:
   ID_VENDOR_FROM_DATABASE=Utimaco Safeware AG
  
  acpi:USD*:
   ID_VENDOR_FROM_DATABASE=U.S. Digital Corporation
  
-@@ -7360,9 +7428,6 @@
+@@ -7393,9 +7461,6 @@
  acpi:WAL*:
   ID_VENDOR_FROM_DATABASE=Wave Access
  
  acpi:WAV*:
   ID_VENDOR_FROM_DATABASE=Wavephore
  
-@@ -7487,7 +7552,7 @@
+@@ -7520,7 +7585,7 @@
   ID_VENDOR_FROM_DATABASE=WyreStorm Technologies LLC
  
  acpi:WYS*:
  
  acpi:WYT*:
   ID_VENDOR_FROM_DATABASE=Wooyoung Image & Information Co.,Ltd.
-@@ -7501,9 +7566,6 @@
+@@ -7534,9 +7599,6 @@
  acpi:XDM*:
   ID_VENDOR_FROM_DATABASE=XDM Ltd.
  
  acpi:XES*:
   ID_VENDOR_FROM_DATABASE=Extreme Engineering Solutions, Inc.
  
-@@ -7534,9 +7596,6 @@
+@@ -7567,9 +7629,6 @@
  acpi:XNT*:
   ID_VENDOR_FROM_DATABASE=XN Technologies, Inc.
  
  acpi:XQU*:
   ID_VENDOR_FROM_DATABASE=SHANGHAI SVA-DAV ELECTRONICS CO., LTD
  
-@@ -7603,6 +7662,9 @@
+@@ -7636,6 +7695,9 @@
  acpi:ZBX*:
   ID_VENDOR_FROM_DATABASE=Zebax Technologies
  
index 1c8715f89b32a77c385eda9e74ed89ecf30ba020..269f6959f6607688cb30cc6449b4c6f3eda9d37b 100644 (file)
@@ -1466,6 +1466,9 @@ pci:v00001000d00000072sv00001000sd00003080*
 pci:v00001000d00000072sv00001000sd000030B0*
  ID_MODEL_FROM_DATABASE=SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA])
 
+pci:v00001000d00000072sv00001014sd000003CA*
+ ID_MODEL_FROM_DATABASE=SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (IBM 6Gb SAS HBA [9212-4i4e])
+
 pci:v00001000d00000072sv00001028sd00001F1C*
  ID_MODEL_FROM_DATABASE=SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (6Gbps SAS HBA Adapter)
 
@@ -2450,6 +2453,18 @@ pci:v00001000d000010E1sv00001D49sd0000060F*
 pci:v00001000d000010E2*
  ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx
 
+pci:v00001000d000010E2sv00001000sd00004000*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9560-16i)
+
+pci:v00001000d000010E2sv00001000sd00004010*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9560-8i)
+
+pci:v00001000d000010E2sv00001000sd00004020*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9580-8i8e)
+
+pci:v00001000d000010E2sv00001000sd000040B0*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9562-16i)
+
 pci:v00001000d000010E2sv00001028sd00001AE0*
  ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (PERC H755 Adapter)
 
@@ -2705,6 +2720,9 @@ pci:v00001002d000015D8*
 pci:v00001002d000015D8sv0000103Csd00008615*
  ID_MODEL_FROM_DATABASE=Picasso (Pavilion Laptop 15-cw1xxx)
 
+pci:v00001002d000015D8sv000017AAsd00003181*
+ ID_MODEL_FROM_DATABASE=Picasso (ThinkCentre M75n IoT)
+
 pci:v00001002d000015D8sv000017AAsd00005124*
  ID_MODEL_FROM_DATABASE=Picasso (ThinkPad E595)
 
@@ -5535,10 +5553,10 @@ pci:v00001002d00005F57*
  ID_MODEL_FROM_DATABASE=R423 [Radeon X800 XT]
 
 pci:v00001002d00006600*
- ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M]
+ ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M / R7 M370]
 
 pci:v00001002d00006600sv0000103Csd00001952*
- ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M] (ProBook 455 G1)
+ ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M / R7 M370] (ProBook 455 G1)
 
 pci:v00001002d00006601*
  ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8730M]
@@ -5589,41 +5607,62 @@ pci:v00001002d00006609*
  ID_MODEL_FROM_DATABASE=Oland GL [FirePro W2100 / Barco MXRT 2600]
 
 pci:v00001002d00006610*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350]
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM]
 
 pci:v00001002d00006610sv00001019sd00000030*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
+
+pci:v00001002d00006610sv00001028sd00000081*
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 350X OEM)
+
+pci:v00001002d00006610sv00001028sd00000083*
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R5 340X OEM)
 
 pci:v00001002d00006610sv00001028sd00002120*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 250)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 250)
 
 pci:v00001002d00006610sv00001028sd00002322*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 250)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 250)
 
 pci:v00001002d00006610sv00001462sd00002910*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
 
 pci:v00001002d00006610sv00001462sd00002911*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
 
 pci:v00001002d00006610sv0000148Csd00007350*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 350)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 350)
 
 pci:v00001002d00006610sv00001642sd00003C81*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
 
 pci:v00001002d00006610sv00001642sd00003C91*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
 
 pci:v00001002d00006610sv00001642sd00003F09*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 350)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 350)
 
 pci:v00001002d00006611*
  ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM]
 
+pci:v00001002d00006611sv00001028sd00001001*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon R5 430 OEM (1024 MByte))
+
+pci:v00001002d00006611sv00001028sd00001002*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon R5 430 OEM (2048 MByte))
+
+pci:v00001002d00006611sv00001028sd00001711*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (R5 430 OEM (2048 MByte))
+
 pci:v00001002d00006611sv00001028sd0000210B*
  ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon R5 240 OEM)
 
+pci:v00001002d00006611sv00001028sd00002121*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon HD 8570 OEM)
+
+pci:v00001002d00006611sv000010CFsd00001889*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon HD 8570 OEM)
+
 pci:v00001002d00006611sv00001642sd00001869*
  ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon 520 OEM)
 
@@ -6420,7 +6459,7 @@ pci:v00001002d00006749*
  ID_MODEL_FROM_DATABASE=Turks GL [FirePro V4900]
 
 pci:v00001002d00006749sv000015C3sd00002B06*
- ID_MODEL_FROM_DATABASE=Turks GL [FirePro V4900] (MED-X4900)
+ ID_MODEL_FROM_DATABASE=Turks GL [FirePro V4900] (MED-X4900 (EIZO))
 
 pci:v00001002d0000674A*
  ID_MODEL_FROM_DATABASE=Turks GL [FirePro V3900]
@@ -6507,61 +6546,79 @@ pci:v00001002d00006758sv00001787sd00002309*
  ID_MODEL_FROM_DATABASE=Turks XT [Radeon HD 6670/7670] (Radeon HD 6670)
 
 pci:v00001002d00006759*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550]
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230]
 
 pci:v00001002d00006759sv0000103Csd00003130*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001043sd00000403*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001462sd00002500*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001462sd00002509*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
 
 pci:v00001002d00006759sv0000148Csd00007570*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
 
 pci:v00001002d00006759sv00001642sd00003A67*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001682sd00003280*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
 
 pci:v00001002d00006759sv00001682sd00003530*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 8550)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 8550)
+
+pci:v00001002d00006759sv00001682sd00005230*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon R5 230 series)
+
+pci:v00001002d00006759sv00001682sd00006450*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6450 series)
 
 pci:v00001002d00006759sv0000174Bsd00007570*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
+
+pci:v00001002d00006759sv0000174Bsd00008550*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD8550 OEM)
+
+pci:v00001002d00006759sv0000174Bsd00008570*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD8550 OEM)
 
 pci:v00001002d00006759sv0000174Bsd0000E142*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv0000174Bsd0000E181*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
+
+pci:v00001002d00006759sv00001787sd0000A230*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon R5 230 series)
+
+pci:v00001002d00006759sv00001787sd0000A450*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6450 series)
 
 pci:v00001002d00006759sv00001B0Asd0000908F*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001B0Asd00009090*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001B0Asd00009091*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001B0Asd00009092*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001B0Asd0000909E*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
 
 pci:v00001002d00006759sv00001B0Asd000090B5*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
 
 pci:v00001002d00006759sv00001B0Asd000090B6*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
 
 pci:v00001002d0000675B*
  ID_MODEL_FROM_DATABASE=Turks [Radeon HD 7600 Series]
@@ -10628,6 +10685,9 @@ pci:v00001002d00007310*
 pci:v00001002d00007312*
  ID_MODEL_FROM_DATABASE=Navi 10 [Radeon Pro W5700]
 
+pci:v00001002d00007314*
+ ID_MODEL_FROM_DATABASE=Navi 10 USB
+
 pci:v00001002d0000731F*
  ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
 
@@ -10653,7 +10713,10 @@ pci:v00001002d0000734F*
  ID_MODEL_FROM_DATABASE=Navi 14 [Radeon Pro W5300M]
 
 pci:v00001002d00007360*
- ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro 5600M]
+ ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro 5600M / V520]
+
+pci:v00001002d00007362*
+ ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro V520]
 
 pci:v00001002d00007388*
  ID_MODEL_FROM_DATABASE=Arcturus GL-XL
@@ -10664,6 +10727,12 @@ pci:v00001002d0000738C*
 pci:v00001002d0000738E*
  ID_MODEL_FROM_DATABASE=Arcturus GL-XL
 
+pci:v00001002d000073A4*
+ ID_MODEL_FROM_DATABASE=Navi 21 USB
+
+pci:v00001002d000073AF*
+ ID_MODEL_FROM_DATABASE=Navi 21 [Radeon RX 6900 XT]
+
 pci:v00001002d000073BF*
  ID_MODEL_FROM_DATABASE=Navi 21 [Radeon RX 6800/6800 XT / 6900 XT]
 
@@ -10673,15 +10742,24 @@ pci:v00001002d000073BFsv00001EAEsd00006701*
 pci:v00001002d000073C3*
  ID_MODEL_FROM_DATABASE=Navi 22
 
+pci:v00001002d000073C4*
+ ID_MODEL_FROM_DATABASE=Navi 22 USB
+
 pci:v00001002d000073DF*
- ID_MODEL_FROM_DATABASE=Navi 22
+ ID_MODEL_FROM_DATABASE=Navi 22 [Radeon RX 6700/6700 XT / 6800M]
 
 pci:v00001002d000073E0*
  ID_MODEL_FROM_DATABASE=Navi 23
 
-pci:v00001002d000073FF*
+pci:v00001002d000073E1*
  ID_MODEL_FROM_DATABASE=Navi 23
 
+pci:v00001002d000073E4*
+ ID_MODEL_FROM_DATABASE=Navi 23 USB
+
+pci:v00001002d000073FF*
+ ID_MODEL_FROM_DATABASE=Navi 23 [Radeon RX 6600/6600 XT]
+
 pci:v00001002d00007833*
  ID_MODEL_FROM_DATABASE=RS350 Host Bridge
 
@@ -12309,13 +12387,13 @@ pci:v00001011d0000000D*
  ID_MODEL_FROM_DATABASE=PBXGB [TGA2]
 
 pci:v00001011d0000000F*
- ID_MODEL_FROM_DATABASE=DEFPA FDDI PCI-to-PDQ Interface Chip [PFI]
+ ID_MODEL_FROM_DATABASE=PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA)
 
 pci:v00001011d0000000Fsv00001011sd0000DEF1*
- ID_MODEL_FROM_DATABASE=DEFPA FDDI PCI-to-PDQ Interface Chip [PFI] (FDDI controller (DEFPA))
+ ID_MODEL_FROM_DATABASE=PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) (FDDIcontroller/PCI (DEFPA))
 
 pci:v00001011d0000000Fsv0000103Csd0000DEF1*
- ID_MODEL_FROM_DATABASE=DEFPA FDDI PCI-to-PDQ Interface Chip [PFI] (FDDI controller (3X-DEFPA))
+ ID_MODEL_FROM_DATABASE=PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) (FDDIcontroller/PCI (3X-DEFPA))
 
 pci:v00001011d00000014*
  ID_MODEL_FROM_DATABASE=DECchip 21041 [Tulip Pass 3]
@@ -12324,7 +12402,7 @@ pci:v00001011d00000014sv00001186sd00000100*
  ID_MODEL_FROM_DATABASE=DECchip 21041 [Tulip Pass 3] (DE-530+)
 
 pci:v00001011d00000016*
- ID_MODEL_FROM_DATABASE=DGLPB [OPPO]
+ ID_MODEL_FROM_DATABASE=ATMworks 350 Adapter [OPPO] (DGLPB)
 
 pci:v00001011d00000017*
  ID_MODEL_FROM_DATABASE=PV-PCI Graphics Controller (ZLXp-L)
@@ -14559,13 +14637,13 @@ pci:v00001022d00002000sv00004C53sd00001060*
  ID_MODEL_FROM_DATABASE=79c970 [PCnet32 LANCE] (PC7 mainboard)
 
 pci:v00001022d00002001*
- ID_MODEL_FROM_DATABASE=79c978 [HomePNA]
+ ID_MODEL_FROM_DATABASE=Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY]
 
 pci:v00001022d00002001sv00001092sd00000A78*
- ID_MODEL_FROM_DATABASE=79c978 [HomePNA] (Multimedia Home Network Adapter)
+ ID_MODEL_FROM_DATABASE=Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY] (Multimedia Home Network Adapter)
 
 pci:v00001022d00002001sv00001668sd00000299*
- ID_MODEL_FROM_DATABASE=79c978 [HomePNA] (ActionLink Home Network Adapter)
+ ID_MODEL_FROM_DATABASE=Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY] (ActionLink Home Network Adapter)
 
 pci:v00001022d00002003*
  ID_MODEL_FROM_DATABASE=Am 1771 MBW [Alchemy]
@@ -14615,6 +14693,12 @@ pci:v00001022d00002097*
 pci:v00001022d0000209A*
  ID_MODEL_FROM_DATABASE=CS5536 [Geode companion] IDE
 
+pci:v00001022d00002625*
+ ID_MODEL_FROM_DATABASE=Am79C973 [Lance/PCI PCNet/32]
+
+pci:v00001022d00002627*
+ ID_MODEL_FROM_DATABASE=Am79C975 [Lance/PCI PCNet/32]
+
 pci:v00001022d00003000*
  ID_MODEL_FROM_DATABASE=ELanSC520 Microcontroller
 
@@ -20414,6 +20498,9 @@ pci:v0000106Bd00000004*
 pci:v0000106Bd00000007*
  ID_MODEL_FROM_DATABASE=O'Hare I/O
 
+pci:v0000106Bd0000000B*
+ ID_MODEL_FROM_DATABASE=Apple Camera
+
 pci:v0000106Bd0000000C*
  ID_MODEL_FROM_DATABASE=DOS on Mac
 
@@ -29796,7 +29883,7 @@ pci:v000010DEd00000332*
  ID_MODEL_FROM_DATABASE=NV35 [GeForce FX 5900XT]
 
 pci:v000010DEd00000333*
- ID_MODEL_FROM_DATABASE=NV38 [GeForce FX 5950 Ultra]
+ ID_MODEL_FROM_DATABASE=NV38 [GeForce FX 5950 Ultra / PCX 5950]
 
 pci:v000010DEd00000334*
  ID_MODEL_FROM_DATABASE=NV35 [GeForce FX 5900ZT]
@@ -36002,6 +36089,9 @@ pci:v000010DEd00001F09*
 pci:v000010DEd00001F0A*
  ID_MODEL_FROM_DATABASE=TU106 [GeForce GTX 1650]
 
+pci:v000010DEd00001F0B*
+ ID_MODEL_FROM_DATABASE=TU106 [CMP 40HX]
+
 pci:v000010DEd00001F10*
  ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2070 Mobile]
 
@@ -36134,6 +36224,9 @@ pci:v000010DEd00002187*
 pci:v000010DEd00002188*
  ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1650]
 
+pci:v000010DEd00002189*
+ ID_MODEL_FROM_DATABASE=TU116 [CMP 30HX]
+
 pci:v000010DEd00002191*
  ID_MODEL_FROM_DATABASE=TU116M [GeForce GTX 1660 Ti Mobile]
 
@@ -36155,11 +36248,14 @@ pci:v000010DEd000021C4*
 pci:v000010DEd000021D1*
  ID_MODEL_FROM_DATABASE=TU116BM [GeForce GTX 1660 Ti Mobile]
 
+pci:v000010DEd00002200*
+ ID_MODEL_FROM_DATABASE=GA102
+
 pci:v000010DEd00002204*
  ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3090]
 
 pci:v000010DEd00002205*
- ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080 Ti]
+ ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080 20GB]
 
 pci:v000010DEd00002206*
  ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080]
@@ -36173,6 +36269,9 @@ pci:v000010DEd00002206sv000010DEsd0000146D*
 pci:v000010DEd00002206sv00001462sd00003892*
  ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080] (RTX 3080 10GB GAMING X TRIO)
 
+pci:v000010DEd00002208*
+ ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080 Ti]
+
 pci:v000010DEd0000222B*
  ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3090 Engineering Sample]
 
@@ -36182,18 +36281,27 @@ pci:v000010DEd0000222F*
 pci:v000010DEd00002230*
  ID_MODEL_FROM_DATABASE=GA102GL [RTX A6000]
 
+pci:v000010DEd00002231*
+ ID_MODEL_FROM_DATABASE=GA102GL
+
 pci:v000010DEd00002235*
  ID_MODEL_FROM_DATABASE=GA102GL [RTX A40]
 
 pci:v000010DEd00002236*
  ID_MODEL_FROM_DATABASE=GA102GL
 
+pci:v000010DEd00002237*
+ ID_MODEL_FROM_DATABASE=GA102GL
+
 pci:v000010DEd0000223F*
  ID_MODEL_FROM_DATABASE=GA102GL
 
 pci:v000010DEd0000228B*
  ID_MODEL_FROM_DATABASE=GA104 High Definition Audio Controller
 
+pci:v000010DEd00002302*
+ ID_MODEL_FROM_DATABASE=GA103
+
 pci:v000010DEd00002321*
  ID_MODEL_FROM_DATABASE=GA103
 
@@ -36266,8 +36374,11 @@ pci:v000010DEd00002560*
 pci:v000010DEd00002583*
  ID_MODEL_FROM_DATABASE=GA107 [GeForce RTX 3050]
 
+pci:v000010DEd000025A0*
+ ID_MODEL_FROM_DATABASE=GA107M [GeForce RTX 3050 Ti Mobile]
+
 pci:v000010DEd000025A2*
- ID_MODEL_FROM_DATABASE=GA107
+ ID_MODEL_FROM_DATABASE=GA107M [GeForce RTX 3050 Mobile]
 
 pci:v000010DEd000025A4*
  ID_MODEL_FROM_DATABASE=GA107
@@ -37232,6 +37343,9 @@ pci:v000010ECd00008168sv00001028sd000004B2*
 pci:v000010ECd00008168sv00001028sd000004DA*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Vostro 3750)
 
+pci:v000010ECd00008168sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Alienware X51 R2)
+
 pci:v000010ECd00008168sv00001028sd000006F2*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Latitude 3470)
 
@@ -38430,7 +38544,7 @@ pci:v00001106d00000351*
  ID_MODEL_FROM_DATABASE=K8T890CF Host Bridge
 
 pci:v00001106d00000353*
- ID_MODEL_FROM_DATABASE=VX800 Host Bridge
+ ID_MODEL_FROM_DATABASE=VX800/820-Series Chipset Host-Bridge Controller
 
 pci:v00001106d00000364*
  ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 Host Bridge
@@ -38445,7 +38559,7 @@ pci:v00001106d00000409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 Host Bridge: Host Control
 
 pci:v00001106d00000410*
- ID_MODEL_FROM_DATABASE=VX900 Host Bridge: Host Control
+ ID_MODEL_FROM_DATABASE=VX900 Series Host Bridge: Host Control
 
 pci:v00001106d00000415*
  ID_MODEL_FROM_DATABASE=VT6415 PATA IDE Host Controller
@@ -38520,10 +38634,10 @@ pci:v00001106d00000576*
  ID_MODEL_FROM_DATABASE=VT82C576 3V [Apollo Master]
 
 pci:v00001106d00000581*
- ID_MODEL_FROM_DATABASE=CX700/VX700 RAID Controller
+ ID_MODEL_FROM_DATABASE=CX700/VX700/VX800/820-Series Serial ATA RAID-Controller
 
 pci:v00001106d00000581sv00001106sd00000581*
- ID_MODEL_FROM_DATABASE=CX700/VX700 RAID Controller (Wrong IDE ID)
+ ID_MODEL_FROM_DATABASE=CX700/VX700/VX800/820-Series Serial ATA RAID-Controller (Wrong IDE ID)
 
 pci:v00001106d00000585*
  ID_MODEL_FROM_DATABASE=VT82C585VP [Apollo VP1/VPX]
@@ -38691,7 +38805,7 @@ pci:v00001106d00001314*
  ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
 
 pci:v00001106d00001324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Error Reporting
 
 pci:v00001106d00001327*
  ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
@@ -38715,7 +38829,7 @@ pci:v00001106d00001409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 Error Reporting
 
 pci:v00001106d00001410*
- ID_MODEL_FROM_DATABASE=VX900 Error Reporting
+ ID_MODEL_FROM_DATABASE=VX900 Series Error Reporting
 
 pci:v00001106d00001571*
  ID_MODEL_FROM_DATABASE=VT82C576M/VT82C586
@@ -38766,7 +38880,7 @@ pci:v00001106d00002314*
  ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
 
 pci:v00001106d00002324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Host Interface Control
 
 pci:v00001106d00002327*
  ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
@@ -38790,7 +38904,7 @@ pci:v00001106d00002409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 Host Bus Control
 
 pci:v00001106d00002410*
- ID_MODEL_FROM_DATABASE=VX900 CPU Bus Controller
+ ID_MODEL_FROM_DATABASE=VX900 Series CPU Bus Controller
 
 pci:v00001106d0000287A*
  ID_MODEL_FROM_DATABASE=VT8251 PCI to PCI Bridge
@@ -38811,64 +38925,67 @@ pci:v00001106d00003022*
  ID_MODEL_FROM_DATABASE=CLE266
 
 pci:v00001106d00003038*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller
 
 pci:v00001106d00003038sv00000925sd00001234*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (onboard UHCI USB 1.1 Controller)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (onboard UHCI USB 1.1 Controller)
 
 pci:v00001106d00003038sv00001019sd00000985*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (P6VXA Motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (P6VXA Motherboard)
 
 pci:v00001106d00003038sv00001019sd00000A81*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (L7VTA v1.0 Motherboard (KT400-8235))
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (L7VTA v1.0 Motherboard (KT400-8235))
 
 pci:v00001106d00003038sv00001043sd00008080*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (A7V333 motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (A7V333 motherboard)
 
 pci:v00001106d00003038sv00001043sd0000808C*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (VT6202 USB2.0 4 port controller)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (VT62xx USB1.1 4 port controller)
 
 pci:v00001106d00003038sv00001043sd000080A1*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (A7V8X-X motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (A7V8X-X motherboard)
 
 pci:v00001106d00003038sv00001043sd000080ED*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (A7V600/K8V-X/A8V Deluxe motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (A7V600/K8V-X/A8V Deluxe motherboard)
 
 pci:v00001106d00003038sv00001179sd00000001*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (Magnia Z310)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (Magnia Z310)
+
+pci:v00001106d00003038sv00001234sd00000925*
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (MVP3 USB Controller)
 
 pci:v00001106d00003038sv00001458sd00005004*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (GA-7VAX Mainboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (GA-7VAX Mainboard)
 
 pci:v00001106d00003038sv00001462sd00005901*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (KT6 Delta-FIS2R (MS-6590))
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (KT6 Delta-FIS2R (MS-6590))
 
 pci:v00001106d00003038sv00001462sd00007020*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K8T NEO 2 motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K8T NEO 2 motherboard)
 
 pci:v00001106d00003038sv00001462sd00007094*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K8T Neo2-F V2.0)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K8T Neo2-F V2.0)
 
 pci:v00001106d00003038sv00001462sd00007120*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (KT4AV motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (KT4AV motherboard)
 
 pci:v00001106d00003038sv00001462sd00007181*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K8MM3-V mainboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K8MM3-V mainboard)
 
 pci:v00001106d00003038sv0000147Bsd00001407*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (KV8-MAX3 motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (KV8-MAX3 motherboard)
 
 pci:v00001106d00003038sv0000182Dsd0000201D*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (CN-029 USB2.0 4 port PCI Card)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (CN-029 USB2.0 4 port PCI Card)
 
 pci:v00001106d00003038sv00001849sd00003038*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K7VT series Motherboards)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K7VT series Motherboards)
 
 pci:v00001106d00003038sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (ZBOX nano VD01)
 
 pci:v00001106d00003038sv00001AF4sd00001100*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (QEMU Virtual Machine)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (QEMU Virtual Machine)
 
 pci:v00001106d00003040*
  ID_MODEL_FROM_DATABASE=VT82C586B ACPI
@@ -39177,58 +39294,58 @@ pci:v00001106d00003103*
  ID_MODEL_FROM_DATABASE=VT8615 Host Bridge
 
 pci:v00001106d00003104*
- ID_MODEL_FROM_DATABASE=USB 2.0
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller
 
 pci:v00001106d00003104sv00000925sd00001234*
- ID_MODEL_FROM_DATABASE=USB 2.0 (onboard EHCI USB 2.0 Controller)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (onboard EHCI USB 2.0 Controller)
 
 pci:v00001106d00003104sv00001019sd00000A81*
- ID_MODEL_FROM_DATABASE=USB 2.0 (L7VTA v1.0 Motherboard (KT400-8235))
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (L7VTA v1.0 Motherboard (KT400-8235))
 
 pci:v00001106d00003104sv00001043sd0000808C*
- ID_MODEL_FROM_DATABASE=USB 2.0 (A7V8X motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (A7V8X motherboard)
 
 pci:v00001106d00003104sv00001043sd000080A1*
- ID_MODEL_FROM_DATABASE=USB 2.0 (A7V8X-X motherboard rev 1.01)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (A7V8X-X motherboard rev 1.01)
 
 pci:v00001106d00003104sv00001043sd000080ED*
- ID_MODEL_FROM_DATABASE=USB 2.0 (A7V600/K8V-X/A8V Deluxe motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (A7V600/K8V-X/A8V Deluxe motherboard)
 
 pci:v00001106d00003104sv00001106sd00003104*
- ID_MODEL_FROM_DATABASE=USB 2.0 (Controller)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (USB 2.0 Controller)
 
 pci:v00001106d00003104sv00001297sd0000F641*
- ID_MODEL_FROM_DATABASE=USB 2.0 (FX41 motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (FX41 motherboard)
 
 pci:v00001106d00003104sv00001458sd00005004*
- ID_MODEL_FROM_DATABASE=USB 2.0 (GA-7VAX Mainboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (GA-7VAX Mainboard)
 
 pci:v00001106d00003104sv00001462sd00005901*
- ID_MODEL_FROM_DATABASE=USB 2.0 (KT6 Delta-FIS2R (MS-6590))
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (KT6 Delta-FIS2R (MS-6590))
 
 pci:v00001106d00003104sv00001462sd00007020*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K8T NEO 2 motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K8T NEO 2 motherboard)
 
 pci:v00001106d00003104sv00001462sd00007094*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K8T Neo2-F V2.0)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K8T Neo2-F V2.0)
 
 pci:v00001106d00003104sv00001462sd00007120*
- ID_MODEL_FROM_DATABASE=USB 2.0 (KT4AV motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (KT4AV motherboard)
 
 pci:v00001106d00003104sv00001462sd00007181*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K8MM3-V mainboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K8MM3-V mainboard)
 
 pci:v00001106d00003104sv0000147Bsd00001407*
- ID_MODEL_FROM_DATABASE=USB 2.0 (KV8-MAX3 motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (KV8-MAX3 motherboard)
 
 pci:v00001106d00003104sv0000182Dsd0000201D*
- ID_MODEL_FROM_DATABASE=USB 2.0 (CN-029 USB 2.0 4 port PCI Card)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (CN-029 USB 2.0 4 port PCI Card)
 
 pci:v00001106d00003104sv00001849sd00003104*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K7VT series Motherboards)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K7VT series Motherboards)
 
 pci:v00001106d00003104sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=USB 2.0 (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (ZBOX nano VD01)
 
 pci:v00001106d00003106*
  ID_MODEL_FROM_DATABASE=VT6105/VT6106S [Rhine-III]
@@ -39507,10 +39624,10 @@ pci:v00001106d00003287*
  ID_MODEL_FROM_DATABASE=VT8251 PCI to ISA Bridge
 
 pci:v00001106d00003288*
- ID_MODEL_FROM_DATABASE=VT8237A/VT8251 HDA Controller
+ ID_MODEL_FROM_DATABASE=VX900/VT8xxx High Definition Audio Controller
 
 pci:v00001106d00003288sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VT8237A/VT8251 HDA Controller (ZBOX VD01)
+ ID_MODEL_FROM_DATABASE=VX900/VT8xxx High Definition Audio Controller (ZBOX VD01)
 
 pci:v00001106d00003290*
  ID_MODEL_FROM_DATABASE=K8M890 Host Bridge
@@ -39519,7 +39636,7 @@ pci:v00001106d00003296*
  ID_MODEL_FROM_DATABASE=P4M800 Host Bridge
 
 pci:v00001106d00003324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series DRAM Bus Control
 
 pci:v00001106d00003327*
  ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
@@ -39546,11 +39663,14 @@ pci:v00001106d00003351*
  ID_MODEL_FROM_DATABASE=VT3351 Host Bridge
 
 pci:v00001106d00003353*
- ID_MODEL_FROM_DATABASE=VX800 PCI to PCI Bridge
+ ID_MODEL_FROM_DATABASE=VX800/820 PCI to PCI Bridge
 
 pci:v00001106d00003364*
  ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 Host Bridge
 
+pci:v00001106d00003365*
+ ID_MODEL_FROM_DATABASE=VT630x IEEE 1394 Host Controller [Fire II/M]
+
 pci:v00001106d00003371*
  ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 [Chrome 9 HC]
 
@@ -39576,13 +39696,13 @@ pci:v00001106d00003409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 DRAM Bus Control
 
 pci:v00001106d00003410*
- ID_MODEL_FROM_DATABASE=VX900 DRAM Bus Control
+ ID_MODEL_FROM_DATABASE=VX900 Series DRAM Bus Control
 
 pci:v00001106d00003410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 DRAM Bus Control (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series DRAM Bus Control (ZBOX nano VD01)
 
 pci:v00001106d00003432*
- ID_MODEL_FROM_DATABASE=VL80x xHCI USB 3.0 Controller
+ ID_MODEL_FROM_DATABASE=VL800/801 xHCI USB 3.0 Controller
 
 pci:v00001106d00003456*
  ID_MODEL_FROM_DATABASE=VX11 Standard Host Bridge
@@ -39591,7 +39711,7 @@ pci:v00001106d0000345B*
  ID_MODEL_FROM_DATABASE=VX11 Miscellaneous Bus
 
 pci:v00001106d00003483*
- ID_MODEL_FROM_DATABASE=VL805 USB 3.0 Host Controller
+ ID_MODEL_FROM_DATABASE=VL805/806 xHCI USB 3.0 Controller
 
 pci:v00001106d00003A01*
  ID_MODEL_FROM_DATABASE=VX11 Graphics [Chrome 645/640]
@@ -39636,7 +39756,7 @@ pci:v00001106d00004314*
  ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
 
 pci:v00001106d00004324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Power Management and Testing Control
 
 pci:v00001106d00004327*
  ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
@@ -39660,10 +39780,10 @@ pci:v00001106d00004409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 Power Management Control
 
 pci:v00001106d00004410*
- ID_MODEL_FROM_DATABASE=VX900 Power Management and Chip Testing Control
+ ID_MODEL_FROM_DATABASE=VX900 Series Power Management and Chip Testing Control
 
 pci:v00001106d00004410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 Power Management and Chip Testing Control (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series Power Management and Chip Testing Control (ZBOX nano VD01)
 
 pci:v00001106d00005030*
  ID_MODEL_FROM_DATABASE=VT82C596 ACPI [Apollo PRO]
@@ -39687,7 +39807,7 @@ pci:v00001106d00005308*
  ID_MODEL_FROM_DATABASE=PT894 I/O APIC Interrupt Controller
 
 pci:v00001106d00005324*
- ID_MODEL_FROM_DATABASE=VX800 Serial ATA and EIDE Controller
+ ID_MODEL_FROM_DATABASE=CX700M2/VX700/VX800/820-Series Serial ATA & EIDE-Controller
 
 pci:v00001106d00005327*
  ID_MODEL_FROM_DATABASE=P4M890 I/O APIC Interrupt Controller
@@ -39714,7 +39834,7 @@ pci:v00001106d00005409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 APIC and Central Traffic Control
 
 pci:v00001106d00005410*
- ID_MODEL_FROM_DATABASE=VX900 APIC and Central Traffic Control
+ ID_MODEL_FROM_DATABASE=VX900 Series APIC and Central Traffic Control
 
 pci:v00001106d00006100*
  ID_MODEL_FROM_DATABASE=VT85C100A [Rhine II]
@@ -39738,10 +39858,10 @@ pci:v00001106d00006409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 Scratch Registers
 
 pci:v00001106d00006410*
- ID_MODEL_FROM_DATABASE=VX900 Scratch Registers
+ ID_MODEL_FROM_DATABASE=VX900 Series Scratch Registers
 
 pci:v00001106d00006410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 Scratch Registers (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series Scratch Registers (ZBOX nano VD01)
 
 pci:v00001106d00007122*
  ID_MODEL_FROM_DATABASE=VX900 Graphics [Chrome9 HD]
@@ -39792,7 +39912,7 @@ pci:v00001106d00007314*
  ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
 
 pci:v00001106d00007324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series North-South Module Interface Control
 
 pci:v00001106d00007327*
  ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
@@ -39816,10 +39936,10 @@ pci:v00001106d00007409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 North-South Module Interface Control
 
 pci:v00001106d00007410*
- ID_MODEL_FROM_DATABASE=VX900 North-South Module Interface Control
+ ID_MODEL_FROM_DATABASE=VX900 Series North-South Module Interface Control
 
 pci:v00001106d00007410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 North-South Module Interface Control (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series North-South Module Interface Control (ZBOX nano VD01)
 
 pci:v00001106d00008231*
  ID_MODEL_FROM_DATABASE=VT8231 [PCI-to-ISA Bridge]
@@ -39831,7 +39951,7 @@ pci:v00001106d00008305*
  ID_MODEL_FROM_DATABASE=VT8363/8365 [KT133/KM133 AGP]
 
 pci:v00001106d00008324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 PCI to ISA Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Bus Control and Power Management
 
 pci:v00001106d00008353*
  ID_MODEL_FROM_DATABASE=VX800/VX820 Bus Control and Power Management
@@ -39846,10 +39966,10 @@ pci:v00001106d00008409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 Bus Control and Power Management
 
 pci:v00001106d00008410*
- ID_MODEL_FROM_DATABASE=VX900 Bus Control and Power Management
+ ID_MODEL_FROM_DATABASE=VX900 Series Bus Control and Power Management
 
 pci:v00001106d00008410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 Bus Control and Power Management (ZBOX VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series Bus Control and Power Management (ZBOX VD01)
 
 pci:v00001106d00008500*
  ID_MODEL_FROM_DATABASE=KLE133/PLE133/PLE133T
@@ -39894,7 +40014,7 @@ pci:v00001106d00008D04*
  ID_MODEL_FROM_DATABASE=KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
 
 pci:v00001106d00009001*
- ID_MODEL_FROM_DATABASE=VX900 Serial ATA Controller
+ ID_MODEL_FROM_DATABASE=VX900 Series Serial-ATA Controller
 
 pci:v00001106d00009082*
  ID_MODEL_FROM_DATABASE=Standard AHCI 1.0 SATA Controller
@@ -39906,10 +40026,10 @@ pci:v00001106d00009201*
  ID_MODEL_FROM_DATABASE=USB3.0 Controller
 
 pci:v00001106d00009530*
- ID_MODEL_FROM_DATABASE=Secure Digital Memory Card Controller
+ ID_MODEL_FROM_DATABASE=VX800/820/900 Series Secure Digital Memory Card Controller
 
 pci:v00001106d000095D0*
- ID_MODEL_FROM_DATABASE=SDIO Host Controller
+ ID_MODEL_FROM_DATABASE=VX800/820/900 Series SDIO Host Controller
 
 pci:v00001106d0000A208*
  ID_MODEL_FROM_DATABASE=PT890 PCI to PCI Bridge Controller
@@ -39921,16 +40041,16 @@ pci:v00001106d0000A327*
  ID_MODEL_FROM_DATABASE=P4M890 PCI to PCI Bridge Controller
 
 pci:v00001106d0000A353*
- ID_MODEL_FROM_DATABASE=VX8xx South-North Module Interface Control
+ ID_MODEL_FROM_DATABASE=VX8xx/900 Series South-North Module Interface Control
 
 pci:v00001106d0000A364*
  ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 PCI to PCI Bridge Controller
 
 pci:v00001106d0000A409*
- ID_MODEL_FROM_DATABASE=VX855/VX875 USB Device Controller
+ ID_MODEL_FROM_DATABASE=VX855/VX875/VX900 Series USB Device Controller
 
 pci:v00001106d0000A410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 0
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 0
 
 pci:v00001106d0000B091*
  ID_MODEL_FROM_DATABASE=VT8633 [Apollo Pro266 AGP]
@@ -39966,7 +40086,7 @@ pci:v00001106d0000B188sv0000147Bsd00001407*
  ID_MODEL_FROM_DATABASE=VT8237/8251 PCI bridge [K8M890/K8T800/K8T890 South] (KV8-MAX3 motherboard)
 
 pci:v00001106d0000B198*
- ID_MODEL_FROM_DATABASE=VT8237/VX700 PCI Bridge
+ ID_MODEL_FROM_DATABASE=VT8237/CX700/VX700-Series PCI to PCI Bridge
 
 pci:v00001106d0000B213*
  ID_MODEL_FROM_DATABASE=VPX/VPX2 I/O APIC Interrupt Controller
@@ -39975,7 +40095,7 @@ pci:v00001106d0000B353*
  ID_MODEL_FROM_DATABASE=VX855/VX875/VX900 PCI to PCI Bridge
 
 pci:v00001106d0000B410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 1
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 1
 
 pci:v00001106d0000B999*
  ID_MODEL_FROM_DATABASE=[K8T890 North / VT8237 South] PCI Bridge
@@ -39993,7 +40113,7 @@ pci:v00001106d0000C340*
  ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
 
 pci:v00001106d0000C353*
- ID_MODEL_FROM_DATABASE=VX800/VX820 PCI Express Root Port
+ ID_MODEL_FROM_DATABASE=VX800/820-Series PCI-Express Root (PCI-to-PCI Virtual Bridge)
 
 pci:v00001106d0000C364*
  ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 PCI to PCI Bridge Controller
@@ -40002,7 +40122,7 @@ pci:v00001106d0000C409*
  ID_MODEL_FROM_DATABASE=VX855/VX875 EIDE Controller
 
 pci:v00001106d0000C410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 2
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 2
 
 pci:v00001106d0000D104*
  ID_MODEL_FROM_DATABASE=VT8237R USB UDCI Controller
@@ -40020,7 +40140,7 @@ pci:v00001106d0000D340*
  ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
 
 pci:v00001106d0000D410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 3
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 3
 
 pci:v00001106d0000E208*
  ID_MODEL_FROM_DATABASE=PT890 PCI to PCI Bridge Controller
@@ -40032,10 +40152,10 @@ pci:v00001106d0000E340*
  ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
 
 pci:v00001106d0000E353*
- ID_MODEL_FROM_DATABASE=VX800/VX820 PCI Express Root Port
+ ID_MODEL_FROM_DATABASE=VX800/820-Series PCI-Express Root Port 0
 
 pci:v00001106d0000E410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Physical Layer Electrical Sub-block
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Physical Layer Electrical Sub-block
 
 pci:v00001106d0000F208*
  ID_MODEL_FROM_DATABASE=PT890 PCI to PCI Bridge Controller
@@ -40047,7 +40167,10 @@ pci:v00001106d0000F340*
  ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
 
 pci:v00001106d0000F353*
- ID_MODEL_FROM_DATABASE=VX800/VX820 PCI Express Root Port
+ ID_MODEL_FROM_DATABASE=VX800/820-Series PCI-Express Root Port 1
+
+pci:v00001106d0000F410*
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI UART Port 0-3
 
 pci:v00001107*
  ID_VENDOR_FROM_DATABASE=Stratus Computers
@@ -41928,7 +42051,7 @@ pci:v00001134d0000000D*
  ID_MODEL_FROM_DATABASE=POET PSDMS Device
 
 pci:v00001135*
- ID_VENDOR_FROM_DATABASE=Fuji Xerox Co Ltd
+ ID_VENDOR_FROM_DATABASE=FUJIFILM Business Innovation Corp.
 
 pci:v00001135d00000001*
  ID_MODEL_FROM_DATABASE=Printer controller
@@ -44477,6 +44600,9 @@ pci:v000011AA*
 pci:v000011AB*
  ID_VENDOR_FROM_DATABASE=Marvell Technology Group Ltd.
 
+pci:v000011ABd00000100*
+ ID_MODEL_FROM_DATABASE=88F3700 [Armada 3700 Family] ARM SoC
+
 pci:v000011ABd00000146*
  ID_MODEL_FROM_DATABASE=GT-64010/64010A System Controller
 
@@ -45116,6 +45242,12 @@ pci:v000011ABd00006480sv00001775sd0000C200*
 pci:v000011ABd00006485*
  ID_MODEL_FROM_DATABASE=MV64460/64461/64462 System Controller, Revision B
 
+pci:v000011ABd00006820*
+ ID_MODEL_FROM_DATABASE=88F6820 [Armada 385] ARM SoC
+
+pci:v000011ABd00006828*
+ ID_MODEL_FROM_DATABASE=88F6828 [Armada 388] ARM SoC
+
 pci:v000011ABd00007042*
  ID_MODEL_FROM_DATABASE=88SX7042 PCI-e 4-port SATA-II
 
@@ -45162,7 +45294,7 @@ pci:v000011ADd00000002sv000011ADsd0000FFFF*
  ID_MODEL_FROM_DATABASE=LNE100TX
 
 pci:v000011ADd00000002sv00001385sd0000F004*
- ID_MODEL_FROM_DATABASE=LNE100TX (FA310TX)
+ ID_MODEL_FROM_DATABASE=LNE100TX (FA310/TX LAN 10/100 PCI Ethernet Adapter)
 
 pci:v000011ADd00000002sv00002646sd0000F002*
  ID_MODEL_FROM_DATABASE=LNE100TX (KNE110TX EtheRx Fast Ethernet)
@@ -46103,6 +46235,9 @@ pci:v000011F8d00008531*
 pci:v000011F8d00008546*
  ID_MODEL_FROM_DATABASE=PM8546 B-FEIP PSX 96xG3 PCIe Storage Switch
 
+pci:v000011F8d00008562*
+ ID_MODEL_FROM_DATABASE=PM8562 Switchtec PFX-L 32xG3 Fanout-Lite PCIe Gen3 Switch
+
 pci:v000011F9*
  ID_VENDOR_FROM_DATABASE=I-Cube Inc
 
@@ -52148,6 +52283,9 @@ pci:v00001414d00000001*
 pci:v00001414d00000002*
  ID_MODEL_FROM_DATABASE=MN-130 (ADMtek Centaur-P based)
 
+pci:v00001414d0000008C*
+ ID_MODEL_FROM_DATABASE=Basic Render Driver
+
 pci:v00001414d00005353*
  ID_MODEL_FROM_DATABASE=Hyper-V virtual VGA
 
@@ -54740,6 +54878,54 @@ pci:v0000144Dd0000A824sv00001028sd00002098*
 pci:v0000144Dd0000A824sv00001028sd00002099*
  ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB)
 
+pci:v0000144Dd0000A824sv00001028sd00002118*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002119*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002120*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 3.2T)
+
+pci:v0000144Dd0000A824sv00001028sd00002121*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 3.2TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002122*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002123*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002124*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002125*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 12.8TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002126*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002127*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002128*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002129*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002130*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 7.68TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002131*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 7.68TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002132*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 15.36TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002133*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 15.36TB)
+
 pci:v0000144Dd0000ECEC*
  ID_MODEL_FROM_DATABASE=Exynos 8895 PCIe Root Complex
 
@@ -54773,6 +54959,9 @@ pci:v00001457*
 pci:v00001458*
  ID_VENDOR_FROM_DATABASE=Gigabyte Technology Co., Ltd
 
+pci:v00001458d00003483*
+ ID_MODEL_FROM_DATABASE=USB 3.0 Controller (VIA VL80x-based xHCI Controller)
+
 pci:v00001459*
  ID_VENDOR_FROM_DATABASE=DOOIN Electronics
 
@@ -54821,6 +55010,9 @@ pci:v00001461d0000F436*
 pci:v00001462*
  ID_VENDOR_FROM_DATABASE=Micro-Star International Co., Ltd. [MSI]
 
+pci:v00001462d00003483*
+ ID_MODEL_FROM_DATABASE=MSI USB 3.0 (VIA VL80x-based xHCI USB Controller)
+
 pci:v00001462d0000AAF0*
  ID_MODEL_FROM_DATABASE=Radeon RX 580 Gaming X 8G
 
@@ -56061,34 +56253,34 @@ pci:v000014E4d0000165Esv000010CFsd00001279*
  ID_MODEL_FROM_DATABASE=NetXtreme BCM5705M_2 Gigabit Ethernet (LifeBook E8010D)
 
 pci:v000014E4d0000165F*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe
 
 pci:v000014E4d0000165Fsv00001028sd000004F7*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge R320 server)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge R320 server)
 
 pci:v000014E4d0000165Fsv00001028sd000008FD*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge R6515/R7515 LOM)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge R6515/R7515 LOM)
 
 pci:v000014E4d0000165Fsv00001028sd000008FF*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge Rx5xx LOM Board)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge Rx5xx LOM Board)
 
 pci:v000014E4d0000165Fsv00001028sd00000900*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge C6525 LOM)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge C6525 LOM)
 
 pci:v000014E4d0000165Fsv0000103Csd00001786*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332T Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332T Adapter)
 
 pci:v000014E4d0000165Fsv0000103Csd0000193D*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
 
 pci:v000014E4d0000165Fsv0000103Csd00002133*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
 
 pci:v000014E4d0000165Fsv0000103Csd000022E8*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
 
 pci:v000014E4d0000165Fsv0000103Csd000022EB*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
 
 pci:v000014E4d00001662*
  ID_MODEL_FROM_DATABASE=NetXtreme II BCM57712 10 Gigabit Ethernet
@@ -56762,6 +56954,9 @@ pci:v000014E4d000016D5*
 pci:v000014E4d000016D6*
  ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
 
+pci:v000014E4d000016D6sv000014E4sd00001202*
+ ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (BCM957412M4122C OCP 1x25G Type1 wRoCE)
+
 pci:v000014E4d000016D6sv000014E4sd00004120*
  ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (NetXtreme E-Series Advanced Dual-port 10Gb SFP+ Ethernet Network Daughter Card)
 
@@ -56777,9 +56972,6 @@ pci:v000014E4d000016D6sv0000152Dsd00008B22*
 pci:v000014E4d000016D7*
  ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller
 
-pci:v000014E4d000016D7sv000014E4sd00001202*
- ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (BCM957412M4122C OCP 1x25G Type1 wRoCE)
-
 pci:v000014E4d000016D7sv000014E4sd00001402*
  ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (BCM957414A4142CC 10Gb/25Gb Ethernet PCIe)
 
@@ -56963,6 +57155,9 @@ pci:v000014E4d00001750sv000014E4sd00002100*
 pci:v000014E4d00001750sv000014E4sd00005208*
  ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet (NetXtreme-E Dual-port 100G QSFP56 Ethernet OCP 3.0 Adapter (BCM957508-N2100G))
 
+pci:v000014E4d00001750sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet)
+
 pci:v000014E4d00001751*
  ID_MODEL_FROM_DATABASE=BCM57504 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet
 
@@ -56978,6 +57173,9 @@ pci:v000014E4d00001801*
 pci:v000014E4d00001802*
  ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E Ethernet Partition
 
+pci:v000014E4d00001802sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E Ethernet Partition (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Partition)
+
 pci:v000014E4d00001803*
  ID_MODEL_FROM_DATABASE=BCM57502 NetXtreme-E RDMA Partition
 
@@ -56985,14 +57183,35 @@ pci:v000014E4d00001804*
  ID_MODEL_FROM_DATABASE=BCM57504 NetXtreme-E RDMA Partition
 
 pci:v000014E4d00001805*
- ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E RDMA Partition
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Partition
+
+pci:v000014E4d00001805sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Partition (NetXtreme-E NGM2100D BCM57508 2x100G KR Mezz RDMA Partition)
 
 pci:v000014E4d00001806*
  ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function
 
+pci:v000014E4d00001806sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function)
+
 pci:v000014E4d00001807*
  ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function
 
+pci:v000014E4d00001807sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function)
+
+pci:v000014E4d00001808*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function
+
+pci:v000014E4d00001808sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function)
+
+pci:v000014E4d00001809*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function
+
+pci:v000014E4d00001809sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function)
+
 pci:v000014E4d00002711*
  ID_MODEL_FROM_DATABASE=BCM2711 PCIe Bridge
 
@@ -59246,6 +59465,9 @@ pci:v00001542d00009271*
 pci:v00001542d00009272*
  ID_MODEL_FROM_DATABASE=Pulse Width Modulator Card
 
+pci:v00001542d00009273*
+ ID_MODEL_FROM_DATABASE=RCIM-IV Real-Time Clock & Interrupt Module (PCIe)
+
 pci:v00001542d00009277*
  ID_MODEL_FROM_DATABASE=5 Volt Delta Sigma Converter Card
 
@@ -60110,9 +60332,18 @@ pci:v000015B3d00001015sv000015B3sd00000025*
 pci:v000015B3d00001015sv0000193Dsd0000100A*
  ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (620F-B)
 
+pci:v000015B3d00001015sv0000193Dsd00001023*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH540F-LP-2P)
+
 pci:v000015B3d00001015sv0000193Dsd00001031*
  ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH640i-Mb-2x25G)
 
+pci:v000015B3d00001015sv0000193Dsd00001083*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH640F-3S-2P)
+
+pci:v000015B3d00001015sv0000193Dsd00001084*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH540F-3S-2P)
+
 pci:v000015B3d00001016*
  ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx Virtual Function]
 
@@ -61418,6 +61649,15 @@ pci:v0000168Ad0000C040*
 pci:v0000168Ad0000C051*
  ID_MODEL_FROM_DATABASE=CryptoServer Se-Series Gen2 Hardware Security Module
 
+pci:v0000168Ad0000C070*
+ ID_MODEL_FROM_DATABASE=u.trust Anchor Hardware Security Module cs7.2 Series
+
+pci:v0000168Ad0000C071*
+ ID_MODEL_FROM_DATABASE=u.trust Anchor Hardware Security Module cs7.3 Series
+
+pci:v0000168Ad0000C072*
+ ID_MODEL_FROM_DATABASE=u.trust Anchor Hardware Security Module cs7.3 Series Virtual Function
+
 pci:v0000168C*
  ID_VENDOR_FROM_DATABASE=Qualcomm Atheros
 
@@ -62720,6 +62960,9 @@ pci:v00001737d0000AB09*
 pci:v0000173B*
  ID_VENDOR_FROM_DATABASE=Altima (nee Broadcom)
 
+pci:v0000173Bd00000001*
+ ID_MODEL_FROM_DATABASE=AC1002 PCI Gigabit Ethernet controller
+
 pci:v0000173Bd000003E8*
  ID_MODEL_FROM_DATABASE=AC1000 Gigabit Ethernet
 
@@ -63383,6 +63626,9 @@ pci:v000017A0d0000E763*
 pci:v000017AA*
  ID_VENDOR_FROM_DATABASE=Lenovo
 
+pci:v000017AAd00003181*
+ ID_MODEL_FROM_DATABASE=ThinkCentre M75n IoT
+
 pci:v000017AAd0000402B*
  ID_MODEL_FROM_DATABASE=Intel 82599ES 10Gb 2-port Server Adapter X520-2
 
@@ -67319,6 +67565,9 @@ pci:v00001B21d00001343*
 pci:v00001B21d00002142*
  ID_MODEL_FROM_DATABASE=ASM2142 USB 3.1 Host Controller
 
+pci:v00001B21d00002142sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=ASM2142 USB 3.1 Host Controller (H270 PC MATE)
+
 pci:v00001B21d00003242*
  ID_MODEL_FROM_DATABASE=ASM3242 USB 3.2 Host Controller
 
@@ -67511,6 +67760,9 @@ pci:v00001B47d00000602*
 pci:v00001B4B*
  ID_VENDOR_FROM_DATABASE=Marvell Technology Group Ltd.
 
+pci:v00001B4Bd00000100*
+ ID_MODEL_FROM_DATABASE=88F3700 [Armada 3700 Family] ARM SoC
+
 pci:v00001B4Bd00000640*
  ID_MODEL_FROM_DATABASE=88SE9128 SATA III 6Gb/s RAID Controller
 
@@ -67943,6 +68195,18 @@ pci:v00001BD0d00001004*
 pci:v00001BD0d00001005*
  ID_MODEL_FROM_DATABASE=PE1000 (Multi-Protocol PCIe/104 Interface Card)
 
+pci:v00001BD0d00001006*
+ ID_MODEL_FROM_DATABASE=webCS Wireless Aircraft Communications Server
+
+pci:v00001BD0d00001007*
+ ID_MODEL_FROM_DATABASE=AB3000 Series Rugged Computer (Series N)
+
+pci:v00001BD0d00001008*
+ ID_MODEL_FROM_DATABASE=ME1000 mPCIe Avionics Interface Card
+
+pci:v00001BD0d0000100A*
+ ID_MODEL_FROM_DATABASE=NG1 Series Avionics Converter
+
 pci:v00001BD0d00001101*
  ID_MODEL_FROM_DATABASE=OmniBus II PCIe Multi-Protocol Interface Card
 
@@ -67952,6 +68216,18 @@ pci:v00001BD0d00001102*
 pci:v00001BD0d00001103*
  ID_MODEL_FROM_DATABASE=OmniBus II cPCIe/PXIe Multi-Protocol Interface Card
 
+pci:v00001BD0d00001200*
+ ID_MODEL_FROM_DATABASE=NG3 Series Mil-Std-1553 Interface
+
+pci:v00001BD0d00001201*
+ ID_MODEL_FROM_DATABASE=NG3 Series ARINC 429 Interface
+
+pci:v00001BD0d00001202*
+ ID_MODEL_FROM_DATABASE=NG3 Series Avionics Discrete & Serial Interface
+
+pci:v00001BD0d00001203*
+ ID_MODEL_FROM_DATABASE=NG3 Series Avionics Discrete Interface
+
 pci:v00001BD4*
  ID_VENDOR_FROM_DATABASE=Inspur Electronic Information Industry Co., Ltd.
 
@@ -68048,6 +68324,9 @@ pci:v00001C1Fd0000001C*
 pci:v00001C1Fd0000001D*
  ID_MODEL_FROM_DATABASE=Vega
 
+pci:v00001C1Fd0000001F*
+ ID_MODEL_FROM_DATABASE=FD940
+
 pci:v00001C28*
  ID_VENDOR_FROM_DATABASE=Lite-On IT Corp. / Plextor
 
@@ -68216,6 +68495,9 @@ pci:v00001C5Cd00001285*
 pci:v00001C5Cd00001327*
  ID_MODEL_FROM_DATABASE=BC501 NVMe Solid State Drive 512GB
 
+pci:v00001C5Cd00001339*
+ ID_MODEL_FROM_DATABASE=BC511
+
 pci:v00001C5Cd00001504*
  ID_MODEL_FROM_DATABASE=SC300 512GB M.2 2280 SATA Solid State Drive
 
@@ -68465,6 +68747,9 @@ pci:v00001CE4d0000000A*
 pci:v00001CE4d0000000B*
  ID_MODEL_FROM_DATABASE=ExaNIC V9P
 
+pci:v00001CE4d0000000C*
+ ID_MODEL_FROM_DATABASE=ExaNIC V9P-3
+
 pci:v00001CE4d00000100*
  ID_MODEL_FROM_DATABASE=ExaDISK FX1
 
@@ -68949,7 +69234,7 @@ pci:v00001D82d00000202*
  ID_MODEL_FROM_DATABASE=Codensity T408 Video Encoding-Decoding Accelerator
 
 pci:v00001D87*
- ID_VENDOR_FROM_DATABASE=Fuzhou Rockchip Electronics Co., Ltd
+ ID_VENDOR_FROM_DATABASE=Rockchip Electronics Co., Ltd
 
 pci:v00001D87d00000100*
  ID_MODEL_FROM_DATABASE=RK3399 PCI Express Root Port
@@ -68957,6 +69242,9 @@ pci:v00001D87d00000100*
 pci:v00001D87d00001808*
  ID_MODEL_FROM_DATABASE=RK1808 Neural Network Processor Card
 
+pci:v00001D87d00003566*
+ ID_MODEL_FROM_DATABASE=RK3568 Remote Signal Processor
+
 pci:v00001D8F*
  ID_VENDOR_FROM_DATABASE=Enyx
 
@@ -69306,7 +69594,7 @@ pci:v00001DE1d00000391*
  ID_MODEL_FROM_DATABASE=TRM-S1040 [DC-315 / DC-395 series]
 
 pci:v00001DE1d00002020*
- ID_MODEL_FROM_DATABASE=DC-390
+ ID_MODEL_FROM_DATABASE=DC-390 Series SCSI Adapter [AMD Am53C974]
 
 pci:v00001DE1d0000690C*
  ID_MODEL_FROM_DATABASE=690c
@@ -69479,6 +69767,12 @@ pci:v00001DF3d00000206sv00001DF3sd00000000*
 pci:v00001DF3d00000206sv00001DF3sd00000001*
  ID_MODEL_FROM_DATABASE=ACE-NIC200 Programmable Network Accelerator (ENA2200F)
 
+pci:v00001DF3d00000207*
+ ID_MODEL_FROM_DATABASE=ACE-NIC50RN Programmable Network Accelerator
+
+pci:v00001DF3d00000208*
+ ID_MODEL_FROM_DATABASE=ACE-NIC100RN Programmable Network Accelerator
+
 pci:v00001DF7*
  ID_VENDOR_FROM_DATABASE=opencpi.org
 
@@ -69806,6 +70100,9 @@ pci:v00001EB1*
 pci:v00001EB1d00001001*
  ID_MODEL_FROM_DATABASE=Video Accelerator
 
+pci:v00001ED3*
+ ID_VENDOR_FROM_DATABASE=Yeston
+
 pci:v00001ED8*
  ID_VENDOR_FROM_DATABASE=Digiteq Automotive
 
@@ -70058,6 +70355,9 @@ pci:v00002646*
 pci:v00002646d00000010*
  ID_MODEL_FROM_DATABASE=HyperX Predator PCIe AHCI SSD
 
+pci:v00002646d00002262*
+ ID_MODEL_FROM_DATABASE=KC2000 NVMe SSD
+
 pci:v00002646d00002263*
  ID_MODEL_FROM_DATABASE=A2000 NVMe SSD
 
@@ -70554,7 +70854,10 @@ pci:v00004348d00007173*
  ID_MODEL_FROM_DATABASE=CH355 PCI Quad Serial Port Controller
 
 pci:v0000434E*
- ID_VENDOR_FROM_DATABASE=CAST Navigation LLC
+ ID_VENDOR_FROM_DATABASE=Cornelis Networks
+
+pci:v000043BC*
+ ID_VENDOR_FROM_DATABASE=Tiger Lake-H PCIe Root Port #5
 
 pci:v00004444*
  ID_VENDOR_FROM_DATABASE=Internext Compression Inc
@@ -72701,6 +73004,9 @@ pci:v00008086d0000040A*
 pci:v00008086d00000412*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
 
+pci:v00008086d00000412sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (Alienware X51 R2)
+
 pci:v00008086d00000412sv0000103Csd00001998*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (EliteDesk 800 G1)
 
@@ -72869,15 +73175,24 @@ pci:v00008086d000006AC*
 pci:v00008086d000006B0*
  ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #9
 
+pci:v00008086d000006BD*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCIe Port #6
+
 pci:v00008086d000006C0*
  ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #17
 
 pci:v00008086d000006C8*
  ID_MODEL_FROM_DATABASE=Comet Lake PCH cAVS
 
+pci:v00008086d000006D2*
+ ID_MODEL_FROM_DATABASE=Comet Lake SATA AHCI Controller
+
 pci:v00008086d000006E0*
  ID_MODEL_FROM_DATABASE=Comet Lake HECI Controller
 
+pci:v00008086d000006E3*
+ ID_MODEL_FROM_DATABASE=Comet Lake Keyboard and Text (KT) Redirection
+
 pci:v00008086d000006E8*
  ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO I2C Controller #0
 
@@ -73967,6 +74282,12 @@ pci:v00008086d00000B60sv00001028sd00002104*
 pci:v00008086d00000B60sv00008086sd00008008*
  ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Sentinel Rock Controller] (NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P5510))
 
+pci:v00008086d00000B60sv00008086sd00008D08*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Sentinel Rock Controller] (NVMe Datacenter SSD [3DNAND] VE 2.5" U.2 (P5316))
+
+pci:v00008086d00000B60sv00008086sd00008D1D*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Sentinel Rock Controller] (NVMe Datacenter SSD [3DNAND] VE E1.L 9.5/18mm (P5316))
+
 pci:v00008086d00000BE0*
  ID_MODEL_FROM_DATABASE=Atom Processor D2xxx/N2xxx Integrated Graphics Controller
 
@@ -74048,6 +74369,9 @@ pci:v00008086d00000BF7*
 pci:v00008086d00000C00*
  ID_MODEL_FROM_DATABASE=4th Gen Core Processor DRAM Controller
 
+pci:v00008086d00000C00sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=4th Gen Core Processor DRAM Controller (Alienware X51 R2)
+
 pci:v00008086d00000C00sv0000103Csd00001998*
  ID_MODEL_FROM_DATABASE=4th Gen Core Processor DRAM Controller (EliteDesk 800 G1)
 
@@ -77324,6 +77648,9 @@ pci:v00008086d00001521sv0000193Dsd00001005*
 pci:v00008086d00001521sv0000193Dsd00001007*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (360T-L)
 
+pci:v00008086d00001521sv0000193Dsd00001080*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (NIC-ETH360T-3S-4P)
+
 pci:v00008086d00001521sv00001BD4sd0000001D*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (1G base-T QP EP014Ti1 Adapter)
 
@@ -77843,9 +78170,15 @@ pci:v00008086d00001572sv0000193Dsd00001020*
 pci:v00008086d00001572sv0000193Dsd00001021*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (NIC-ETH561F-sL-2x10G)
 
+pci:v00008086d00001572sv0000193Dsd00001081*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (NIC-ETH561F-3S-2P)
+
 pci:v00008086d00001572sv000019E5sd0000D11C*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 2-port X710 10Gb SFP+ Adapter SP330)
 
+pci:v00008086d00001572sv00001BD4sd00000042*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (10G SFP+ DP EP102Fi4 Adapter)
+
 pci:v00008086d00001572sv00001BD4sd00000056*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Network Adapter X710-BM2 for OCP NIC 3.0)
 
@@ -78242,6 +78575,9 @@ pci:v00008086d00001592sv00008086sd0000000C*
 pci:v00008086d00001592sv00008086sd0000000D*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-L-Q2 for OCP 3.0)
 
+pci:v00008086d00001592sv00008086sd0000000E*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-2C-Q2)
+
 pci:v00008086d00001593*
  ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP
 
@@ -78374,6 +78710,9 @@ pci:v00008086d000015B7*
 pci:v00008086d000015B8*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I219-V
 
+pci:v00008086d000015B8sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I219-V (H270 PC MATE)
+
 pci:v00008086d000015B9*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (3) I219-LM
 
@@ -78587,6 +78926,9 @@ pci:v00008086d000015FFsv00001137sd000002D9*
 pci:v00008086d000015FFsv00001137sd000002DA*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T (Ethernet Network Adapter X710-T4L OCP 3.0)
 
+pci:v00008086d000015FFsv0000193Dsd00001082*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T (NIC-ETH565T-3S-2P)
+
 pci:v00008086d000015FFsv00008086sd00000000*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T (Ethernet Network Adapter X710-TL)
 
@@ -78869,6 +79211,9 @@ pci:v00008086d00001911*
 pci:v00008086d00001911sv00001028sd00000869*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (Vostro 3470)
 
+pci:v00008086d00001911sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (H270 PC MATE)
+
 pci:v00008086d00001911sv000017AAsd00002247*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (ThinkPad T570)
 
@@ -82922,6 +83267,9 @@ pci:v00008086d000024F0sv00001CB8sd00000003*
 pci:v00008086d000024F0sv00001CB8sd00000004*
  ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600E QSFP28)
 
+pci:v00008086d000024F0sv0000434Esd00000001*
+ ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI 100 Series, 1 Port, OCP 3.0 Adapter)
+
 pci:v00008086d000024F0sv00008086sd00002628*
  ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16)
 
@@ -84602,6 +84950,9 @@ pci:v00008086d0000277Csv00001043sd00008178*
 pci:v00008086d0000277D*
  ID_MODEL_FROM_DATABASE=82975X PCI Express Root Port
 
+pci:v00008086d00002780*
+ ID_MODEL_FROM_DATABASE=82915G/GV/GL/910GL [Grantsdale] Graphics Device
+
 pci:v00008086d00002782*
  ID_MODEL_FROM_DATABASE=82915G Integrated Graphics Controller
 
@@ -91577,6 +91928,39 @@ pci:v00008086d0000423Dsv00008086sd00001311*
 pci:v00008086d0000423Dsv00008086sd00001316*
  ID_MODEL_FROM_DATABASE=WiMAX/WiFi Link 5150 (ABG)
 
+pci:v00008086d0000438B*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H LPC/eSPI Controller
+
+pci:v00008086d000043A3*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H SMBus Controller
+
+pci:v00008086d000043A4*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H SPI Controller
+
+pci:v00008086d000043B0*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H PCI Express Root Port #9
+
+pci:v00008086d000043BC*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H PCI Express Root Port #5
+
+pci:v00008086d000043C8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H HD Audio Controller
+
+pci:v00008086d000043E0*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H Management Engine Interface
+
+pci:v00008086d000043E8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H Serial IO I2C Controller #0
+
+pci:v00008086d000043ED*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller
+
+pci:v00008086d000043EF*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H Shared SRAM
+
+pci:v00008086d000043F0*
+ ID_MODEL_FROM_DATABASE=Wi-Fi 6 AX201
+
 pci:v00008086d0000444E*
  ID_MODEL_FROM_DATABASE=Turbo Memory Controller
 
@@ -91769,6 +92153,9 @@ pci:v00008086d0000530D*
 pci:v00008086d00005502*
  ID_MODEL_FROM_DATABASE=Ethernet Controller (2) I225-LMvP
 
+pci:v00008086d00005504*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller I226-K
+
 pci:v00008086d00005845*
  ID_MODEL_FROM_DATABASE=QEMU NVM Express Controller
 
@@ -91811,6 +92198,9 @@ pci:v00008086d0000590F*
 pci:v00008086d0000590Fsv00001462sd00007A68*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (B250 KRAIT GAMING (MS-7A68))
 
+pci:v00008086d0000590Fsv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (H270 PC MATE)
+
 pci:v00008086d00005910*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
 
@@ -91820,6 +92210,9 @@ pci:v00008086d00005911*
 pci:v00008086d00005912*
  ID_MODEL_FROM_DATABASE=HD Graphics 630
 
+pci:v00008086d00005912sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=HD Graphics 630 (H270 PC MATE)
+
 pci:v00008086d00005914*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
 
@@ -93095,6 +93488,9 @@ pci:v00008086d00008C01*
 pci:v00008086d00008C02*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode]
 
+pci:v00008086d00008C02sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (Alienware X51 R2)
+
 pci:v00008086d00008C02sv0000103Csd00001998*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (EliteDesk 800 G1)
 
@@ -93209,6 +93605,9 @@ pci:v00008086d00008C1F*
 pci:v00008086d00008C20*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset High Definition Audio Controller
 
+pci:v00008086d00008C20sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset High Definition Audio Controller (Alienware X51 R2)
+
 pci:v00008086d00008C20sv0000103Csd00001909*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset High Definition Audio Controller (ZBook 15)
 
@@ -93227,6 +93626,9 @@ pci:v00008086d00008C21*
 pci:v00008086d00008C22*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family SMBus Controller
 
+pci:v00008086d00008C22sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family SMBus Controller (Alienware X51 R2)
+
 pci:v00008086d00008C22sv0000103Csd00001909*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family SMBus Controller (ZBook 15)
 
@@ -93251,6 +93653,9 @@ pci:v00008086d00008C24*
 pci:v00008086d00008C26*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #1
 
+pci:v00008086d00008C26sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #1 (Alienware X51 R2)
+
 pci:v00008086d00008C26sv0000103Csd00001909*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #1 (ZBook 15)
 
@@ -93275,6 +93680,9 @@ pci:v00008086d00008C26sv00002210sd000017AA*
 pci:v00008086d00008C2D*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #2
 
+pci:v00008086d00008C2Dsv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #2 (Alienware X51 R2)
+
 pci:v00008086d00008C2Dsv0000103Csd00001909*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #2 (ZBook 15)
 
@@ -93293,6 +93701,9 @@ pci:v00008086d00008C2Dsv000017AAsd0000309F*
 pci:v00008086d00008C31*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI
 
+pci:v00008086d00008C31sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI (Alienware X51 R2)
+
 pci:v00008086d00008C31sv0000103Csd00001909*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI (ZBook 15)
 
@@ -93317,6 +93728,9 @@ pci:v00008086d00008C34*
 pci:v00008086d00008C3A*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family MEI Controller #1
 
+pci:v00008086d00008C3Asv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family MEI Controller #1 (Alienware X51 R2)
+
 pci:v00008086d00008C3Asv0000103Csd00001909*
  ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family MEI Controller #1 (ZBook 15)
 
@@ -93377,6 +93791,9 @@ pci:v00008086d00008C49*
 pci:v00008086d00008C4A*
  ID_MODEL_FROM_DATABASE=H87 Express LPC Controller
 
+pci:v00008086d00008C4Asv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=H87 Express LPC Controller (Alienware X51 R2)
+
 pci:v00008086d00008C4B*
  ID_MODEL_FROM_DATABASE=HM87 Express LPC Controller
 
@@ -93800,6 +94217,9 @@ pci:v00008086d00009641*
 pci:v00008086d000096A1*
  ID_MODEL_FROM_DATABASE=Integrated RAID
 
+pci:v00008086d00009A01*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor PCIe Controller #1
+
 pci:v00008086d00009A03*
  ID_MODEL_FROM_DATABASE=TigerLake-LP Dynamic Tuning Processor Participant
 
@@ -93812,6 +94232,12 @@ pci:v00008086d00009A0B*
 pci:v00008086d00009A0D*
  ID_MODEL_FROM_DATABASE=Tiger Lake-LP Telemetry Aggregator
 
+pci:v00008086d00009A0F*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor PCIe Controller #0
+
+pci:v00008086d00009A11*
+ ID_MODEL_FROM_DATABASE=GNA Scoring Accelerator module
+
 pci:v00008086d00009A13*
  ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt 4 USB Controller
 
@@ -93839,6 +94265,9 @@ pci:v00008086d00009A23*
 pci:v00008086d00009A25*
  ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #1
 
+pci:v00008086d00009A26*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor Host Bridge/DRAM Registers
+
 pci:v00008086d00009A27*
  ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #2
 
@@ -93860,9 +94289,18 @@ pci:v00008086d00009A31*
 pci:v00008086d00009A33*
  ID_MODEL_FROM_DATABASE=Tiger Lake Trace Hub
 
+pci:v00008086d00009A36*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor Host Bridge/DRAM Registers
+
 pci:v00008086d00009A49*
  ID_MODEL_FROM_DATABASE=TigerLake GT2 [Iris Xe Graphics]
 
+pci:v00008086d00009A60*
+ ID_MODEL_FROM_DATABASE=TigerLake GT2 [Iris Xe Graphics]
+
+pci:v00008086d00009A68*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H UHD Graphics
+
 pci:v00008086d00009B41*
  ID_MODEL_FROM_DATABASE=CometLake-U GT2 [UHD Graphics]
 
@@ -95369,6 +95807,9 @@ pci:v00008086d0000A256*
 pci:v00008086d0000A282*
  ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [AHCI mode]
 
+pci:v00008086d0000A282sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [AHCI mode] (H270 PC MATE)
+
 pci:v00008086d0000A286*
  ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [RAID mode]
 
@@ -95387,18 +95828,27 @@ pci:v00008086d0000A293*
 pci:v00008086d0000A294*
  ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #5
 
+pci:v00008086d0000A294sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #5 (H270 PC MATE)
+
 pci:v00008086d0000A295*
  ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #6
 
 pci:v00008086d0000A296*
  ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #7
 
+pci:v00008086d0000A296sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #7 (H270 PC MATE)
+
 pci:v00008086d0000A297*
  ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #8
 
 pci:v00008086d0000A298*
  ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #9
 
+pci:v00008086d0000A298sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #9 (H270 PC MATE)
+
 pci:v00008086d0000A299*
  ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #10
 
@@ -95426,9 +95876,15 @@ pci:v00008086d0000A2A0*
 pci:v00008086d0000A2A1*
  ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family Power Management Controller
 
+pci:v00008086d0000A2A1sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family Power Management Controller (H270 PC MATE)
+
 pci:v00008086d0000A2A3*
  ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family SMBus Controller
 
+pci:v00008086d0000A2A3sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family SMBus Controller (H270 PC MATE)
+
 pci:v00008086d0000A2A4*
  ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family SPI Controller
 
@@ -95453,18 +95909,30 @@ pci:v00008086d0000A2AA*
 pci:v00008086d0000A2AF*
  ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
 
+pci:v00008086d0000A2AFsv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family USB 3.0 xHCI Controller (H270 PC MATE)
+
 pci:v00008086d0000A2B1*
  ID_MODEL_FROM_DATABASE=200 Series PCH Thermal Subsystem
 
+pci:v00008086d0000A2B1sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Thermal Subsystem (H270 PC MATE)
+
 pci:v00008086d0000A2BA*
  ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #1
 
+pci:v00008086d0000A2BAsv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #1 (H270 PC MATE)
+
 pci:v00008086d0000A2BB*
  ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #2
 
 pci:v00008086d0000A2C4*
  ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (H270)
 
+pci:v00008086d0000A2C4sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (H270) (H270 PC MATE)
+
 pci:v00008086d0000A2C5*
  ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (Z270)
 
@@ -95528,6 +95996,12 @@ pci:v00008086d0000A2EE*
 pci:v00008086d0000A2F0*
  ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio
 
+pci:v00008086d0000A2F0sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio (H270 PC MATE)
+
+pci:v00008086d0000A2F0sv00001462sd0000FA72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio (H270 PC MATE)
+
 pci:v00008086d0000A304*
  ID_MODEL_FROM_DATABASE=H370 Chipset LPC/eSPI Controller
 
@@ -95567,6 +96041,9 @@ pci:v00008086d0000A324sv00001028sd00000869*
 pci:v00008086d0000A328*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH Serial IO UART Host Controller
 
+pci:v00008086d0000A32B*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH SPI Host Controller
+
 pci:v00008086d0000A32C*
  ID_MODEL_FROM_DATABASE=Cannon Lake PCH PCI Express Root Port #21
 
@@ -95828,6 +96305,9 @@ pci:v00008086d0000D158*
 pci:v00008086d0000F1A5*
  ID_MODEL_FROM_DATABASE=SSD 600P Series
 
+pci:v00008086d0000F1A5sv00008086sd0000390A*
+ ID_MODEL_FROM_DATABASE=SSD 600P Series (SSDPEKKW256G7 256GB)
+
 pci:v00008086d0000F1A6*
  ID_MODEL_FROM_DATABASE=SSD Pro 7600p/760p/E 6100p Series
 
@@ -97514,6 +97994,9 @@ pci:v00009902d00000002*
 pci:v00009902d00000003*
  ID_MODEL_FROM_DATABASE=SG1010 Starfabric Switch and PCI Bridge
 
+pci:v00009A11*
+ ID_VENDOR_FROM_DATABASE=Tiger Lake-H Gaussian & Neural Accelerator
+
 pci:v00009D32*
  ID_VENDOR_FROM_DATABASE=Beijing Starblaze Technology Co. Ltd.
 
@@ -98582,6 +99065,9 @@ pci:v0000F1D0d0000EB24*
 pci:v0000F1D0d0000EB25*
  ID_MODEL_FROM_DATABASE=Corvid 44 12g
 
+pci:v0000F1D0d0000EB26*
+ ID_MODEL_FROM_DATABASE=T-Tap Pro
+
 pci:v0000F1D0d0000EFAC*
  ID_MODEL_FROM_DATABASE=Xena SD-MM/SD-22-MM
 
index fe191edbf465d00684e97267886371b50d11a92a..6cb0d468562a8dd5c5bbedec1ea8abf0017eccce 100644 (file)
@@ -67337,6 +67337,15 @@ usb:v3344*
 usb:v3344p3744*
  ID_MODEL_FROM_DATABASE=OEM PC Remote
 
+usb:v3384*
+ ID_VENDOR_FROM_DATABASE=System76
+
+usb:v3384p0000*
+ ID_MODEL_FROM_DATABASE=Thelio Io (thelio-io)
+
+usb:v3384p0001*
+ ID_MODEL_FROM_DATABASE=Launch Configurable Keyboard (launch_1)
+
 usb:v348F*
  ID_VENDOR_FROM_DATABASE=ISY
 
index 922f7b4719612acc77a1bc0874c3d82ce3c32e37..8923e12ea0816dd6bf410e90467b0133867e3c26 100644 (file)
@@ -5,27 +5,6 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 # This file has been generated using fprint-list-udev-hwdb with all drivers enabled
 
-# Supported by libfprint driver upektc_img
-usb:v147Ep2016*
-usb:v147Ep2020*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs5011
-usb:v138Ap0010*
-usb:v138Ap0011*
-usb:v138Ap0015*
-usb:v138Ap0017*
-usb:v138Ap0018*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver aes3500
-usb:v08FFp5731*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver aes4000
-usb:v5501p08FF*
- ID_AUTOSUSPEND=1
-
 # Supported by libfprint driver aes1610
 usb:v08FFp1600*
  ID_AUTOSUSPEND=1
@@ -50,6 +29,16 @@ usb:v08FFp168E*
 usb:v08FFp168F*
  ID_AUTOSUSPEND=1
 
+# Supported by libfprint driver aes2501
+usb:v08FFp2500*
+usb:v08FFp2580*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes2550
+usb:v08FFp2550*
+usb:v08FFp2810*
+ ID_AUTOSUSPEND=1
+
 # Supported by libfprint driver aes2660
 usb:v08FFp2660*
 usb:v08FFp2680*
@@ -71,46 +60,12 @@ usb:v08FFp268F*
 usb:v08FFp2691*
  ID_AUTOSUSPEND=1
 
-# Supported by libfprint driver aes2501
-usb:v08FFp2500*
-usb:v08FFp2580*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver aes2550
-usb:v08FFp2550*
-usb:v08FFp2810*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs101
-usb:v138Ap0001*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs301
-usb:v138Ap0005*
-usb:v138Ap0008*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs0050
-usb:v138Ap0050*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver etes603
-usb:v1C7Ap0603*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vcom5s
-usb:v061Ap0110*
+# Supported by libfprint driver aes3500
+usb:v08FFp5731*
  ID_AUTOSUSPEND=1
 
-# Supported by libfprint driver synaptics
-usb:v06CBp00BD*
-usb:v06CBp00E9*
-usb:v06CBp00DF*
-usb:v06CBp00F9*
-usb:v06CBp00FC*
-usb:v06CBp00C2*
-usb:v06CBp00C9*
-usb:v06CBp00E7*
+# Supported by libfprint driver aes4000
+usb:v5501p08FF*
  ID_AUTOSUSPEND=1
 
 # Supported by libfprint driver elan
@@ -171,6 +126,45 @@ usb:v04F3p0C42*
 usb:v04F3p0C4D*
  ID_AUTOSUSPEND=1
 
+# Supported by libfprint driver etes603
+usb:v1C7Ap0603*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver goodixmoc
+usb:v27C6p5840*
+usb:v27C6p6496*
+usb:v27C6p60A2*
+usb:v27C6p63AC*
+usb:v27C6p639C*
+usb:v27C6p6594*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver synaptics
+usb:v06CBp00BD*
+usb:v06CBp00E9*
+usb:v06CBp00DF*
+usb:v06CBp00F9*
+usb:v06CBp00FC*
+usb:v06CBp00C2*
+usb:v06CBp00C9*
+usb:v06CBp0100*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upeksonly
+usb:v147Ep2016*
+usb:v147Ep1000*
+usb:v147Ep1001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upektc
+usb:v0483p2015*
+usb:v147Ep3001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upektc_img
+usb:v147Ep2020*
+ ID_AUTOSUSPEND=1
+
 # Supported by libfprint driver uru4000
 usb:v045Ep00BC*
 usb:v045Ep00BD*
@@ -180,22 +174,33 @@ usb:v05BAp0008*
 usb:v05BAp000A*
  ID_AUTOSUSPEND=1
 
-# Supported by libfprint driver upektc
-usb:v0483p2015*
-usb:v147Ep3001*
+# Supported by libfprint driver vcom5s
+usb:v061Ap0110*
  ID_AUTOSUSPEND=1
 
-# Supported by libfprint driver upeksonly
-usb:v147Ep1000*
-usb:v147Ep1001*
+# Supported by libfprint driver vfs0050
+usb:v138Ap0050*
  ID_AUTOSUSPEND=1
 
-# Supported by libfprint driver goodixmoc
-usb:v27C6p5840*
-usb:v27C6p6496*
-usb:v27C6p60A2*
-usb:v27C6p63AC*
-usb:v27C6p639C*
+# Supported by libfprint driver vfs101
+usb:v138Ap0001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs301
+usb:v138Ap0005*
+usb:v138Ap0008*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs5011
+usb:v138Ap0010*
+usb:v138Ap0011*
+usb:v138Ap0015*
+usb:v138Ap0017*
+usb:v138Ap0018*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs7552
+usb:v138Ap0091*
  ID_AUTOSUSPEND=1
 
 # Known unsupported devices
@@ -205,6 +210,7 @@ usb:v04F3p0C4B*
 usb:v04F3p0C4C*
 usb:v04F3p0C4F*
 usb:v04F3p0C57*
+usb:v04F3p0C5E*
 usb:v04F3p2706*
 usb:v06CBp0081*
 usb:v06CBp0088*
@@ -215,13 +221,18 @@ usb:v06CBp00A2*
 usb:v06CBp00B7*
 usb:v06CBp00BB*
 usb:v06CBp00BE*
+usb:v06CBp00C4*
 usb:v06CBp00CB*
 usb:v06CBp00D8*
 usb:v06CBp00DA*
 usb:v0A5Cp5801*
 usb:v0A5Cp5805*
 usb:v0A5Cp5834*
+usb:v0A5Cp5840*
+usb:v0A5Cp5841*
+usb:v0A5Cp5842*
 usb:v0A5Cp5843*
+usb:v0A5Cp5845*
 usb:v10A5p0007*
 usb:v1188p9545*
 usb:v138Ap0007*
@@ -230,7 +241,6 @@ usb:v138Ap003C*
 usb:v138Ap003D*
 usb:v138Ap003F*
 usb:v138Ap0090*
-usb:v138Ap0091*
 usb:v138Ap0092*
 usb:v138Ap0094*
 usb:v138Ap0097*
index 081d0b297f0ede1ad766b59d9ffc30bb3239b283..82a92cf5478364d6e3a7fe6be7238a8bfa27d2d4 100644 (file)
@@ -265,10 +265,10 @@ evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE725
 
 # Dell Latitude E7470
 evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE7470:*
- EVDEV_ABS_00=29:2930:30
- EVDEV_ABS_01=26:1533:29
- EVDEV_ABS_35=29:2930:30
- EVDEV_ABS_36=26:1533:29
+ EVDEV_ABS_00=29:2930:30:16
+ EVDEV_ABS_01=26:1533:29:16
+ EVDEV_ABS_35=29:2930:30:16
+ EVDEV_ABS_36=26:1533:29:16
 
 # Dell Precision 5510
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnPrecision5510:*
index fc76be100d8e9780a9b77b008513768f993929a7..5485f892bb56cb4504b1e5213f7a0bbb4b014bd5 100644 (file)
@@ -383,7 +383,7 @@ evdev:name:Dell WMI hotkeys:dmi:bvn*:bvr*:bd*:svnDell*:pnPrecision*:*
  KEYBOARD_KEY_100150=f20                                # Mic mute toggle, should be micmute
 
 # Dell Latitude privacy microphone mute
-evdev:name:Dell Privacy Driver:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*:sku0A3E:*
+evdev:name:Dell Privacy Driver:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*:*
  KEYBOARD_KEY_12001=f20                                 # Mic mute toggle, should be micmute
 
 ###########################################################
index 6838e16aefd45881fadf4ffa37b104595d716276..54f6f34b7f23201a7f06616da628b1e7ed9915cd 100644 (file)
@@ -497,8 +497,9 @@ sensor:modalias:acpi:BMA250E*:dmi:bvnLENOVO:*:pvrLenovoMIIX3-1030:*
 sensor:modalias:acpi:SMO8500*:dmi:bvnLENOVO:*:pvrLenovoMIIX3-830:*
  ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, 1, 0; 0, 0, 1
 
-# IdeaPad D330
+# IdeaPad D330 and D330-10IGM
 sensor:modalias:acpi:BOSC0200*:dmi:*:svnLENOVO:pn81H3:*
+sensor:modalias:acpi:BOSC0200*:dmi:*:svnLENOVO:*:cvrLenovoideapadD330-10IGM:*
  ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1
 
 # IdeaPad Miix 300
index 17c9e2e507a851eaf98671079c6bc1535093cb5b..a609b30d695703cf844d329da8cb5bc3b34bd56c 100644 (file)
@@ -491,7 +491,9 @@ mouse:bluetooth:v046dpb019:name:MX Master 2S Mouse:*
  MOUSE_WHEEL_CLICK_COUNT=24
  MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
 
-# Logitech MX Ergo (via Bluetooth)
+# Logitech MX Ergo
+mouse:usb:v046dp406f:name:Logitech MX Ergo:*
+mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:406f:*
 mouse:bluetooth:v046dpb01d:name:MX Ergo Mouse:*
  ID_INPUT_TRACKBALL=1
 
diff --git a/hwdb.d/README b/hwdb.d/README
new file mode 100644 (file)
index 0000000..594f5bf
--- /dev/null
@@ -0,0 +1,11 @@
+Files in this directory specify a description of hardware devices, in the form
+of mappings from modalias-like keys (which identify specific hardware devices)
+to udev properties.
+
+Files in this directory are not read by udev directly. Instead,
+man:systemd-hwdb(8) compiles them into a binary database.
+
+See man:hwdb(7) for an overview of the configuration file format, and
+man:systemd-udevd.service(8) for a description of the udev daemon.
+
+Use 'systemd-analyze cat-config udev/hwdb.d' to display the effective config.
index e7c830541d85140934bfbe9cca2e7b96bc9f3ec9..d22bb22b99cd0e33c6bd0c8f0413737c3d98fb8a 100644 (file)
  <tr class="even"><td>CHENGDU HAIGUANG IC DESIGN CO., LTD</td><td>HYGO</td><td>07/15/2020</td> </tr>
  <tr class="odd"><td>PixArt imaging inc.</td><td>PIXA</td><td>07/15/2020</td> </tr>
  <tr class="even"><td>Loongson Technology Corporation Limited</td><td>LOON</td><td>09/10/2020</td> </tr>
+ <tr class="odd"><td>Seiko Epson Corporation</td><td>SECC</td><td>02/16/2021</td> </tr>
+ <tr class="even"><td>Alibaba Co., Ltd.</td><td>BABA</td><td>02/02/2021</td> </tr>
+ <tr class="odd"><td>Juniper Systems, Inc.</td><td>JSYS</td><td>03/18/2021</td> </tr>
+ <tr class="even"><td>Framework Computer LLC</td><td>FRMW</td><td>03/22/2021</td> </tr>
+ <tr class="odd"><td>Pensando Systems, Inc.</td><td>PNSO</td><td>03/24/2021</td> </tr>
       </tbody>
     </table>
   </body>
index 225d00a1bd90fc97214d444ef331a619aa619db2..5de04e9291b796715a75111e191baa8a3c148064 100644 (file)
@@ -5465,12 +5465,6 @@ B4417A     (base 16)             SHENZHEN GONGJIN ELECTRONICS CO.,LT
                                ShenZhen  GuangDong  518067\r
                                CN\r
 \r
-18-52-07   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-185207     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 00-00-62   (hex)               BULL HN INFORMATION SYSTEMS\r
 000062     (base 16)           BULL HN INFORMATION SYSTEMS\r
                                300 CONCORD ROAD M/S 864A\r
@@ -5675,12 +5669,6 @@ F8FF0B     (base 16)             Electronic Technology Inc.
                                Cupertino  CA  95014\r
                                US\r
 \r
-E0-C6-3C   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-E0C63C     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 00-0C-46   (hex)               Allied Telesyn Inc.\r
 000C46     (base 16)           Allied Telesyn Inc.\r
                                960 Stewart Drive, Suite B\r
@@ -7940,12 +7928,6 @@ FC55DC     (base 16)             Baltic Latvian Universal Electronics LLC
                                Westlake Village  CA  91362\r
                                US\r
 \r
-08-01-0F   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-08010F     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 94-18-82   (hex)               Hewlett Packard Enterprise\r
 941882     (base 16)           Hewlett Packard Enterprise\r
                                8000 Foothills Blvd.\r
@@ -17759,12 +17741,6 @@ F8D756     (base 16)           Simm Tronic Limited
                                Dublin     12\r
                                IE\r
 \r
-64-D0-2D   (hex)               Next Generation Integration (NGI)\r
-64D02D     (base 16)           Next Generation Integration (NGI)\r
-                               137 rue de Versailles\r
-                               Le Chesnay    78150\r
-                               FR\r
-\r
 90-51-3F   (hex)               Elettronica Santerno SpA\r
 90513F     (base 16)           Elettronica Santerno SpA\r
                                Via della Concia 7\r
@@ -33668,12 +33644,6 @@ C08F20     (base 16)           Shenzhen Skyworth  Digital  Technology  CO., Ltd
                                Shanghai  Yang Pu District  200433\r
                                CN\r
 \r
-C0-CC-42   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-C0CC42     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
-                               Chengdu  Sichuan  611330\r
-                               CN\r
-\r
 24-1A-E6   (hex)               Huawei Device Co., Ltd.\r
 241AE6     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
@@ -35597,6 +35567,270 @@ E44E2D     (base 16)          Cisco Systems, Inc
                                Kulim  Kedah  09000\r
                                MY\r
 \r
+80-65-59   (hex)               EM Microelectronic\r
+806559     (base 16)           EM Microelectronic\r
+                               Rue des Sors 3\r
+                               Marin-Epagnier  Neuchatel  2074\r
+                               CH\r
+\r
+D0-47-C1   (hex)               Elma Electronic AG\r
+D047C1     (base 16)           Elma Electronic AG\r
+                               Hofstrasse 93\r
+                               Wetzikon  Zuerich  8620\r
+                               CH\r
+\r
+C0-CC-42   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+C0CC42     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+C4-23-60   (hex)               Intel Corporate\r
+C42360     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+08-01-0F   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+08010F     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+18-52-07   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+185207     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+E0-C6-3C   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+E0C63C     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+DC-21-5C   (hex)               Intel Corporate\r
+DC215C     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+BC-EC-A0   (hex)               COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
+BCECA0     (base 16)           COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
+                               NO. 25, THE 3RD Street KUNSHAN EXPORT PROCESSING ZONE \r
+                               KUNSHAN  SUZHOU  215300\r
+                               CN\r
+\r
+F8-BA-E6   (hex)               Nokia\r
+F8BAE6     (base 16)           Nokia\r
+                               600 March Road\r
+                               Kanata  Ontario  K2K 2E6\r
+                               CA\r
+\r
+58-FD-5D   (hex)               Hangzhou Xinyun technology Co., Ltd.\r
+58FD5D     (base 16)           Hangzhou Xinyun technology Co., Ltd.\r
+                               Room 803, Block 8, Singapore Science & Technology Park\r
+                               Hangzhou  Zhejiang  310018\r
+                               CN\r
+\r
+24-A7-99   (hex)               Huawei Device Co., Ltd.\r
+24A799     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+7C-3E-74   (hex)               Huawei Device Co., Ltd.\r
+7C3E74     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+A4-55-90   (hex)               Xiaomi Communications Co Ltd\r
+A45590     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+14-89-19   (hex)               2bps\r
+148919     (base 16)           2bps\r
+                               #1502 , T-dong, Pungrim I-want, 170, Seohyeon-ro\r
+                               Seongnam-si  Gyeonggi-do  13590\r
+                               KR\r
+\r
+4C-71-67   (hex)               PoLabs d.o.o.\r
+4C7167     (base 16)           PoLabs d.o.o.\r
+                               Volavlje 30\r
+                               Ljubljana    1000\r
+                               SI\r
+\r
+04-71-53   (hex)               SERNET (SUZHOU) TECHNOLOGIES CORPORATION\r
+047153     (base 16)           SERNET (SUZHOU) TECHNOLOGIES CORPORATION\r
+                               NO.8 Tangzhuang Road,Suzhou Industrial Park,Su ZhouCity,JiangSu Province,China\r
+                               Suzhou    215021\r
+                               CN\r
+\r
+48-E7-DA   (hex)               AzureWave Technology Inc.\r
+48E7DA     (base 16)           AzureWave Technology Inc.\r
+                               8F., No. 94, Baozhong Rd.\r
+                               New Taipei City  Taiwan  231\r
+                               TW\r
+\r
+40-C4-8C   (hex)               N-iTUS CO.,LTD.\r
+40C48C     (base 16)           N-iTUS CO.,LTD.\r
+                               NiTUS 85, Deokcheon-ro\r
+                               Anyang-si  Gyeonggi-do, Korea  14086\r
+                               KR\r
+\r
+48-22-18   (hex)               Shenzhen Yipingfang Network Technology Co., Ltd.\r
+482218     (base 16)           Shenzhen Yipingfang Network Technology Co., Ltd.\r
+                               21 / F, Kangjia R & D building, No.28, Keji South 12th Road, Nanshan District, Shenzhen City, Guangdong Province, China\r
+                               Shenzhen  Nanshan District  518000\r
+                               CN\r
+\r
+E4-0C-FD   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+E40CFD     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+58-D6-97   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+58D697     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+                               NO.18 HAIBIN ROAD,\r
+                               DONG GUAN  GUANG DONG  523860\r
+                               CN\r
+\r
+54-37-BB   (hex)               Taicang T&W Electronics\r
+5437BB     (base 16)           Taicang T&W Electronics\r
+                               89# Jiang Nan RD\r
+                               Suzhou  Jiangsu  215412\r
+                               CN\r
+\r
+60-F8-F2   (hex)               Synaptec\r
+60F8F2     (base 16)           Synaptec\r
+                               204 George Street\r
+                               Glasgow    G1 1XW\r
+                               GB\r
+\r
+AC-74-B1   (hex)               Intel Corporate\r
+AC74B1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+30-A1-76   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+30A176     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+F4-E4-51   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+F4E451     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+1C-3C-D4   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+1C3CD4     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+F4-60-77   (hex)               Texas Instruments\r
+F46077     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+24-9A-C8   (hex)               Shenzhen Skyworth  Digital  Technology  CO., Ltd\r
+249AC8     (base 16)           Shenzhen Skyworth  Digital  Technology  CO., Ltd\r
+                               4F,Block A, Skyworth?Building,\r
+                               Shenzhen  Guangdong  518057\r
+                               CN\r
+\r
+C0-3C-04   (hex)               Sagemcom Broadband SAS\r
+C03C04     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+A4-D7-3C   (hex)               Seiko Epson Corporation\r
+A4D73C     (base 16)           Seiko Epson Corporation\r
+                               2070 Kotobuki Koaka\r
+                               Matsumoto-shi  Nagano-ken  399-8702\r
+                               JP\r
+\r
+2C-48-81   (hex)               vivo Mobile Communication Co., Ltd.\r
+2C4881     (base 16)           vivo Mobile Communication Co., Ltd.\r
+                               #283,BBK Road\r
+                               Wusha,Chang'An  DongGuan City,Guangdong,  523860\r
+                               CN\r
+\r
+60-26-EF   (hex)               Aruba, a Hewlett Packard Enterprise Company\r
+6026EF     (base 16)           Aruba, a Hewlett Packard Enterprise Company\r
+                               3333 Scott Blvd\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+F8-8E-A1   (hex)               Edgecore Networks Corporation\r
+F88EA1     (base 16)           Edgecore Networks Corporation\r
+                               1 Creation RD 3.\r
+                               Hsinchu    30077\r
+                               TW\r
+\r
+7C-85-30   (hex)               Nokia\r
+7C8530     (base 16)           Nokia\r
+                               600 March Road\r
+                               Kanata  Ontario  K2K 2E6\r
+                               CA\r
+\r
+64-D0-2D   (hex)               NEXT GENERATION INTEGRATION LIMITED (NGI)\r
+64D02D     (base 16)           NEXT GENERATION INTEGRATION LIMITED (NGI)\r
+                               Unit 1102, 11 / F, 29 Austin Road, TSIM SHA TSUI\r
+                               KOWLOON  Hong Kong  999077\r
+                               HK\r
+\r
+24-28-FD   (hex)               Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+2428FD     (base 16)           Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+                               No.555 Qianmo Road\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+88-AE-DD   (hex)               EliteGroup Computer Systems Co., LTD\r
+88AEDD     (base 16)           EliteGroup Computer Systems Co., LTD\r
+                               No. 239, Sec. 2, Ti ding Blvd.\r
+                               Taipei City    11493\r
+                               TW\r
+\r
+A0-E7-0B   (hex)               Intel Corporate\r
+A0E70B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+B0-D8-88   (hex)               Panasonic Corporation Automotive\r
+B0D888     (base 16)           Panasonic Corporation Automotive\r
+                               5652\r
+                               Matsumoto City  Nagano  399-8730\r
+                               JP\r
+\r
+F4-63-E7   (hex)               Nanjing Maxon O.E. Tech. Co., LTD\r
+F463E7     (base 16)           Nanjing Maxon O.E. Tech. Co., LTD\r
+                               6/F, Building A3, Zidong International Creative Park, Zidong Road, Qixia District, Nanjing\r
+                               NAN JING  JIANG SU  210000\r
+                               CN\r
+\r
+04-EE-EE   (hex)               Laplace System Co., Ltd.\r
+04EEEE     (base 16)           Laplace System Co., Ltd.\r
+                               1-245 Kyo-machi\r
+                               Fushimi, Kyoto  Kyoto  6128083\r
+                               JP\r
+\r
+6C-10-8B   (hex)               WeLink Communications\r
+6C108B     (base 16)           WeLink Communications\r
+                               4186 N Red Maple Court\r
+                               Lehi  UT  84043\r
+                               US\r
+\r
 9C-FF-C2   (hex)               AVI Systems GmbH\r
 9CFFC2     (base 16)           AVI Systems GmbH\r
                                Dr. Franz Wilhelmstraße 2A\r
@@ -39395,12 +39629,6 @@ D88F76     (base 16)           Apple, Inc.
                                Cupertino  CA  95014\r
                                US\r
 \r
-5C-A1-76   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-5CA176     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 58-38-79   (hex)               RICOH COMPANY, LTD.\r
 583879     (base 16)           RICOH COMPANY, LTD.\r
                                1005, Shimo-ogino\r
@@ -40865,12 +41093,6 @@ BCA8A6     (base 16)           Intel Corporate
                                shenzhen  guangdong  518057\r
                                CN\r
 \r
-E0-4F-BD   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-E04FBD     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 7C-EB-AE   (hex)               Ridgeline Instruments\r
 7CEBAE     (base 16)           Ridgeline Instruments\r
                                4803 Innovation Drive, Suite 3B\r
@@ -42233,12 +42455,6 @@ E8886C     (base 16)           Shenzhen SC Technologies Co.,LTD
                                000    0000\r
                                IL\r
 \r
-9C-61-21   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-9C6121     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 00-A0-C6   (hex)               Qualcomm Inc.\r
 00A0C6     (base 16)           Qualcomm Inc.\r
                                6455 LUSK BLVD\r
@@ -42425,12 +42641,6 @@ C4F1D1     (base 16)           BEIJING SOGOU TECHNOLOGY DEVELOPMENT CO., LTD.
                                Beijing    100000\r
                                CN\r
 \r
-AC-E7-7B   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-ACE77B     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 2C-36-A0   (hex)               Capisco Limited\r
 2C36A0     (base 16)           Capisco Limited\r
                                PO Box 938\r
@@ -42467,12 +42677,6 @@ C86C87     (base 16)           Zyxel Communications Corporation
                                Chandler  AZ  85224\r
                                US\r
 \r
-64-5D-92   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-645D92     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 38-BC-1A   (hex)               MEIZU Technology Co., Ltd.\r
 38BC1A     (base 16)           MEIZU Technology Co., Ltd.\r
                                MEIZU Tech Bldg., Technology & Innovation Coast\r
@@ -42557,12 +42761,6 @@ C8AFE3     (base 16)           Hefei Radio Communication Technology Co., Ltd
                                Hefei  Anhui  230088\r
                                CN\r
 \r
-CC-A2-60   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-CCA260     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 7C-57-4E   (hex)               COBI GmbH\r
 7C574E     (base 16)           COBI GmbH\r
                                Solmsstrasse 4\r
@@ -42623,12 +42821,6 @@ E47B3F     (base 16)           BEIJING CO-CLOUD TECHNOLOGY LTD.
                                San Francisco  CA  94103\r
                                US\r
 \r
-40-F4-20   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-40F420     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 34-A2-A2   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
 34A2A2     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
@@ -48974,12 +49166,6 @@ F48139     (base 16)           CANON INC.
                                Olathe  KS  66061\r
                                US\r
 \r
-A4-D0-94   (hex)               Erwin Peters Systemtechnik GmbH\r
-A4D094     (base 16)           Erwin Peters Systemtechnik GmbH\r
-                               Josef Baumann Strasse 37\r
-                               Bochum    D44805\r
-                               DE\r
-\r
 88-23-64   (hex)               Watchnet DVR Inc\r
 882364     (base 16)           Watchnet DVR Inc\r
                                Unit 5 - 351 Ferrier St.\r
@@ -62225,12 +62411,6 @@ D4AAFF     (base 16)           MICRO WORLD
                                    \r
                                KR\r
 \r
-00-03-24   (hex)               SANYO Consumer Electronics Co., Ltd.\r
-000324     (base 16)           SANYO Consumer Electronics Co., Ltd.\r
-                               7-101 Tachikawa-cho\r
-                               Tottori City    680-8634\r
-                               JP\r
-\r
 00-02-BF   (hex)               dotRocket, Inc.\r
 0002BF     (base 16)           dotRocket, Inc.\r
                                1901 S. Bascom, Suite 300\r
@@ -68129,12 +68309,6 @@ D8F2CA     (base 16)           Intel Corporate
                                Kulim  Kedah  09000\r
                                MY\r
 \r
-44-56-E2   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-4456E2     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
-                               Chengdu  Sichuan  611330\r
-                               CN\r
-\r
 68-EC-C5   (hex)               Intel Corporate\r
 68ECC5     (base 16)           Intel Corporate\r
                                Lot 8, Jalan Hi-Tech 2/3 \r
@@ -70625,6 +70799,390 @@ D0E042     (base 16)          Cisco Systems, Inc
                                San Jose  CA  94568\r
                                US\r
 \r
+3C-37-12   (hex)               AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+3C3712     (base 16)           AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+                               Alt-Moabit 95\r
+                               Berlin  Berlin  10559\r
+                               DE\r
+\r
+80-B6-55   (hex)               Intel Corporate\r
+80B655     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+0C-CB-0C   (hex)               iSYS RTS GmbH\r
+0CCB0C     (base 16)           iSYS RTS GmbH\r
+                               Moosacher Str. 88\r
+                               Munich  Bavaria  80809\r
+                               DE\r
+\r
+44-56-E2   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+4456E2     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+54-AE-D2   (hex)               CSL Dualcom Ltd\r
+54AED2     (base 16)           CSL Dualcom Ltd\r
+                               Salamander Quay West, Park Lane\r
+                               Harefield  Middlesex  UB9 6NZ\r
+                               GB\r
+\r
+F4-6F-A4   (hex)               Physik Instrumente GmbH & Co. KG\r
+F46FA4     (base 16)           Physik Instrumente GmbH & Co. KG\r
+                               Auf der Roemerstr. 1\r
+                               Karlsruhe    76228\r
+                               DE\r
+\r
+C4-74-69   (hex)               BT9\r
+C47469     (base 16)           BT9\r
+                               Dolev 33\r
+                               Tefen    2495900\r
+                               IL\r
+\r
+64-5D-92   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+645D92     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+9C-61-21   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+9C6121     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+E0-4F-BD   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+E04FBD     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+40-F4-20   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+40F420     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+CC-A2-60   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+CCA260     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+AC-E7-7B   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ACE77B     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+4C-D3-AF   (hex)               HMD Global Oy\r
+4CD3AF     (base 16)           HMD Global Oy\r
+                               Bertel Jungin aukio 9\r
+                               Espoo    02600\r
+                               FI\r
+\r
+C8-51-42   (hex)               Samsung Electronics Co.,Ltd\r
+C85142     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+CC-0D-E7   (hex)               B METERS S.R.L.\r
+CC0DE7     (base 16)           B METERS S.R.L.\r
+                               VIA FRIULI 3\r
+                               GONARS  UDINE  33050\r
+                               IT\r
+\r
+5C-A1-76   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+5CA176     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+10-E4-C2   (hex)               Samsung Electronics Co.,Ltd\r
+10E4C2     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+0C-8D-CA   (hex)               Samsung Electronics Co.,Ltd\r
+0C8DCA     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+58-2F-F7   (hex)               Sagemcom Broadband SAS\r
+582FF7     (base 16)           Sagemcom Broadband SAS\r
+                               250, route de l'Empereur\r
+                               Rueil Malmaison Cedex  hauts de seine  92848\r
+                               FR\r
+\r
+8C-FD-15   (hex)               Imagine Marketing Private Limited\r
+8CFD15     (base 16)           Imagine Marketing Private Limited\r
+                               501B, Shri Guru Har Krishan Bhavan Charat Singh Colony Road, Chakala, Andheri East,\r
+                               Mumbai  Maharashtra  400093\r
+                               IN\r
+\r
+AC-D8-29   (hex)               Bouffalo Lab (Nanjing) Co., Ltd.\r
+ACD829     (base 16)           Bouffalo Lab (Nanjing) Co., Ltd.\r
+                               5F, Gongxiang Space, No.100 Tuanjie Road, Nanjing, China\r
+                               Nanjing  Jiangsu  211800\r
+                               CN\r
+\r
+68-3A-48   (hex)               SAMJIN Co., Ltd.\r
+683A48     (base 16)           SAMJIN Co., Ltd.\r
+                               199-6, Anyang 7-dong, Manan-gu\r
+                               Anyang-si  Gyeonggi-do  430-817\r
+                               KR\r
+\r
+B0-27-CF   (hex)               Extreme Networks, Inc.\r
+B027CF     (base 16)           Extreme Networks, Inc.\r
+                               6480 Via Del Oro\r
+                               San Jose  CA  95119\r
+                               US\r
+\r
+14-22-3B   (hex)               Google, Inc.\r
+14223B     (base 16)           Google, Inc.\r
+                               1600 Amphitheatre Parkway\r
+                               Mountain View  CA  94043\r
+                               US\r
+\r
+48-F8-FF   (hex)               CHENGDU KT ELECTRONIC HI-TECH CO.,LTD\r
+48F8FF     (base 16)           CHENGDU KT ELECTRONIC HI-TECH CO.,LTD\r
+                               No.9, 3rd Wuke Road, Wuhou District\r
+                               Chengdu  Sichuan Province  610045\r
+                               CN\r
+\r
+E8-C1-E8   (hex)               Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd.\r
+E8C1E8     (base 16)           Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd.\r
+                               4GH Unit,Block D,Central Avenue,Intersection of Xixiang Avenue and Baoyuan Road,Labor Community,Xixiang Street,Baoan District\r
+                               Shenzhen  China  518102\r
+                               CN\r
+\r
+2C-DD-E9   (hex)               Arista Networks\r
+2CDDE9     (base 16)           Arista Networks\r
+                               5453 Great America Parkway\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+70-97-41   (hex)               Arcadyan Corporation\r
+709741     (base 16)           Arcadyan Corporation\r
+                               No.8, Sec.2, Guangfu Rd.\r
+                               Hsinchu City  Hsinchu  30071\r
+                               TW\r
+\r
+C4-FF-22   (hex)               Huawei Device Co., Ltd.\r
+C4FF22     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+A0-A0-DC   (hex)               Huawei Device Co., Ltd.\r
+A0A0DC     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C4-80-8A   (hex)               Cloud Diagnostics Canada ULC\r
+C4808A     (base 16)           Cloud Diagnostics Canada ULC\r
+                               72 Victoria St. S., Unit 100\r
+                               Kitchener  Ontario  N2G 4Y9\r
+                               CA\r
+\r
+E4-08-E7   (hex)               Quectel Wireless Solutions Co.,Ltd.\r
+E408E7     (base 16)           Quectel Wireless Solutions Co.,Ltd.\r
+                               7th Floor, Hongye Building, No.1801 Hongmei Road, Xuhui District\r
+                               Shanghai    200233\r
+                               CN\r
+\r
+7C-70-DB   (hex)               Intel Corporate\r
+7C70DB     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+8C-94-CC   (hex)               SFR\r
+8C94CC     (base 16)           SFR\r
+                               12 rue jean-philippe Rameau CS 80001\r
+                               La plaine saint denis   FRANCE  93634\r
+                               FR\r
+\r
+60-DB-15   (hex)               New H3C Technologies Co., Ltd\r
+60DB15     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+5C-A7-21   (hex)               New H3C Technologies Co., Ltd\r
+5CA721     (base 16)           New H3C Technologies Co., Ltd\r
+                               466 Changhe Road, Binjiang District\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+98-F2-17   (hex)               Castlenet Technology Inc.\r
+98F217     (base 16)           Castlenet Technology Inc.\r
+                               5F., No. 10, Daye Rd., Beitou Dist.\r
+                               Taipei City    112030\r
+                               TW\r
+\r
+6C-43-3C   (hex)               TECNO MOBILE LIMITED\r
+6C433C     (base 16)           TECNO MOBILE LIMITED\r
+                               ROOMS 05-15, 13A/F., SOUTH TOWER, WORLD FINANCE CENTRE, HARBOUR CITY, 17 CANTON ROAD, TSIM SHA TSUI, KOWLOON, HONG KONG\r
+                               Hong Kong  Hong Kong  999077\r
+                               HK\r
+\r
+44-5B-ED   (hex)               Aruba, a Hewlett Packard Enterprise Company\r
+445BED     (base 16)           Aruba, a Hewlett Packard Enterprise Company\r
+                               3333 Scott Blvd\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+70-A6-CC   (hex)               Intel Corporate\r
+70A6CC     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+84-EB-EF   (hex)               Cisco Systems, Inc\r
+84EBEF     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+90-80-60   (hex)               Nilfisk A/S\r
+908060     (base 16)           Nilfisk A/S\r
+                               Kornmarksvej 1\r
+                               Broendby     2605\r
+                               DK\r
+\r
+10-09-F9   (hex)               Amazon Technologies Inc.\r
+1009F9     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102 \r
+                               Reno  NV  89507\r
+                               US\r
+\r
+D0-3E-7D   (hex)               CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.\r
+D03E7D     (base 16)           CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.\r
+                               9F,BLOCK A,GARDEN CITY DIGITAL BUILDING,NO.1079 NANHAI ROAD,NANSHAN DISTRICT\r
+                               SHEN ZHEN  GUANG DONG  518000\r
+                               CN\r
+\r
+6C-79-B8   (hex)               Texas Instruments\r
+6C79B8     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+A4-D0-94   (hex)               VIVAVIS AG\r
+A4D094     (base 16)           VIVAVIS AG\r
+                               Nobelstr. 18\r
+                               Ettlingen    D-76375\r
+                               DE\r
+\r
+8C-A3-99   (hex)               SERVERCOM (INDIA) PRIVATE LIMITED\r
+8CA399     (base 16)           SERVERCOM (INDIA) PRIVATE LIMITED\r
+                               E-43/1 OKHLA INDUSTRIAL AREA PHASE-II NEW DELHI SOUTH DELHI\r
+                               NEW DELHI    NA\r
+                               IN\r
+\r
+D4-54-8B   (hex)               Intel Corporate\r
+D4548B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+60-A5-E2   (hex)               Intel Corporate\r
+60A5E2     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+FC-92-57   (hex)               Renesas Electronics (Penang) Sdn. Bhd.\r
+FC9257     (base 16)           Renesas Electronics (Penang) Sdn. Bhd.\r
+                               Phase 3, Bayan Lepas FIZ\r
+                               Bayan Lepas  Penang  11900\r
+                               MY\r
+\r
+90-69-76   (hex)               Withrobot Inc.\r
+906976     (base 16)           Withrobot Inc.\r
+                               #1001, Seoul Forest M-tower, 31, Ttukseom-ro 1-gil, Seongdong-gu\r
+                               Seoul  Seoul  04778\r
+                               KR\r
+\r
+60-B6-E1   (hex)               Texas Instruments\r
+60B6E1     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+D0-1E-1D   (hex)               SaiNXT Technologies LLP\r
+D01E1D     (base 16)           SaiNXT Technologies LLP\r
+                               Shop No. 7, Sonawala Building, 1st Floor, Proctor Road, Grant Road (E)\r
+                               Mumbai  Maharashtra  400007\r
+                               IN\r
+\r
+A8-23-16   (hex)               Nokia\r
+A82316     (base 16)           Nokia\r
+                               600 March Road\r
+                               Kanata  Ontario  K2K 2E6\r
+                               CA\r
+\r
+38-E3-9F   (hex)               Motorola Mobility LLC, a Lenovo Company\r
+38E39F     (base 16)           Motorola Mobility LLC, a Lenovo Company\r
+                               222 West Merchandise Mart Plaza\r
+                               Chicago  IL  60654\r
+                               US\r
+\r
+A4-2A-71   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+A42A71     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+44-67-52   (hex)               Wistron INFOCOMM (Zhongshan) CORPORATION\r
+446752     (base 16)           Wistron INFOCOMM (Zhongshan) CORPORATION\r
+                               15 Cuiwei Road, Cuiheng New District\r
+                               zhongshan  Guangdong  528400\r
+                               CN\r
+\r
+78-BB-88   (hex)               Maxio Technology (Hangzhou) Ltd.\r
+78BB88     (base 16)           Maxio Technology (Hangzhou) Ltd.\r
+                               6F, Building C, No.459 Qianmo Road, Juguang Center\r
+                               Hangzhou  Zhejiang  310051\r
+                               CN\r
+\r
+A8-64-F1   (hex)               Intel Corporate\r
+A864F1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+58-4D-42   (hex)               Dragos, Inc.\r
+584D42     (base 16)           Dragos, Inc.\r
+                               1745 Dorsey Rd, Suite R\r
+                               Hanover  MD  21076\r
+                               US\r
+\r
+60-8A-10   (hex)               Microchip Technology Inc.\r
+608A10     (base 16)           Microchip Technology Inc.\r
+                               2355 W. Chandler Blvd.\r
+                               Chandler  AZ  85224\r
+                               US\r
+\r
+10-6F-D9   (hex)               CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+106FD9     (base 16)           CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+                               B22 Building,NO.51 Tongle Road, Shajing Town, Jiangnan District, Nanning, Guangxi Province, China\r
+                               Nanning  Guangxi  530007\r
+                               CN\r
+\r
+00-03-24   (hex)               SANYO Techno Solutions Tottori Co., Ltd.\r
+000324     (base 16)           SANYO Techno Solutions Tottori Co., Ltd.\r
+                               7-101 Tachikawa-cho\r
+                               Tottori City    680-8634\r
+                               JP\r
+\r
 84-80-94   (hex)               Meter, Inc.\r
 848094     (base 16)           Meter, Inc.\r
                                148 Townsend St\r
@@ -71072,9 +71630,6 @@ FCBCD1     (base 16)            HUAWEI TECHNOLOGIES CO.,LTD
                                Dongguan     523808\r
                                CN\r
 \r
-CC-3A-DF   (hex)               Private\r
-CC3ADF     (base 16)           Private\r
-\r
 38-EF-E3   (hex)                INGENICO TERMINALS SAS\r
 38EFE3     (base 16)            INGENICO TERMINALS SAS\r
                                28-32 BOULEVARD DE GRENELLE\r
@@ -72536,12 +73091,6 @@ A83FA1     (base 16)           IEEE Registration Authority
                                Piscataway  NJ  08554\r
                                US\r
 \r
-78-47-E3   (hex)               SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-7847E3     (base 16)           SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
-                               CHENGDU  SICHUAN  611330\r
-                               CN\r
-\r
 6C-9B-C0   (hex)               Chemoptics Inc.\r
 6C9BC0     (base 16)           Chemoptics Inc.\r
                                261, Techno 2-ro, Yuseong-gu\r
@@ -74690,12 +75239,6 @@ D0D2B0     (base 16)           Apple, Inc.
                                Nishi-ku, Fukuoka-shi  Fukuoka  819-0373\r
                                JP\r
 \r
-F0-92-B4   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-F092B4     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 E8-DF-70   (hex)               AVM Audiovisuelles Marketing und Computersysteme GmbH\r
 E8DF70     (base 16)           AVM Audiovisuelles Marketing und Computersysteme GmbH\r
                                Alt-Moabit 95\r
@@ -74726,12 +75269,6 @@ F06D78     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
                                Shenzhen  Guangdong  518057\r
                                CN\r
 \r
-EC-F8-EB   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-ECF8EB     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 70-7D-95   (hex)               Shenzhen City LinwlanTechnology Co. Ltd.\r
 707D95     (base 16)           Shenzhen City LinwlanTechnology Co. Ltd.\r
                                106 village road , manhole street Baoan district .\r
@@ -76352,12 +76889,6 @@ C8AA55     (base 16)           Hunan Comtom Electronic Incorporated Co.,Ltd
                                Sunnyvale  CA  94089\r
                                US\r
 \r
-2C-63-73   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-2C6373     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 24-A7-DC   (hex)               BSkyB Ltd\r
 24A7DC     (base 16)           BSkyB Ltd\r
                                130 Kings Road\r
@@ -87752,12 +88283,6 @@ C89383     (base 16)           Embedded Automation, Inc.
                                Shenzhen  Guangdong  518107\r
                                CN\r
 \r
-8C-4D-EA   (hex)               Cerio Corporation\r
-8C4DEA     (base 16)           Cerio Corporation\r
-                               5F., No.88, Mincyuan Rd., Sindian City\r
-                               Taipei County    23141\r
-                               TW\r
-\r
 24-BA-30   (hex)               Technical Consumer Products, Inc.\r
 24BA30     (base 16)           Technical Consumer Products, Inc.\r
                                325 Campus Drive\r
@@ -87992,12 +88517,6 @@ C8A1B6     (base 16)           Shenzhen Longway Technologies Co., Ltd
                                Shenzhen  Guangdong  518057\r
                                CN\r
 \r
-A8-55-6A   (hex)               Pocketnet Technology Inc.\r
-A8556A     (base 16)           Pocketnet Technology Inc.\r
-                               Suite B, 7F., No. 550, Ruie Kwang Rd., Neihu District,\r
-                               Taipei    11429\r
-                               TW\r
-\r
 B4-C8-10   (hex)               UMPI Elettronica\r
 B4C810     (base 16)           UMPI Elettronica\r
                                Via Respighi, 15\r
@@ -95402,12 +95921,6 @@ D8D67E     (base 16)           GSK CNC EQUIPMENT CO.,LTD
                                Yokohama  Kanagawa  224-0037\r
                                JP\r
 \r
-00-0B-3A   (hex)               QuStream Corporation\r
-000B3A     (base 16)           QuStream Corporation\r
-                               3305 Breckinridge Blvd.\r
-                               Duluth  Georgia  30096\r
-                               US\r
-\r
 00-0B-33   (hex)               Vivato Technologies\r
 000B33     (base 16)           Vivato Technologies\r
                                444 Cedros Ave\r
@@ -103913,12 +104426,6 @@ D8C678     (base 16)         MitraStar Technology Corp.
                                Shenzhen  Guangdong  518000\r
                                CN\r
 \r
-C4-A1-51   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-C4A151     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
-                               Chengdu  Sichuan  611330\r
-                               CN\r
-\r
 10-E7-7A   (hex)               STMicrolectronics International NV\r
 10E77A     (base 16)           STMicrolectronics International NV\r
                                39, Chemin du Champ-des-Filles\r
@@ -106076,6 +106583,36 @@ A49BCD     (base 16)         Cisco Systems, Inc
                                Riga  Riga  LV1009\r
                                LV\r
 \r
+88-E0-56   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+88E056     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+D0-7D-33   (hex)               Huawei Device Co., Ltd.\r
+D07D33     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C0-E1-BE   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C0E1BE     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+D0-35-E5   (hex)               EM Microelectronic\r
+D035E5     (base 16)           EM Microelectronic\r
+                               Rue des Sors 3\r
+                               Marin-Epagnier  Neuchatel  2074\r
+                               CH\r
+\r
+90-96-F3   (hex)               BUFFALO.INC\r
+9096F3     (base 16)           BUFFALO.INC\r
+                               AKAMONDORI Bld.,30-20,Ohsu 3-chome,Naka-ku\r
+                               Nagoya  Aichi Pref.  460-8315\r
+                               JP\r
+\r
 54-0E-58   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
 540E58     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
                                NO.18 HAIBIN ROAD,\r
@@ -106094,24 +106631,282 @@ A49BCD     (base 16)               Cisco Systems, Inc
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-D0-7D-33   (hex)               Huawei Device Co., Ltd.\r
-D07D33     (base 16)           Huawei Device Co., Ltd.\r
+C4-A1-51   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+C4A151     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+78-47-E3   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+7847E3     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+                               CHENGDU  SICHUAN  611330\r
+                               CN\r
+\r
+EC-F8-EB   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ECF8EB     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+F0-92-B4   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+F092B4     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+F4-4E-38   (hex)               Olibra LLC\r
+F44E38     (base 16)           Olibra LLC\r
+                               45 legin dr\r
+                               creskill  NJ  07626\r
+                               US\r
+\r
+2C-63-73   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+2C6373     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+A0-D7-22   (hex)               Samsung Electronics Co.,Ltd\r
+A0D722     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+50-49-B0   (hex)               Samsung Electronics Co.,Ltd\r
+5049B0     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+E8-05-DC   (hex)               Verifone Inc.\r
+E805DC     (base 16)           Verifone Inc.\r
+                               2560 North First Street, Suite 220\r
+                               San Jose  CA  95131\r
+                               US\r
+\r
+10-7B-CE   (hex)               Nokia\r
+107BCE     (base 16)           Nokia\r
+                               600 March Road\r
+                               Kanata  Ontario  K2K 2E6\r
+                               CA\r
+\r
+C8-05-9E   (hex)               Hefei Symboltek Co.,Ltd\r
+C8059E     (base 16)           Hefei Symboltek Co.,Ltd\r
+                               Standard factory building 2 layer,Tianmen Lake 1#,No.36 Fairview Avenue District Econmic Development Zone Hefei, Anhui \r
+                               Hefei  Anhui  230601\r
+                               CN\r
+\r
+34-FC-A1   (hex)               Micronet union Technology(Chengdu)Co., Ltd.\r
+34FCA1     (base 16)           Micronet union Technology(Chengdu)Co., Ltd.\r
+                               No.502, Building 5, No. 528, Yuefei Road, Shibantan Street, Xindu District\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+28-97-B8   (hex)               myenergi Ltd\r
+2897B8     (base 16)           myenergi Ltd\r
+                               Church View Business Centre, Binbrook\r
+                               Market Rasen  Lincolnshire  LN8 6BY\r
+                               GB\r
+\r
+48-06-2B   (hex)               Private\r
+48062B     (base 16)           Private\r
+\r
+B0-A7-B9   (hex)               TP-Link Corporation Limited\r
+B0A7B9     (base 16)           TP-Link Corporation Limited\r
+                               Room 901,9/F.New East Ocean Centre, 9 Science Museum Road\r
+                                Tsim Sha Tsui  Kowloon  999077\r
+                               HK\r
+\r
+6C-5A-B0   (hex)               TP-Link Corporation Limited\r
+6C5AB0     (base 16)           TP-Link Corporation Limited\r
+                               Room 901,9/F.New East Ocean Centre, 9 Science Museum Road\r
+                                Tsim Sha Tsui  Kowloon  999077\r
+                               HK\r
+\r
+4C-F5-DC   (hex)               Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+4CF5DC     (base 16)           Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+                               No.555 Qianmo Road\r
+                               Hangzhou  Zhejiang  310052\r
+                               CN\r
+\r
+60-E6-F0   (hex)               Wistron Neweb Corporation\r
+60E6F0     (base 16)           Wistron Neweb Corporation\r
+                               No.20,Park Avenue II,Hsinchu Science Park\r
+                               Hsin-Chu  R.O.C.  308\r
+                               TW\r
+\r
+20-1F-3B   (hex)               Google, Inc.\r
+201F3B     (base 16)           Google, Inc.\r
+                               1600 Amphitheatre Parkway\r
+                               Mountain View  CA  94043\r
+                               US\r
+\r
+B8-25-B5   (hex)               Trakm8 Ltd\r
+B825B5     (base 16)           Trakm8 Ltd\r
+                               4 Roman Park, Roman Way\r
+                               Coleshill   West Midlands  B46 1HG\r
+                               GB\r
+\r
+20-D2-76   (hex)               ITEL MOBILE LIMITED\r
+20D276     (base 16)           ITEL MOBILE LIMITED\r
+                               RM B3 & B4 BLOCK B, KO FAI INDUSTRIAL BUILDING  NO.7 KO FAI ROAD, YAU TONG, KLN, H.K\r
+                               Hong Kong  KOWLOON  999077\r
+                               HK\r
+\r
+08-A8-42   (hex)               Huawei Device Co., Ltd.\r
+08A842     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-C0-E1-BE   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
-C0E1BE     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
-                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
-                               Dongguan    523808\r
+C8-F5-D6   (hex)               IEEE Registration Authority\r
+C8F5D6     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+40-58-99   (hex)               Logitech Far East\r
+405899     (base 16)           Logitech Far East\r
+                               #2 Creation Rd. 4,\r
+                               Hsinchu    300\r
+                               TW\r
+\r
+8C-4D-EA   (hex)               Cerio Corporation\r
+8C4DEA     (base 16)           Cerio Corporation\r
+                               4F.-3., No.192, Sec. 2, Zhongxing Rd., Xindian Dist.\r
+                               New Taipei City    231\r
+                               TW\r
+\r
+98-43-FA   (hex)               Intel Corporate\r
+9843FA     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+94-AA-0A   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+94AA0A     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
                                CN\r
 \r
-88-E0-56   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
-88E056     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+7C-F4-62   (hex)               BEIJING HUAWOO TECHNOLOGIES CO.LTD\r
+7CF462     (base 16)           BEIJING HUAWOO TECHNOLOGIES CO.LTD\r
+                               A411-3, floor 3, block A, 9 Shangdi 3rd Street, Haidian District, Beijing\r
+                               beijing    100094\r
+                               CN\r
+\r
+04-B9-E3   (hex)               Samsung Electronics Co.,Ltd\r
+04B9E3     (base 16)           Samsung Electronics Co.,Ltd\r
+                               129, Samsung-ro, Youngtongl-Gu\r
+                               Suwon  Gyeonggi-Do  16677\r
+                               KR\r
+\r
+C4-5E-5C   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C45E5C     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
                                Dongguan    523808\r
                                CN\r
 \r
+E8-5C-0A   (hex)               Cisco Systems, Inc\r
+E85C0A     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+70-B9-50   (hex)               Texas Instruments\r
+70B950     (base 16)           Texas Instruments\r
+                               12500 TI Blvd\r
+                               Dallas  TX  75243\r
+                               US\r
+\r
+D0-9F-D9   (hex)               IEEE Registration Authority\r
+D09FD9     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+A0-B0-86   (hex)               Hirschmann Automation and Control GmbH\r
+A0B086     (base 16)           Hirschmann Automation and Control GmbH\r
+                               Stuttgarter Straße 45-51\r
+                               Neckartenzlingen    D-72654\r
+                               DE\r
+\r
+30-B3-46   (hex)               CJSC NORSI-TRANS\r
+30B346     (base 16)           CJSC NORSI-TRANS\r
+                               B.Novodmitrovskaya, 12/15 floor 2 r. 36\r
+                               Moscow  MOSCOW  127015\r
+                               RU\r
+\r
+20-C1-9B   (hex)               Intel Corporate\r
+20C19B     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+2C-6D-C1   (hex)               Intel Corporate\r
+2C6DC1     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+00-FA-B6   (hex)               Kontakt Micro-Location Sp z o.o.\r
+00FAB6     (base 16)           Kontakt Micro-Location Sp z o.o.\r
+                               Stoczniowcow 3\r
+                               Krakow    30-709\r
+                               PL\r
+\r
+54-C2-50   (hex)               Iskratel d.o.o.\r
+54C250     (base 16)           Iskratel d.o.o.\r
+                               Ljubljanska cesta 24a\r
+                               Kranj    4000\r
+                               SI\r
+\r
+00-0B-3A   (hex)               PESA\r
+000B3A     (base 16)           PESA\r
+                               103 Quality Circle, Suite 210\r
+                               Huntsville  AL  35806\r
+                               US\r
+\r
+5C-E4-2A   (hex)               Intel Corporate\r
+5CE42A     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+18-74-E2   (hex)               IEEE Registration Authority\r
+1874E2     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+F0-C8-14   (hex)               SHENZHEN BILIAN ELECTRONIC CO.,LTD\r
+F0C814     (base 16)           SHENZHEN BILIAN ELECTRONIC CO.,LTD\r
+                               NO.268? Fuqian Rd, Jutang community, Guanlan Town, Longhua New district\r
+                               shenzhen  guangdong  518000\r
+                               CN\r
+\r
+D0-17-69   (hex)               Murata Manufacturing Co., Ltd.\r
+D01769     (base 16)           Murata Manufacturing Co., Ltd.\r
+                               1-10-1, Higashikotari\r
+                               Nagaokakyo-shi  Kyoto  617-8555\r
+                               JP\r
+\r
+CC-3A-DF   (hex)               Neptune Technology Group Inc.\r
+CC3ADF     (base 16)           Neptune Technology Group Inc.\r
+                               1600 AL Highway 229 S\r
+                               Tallassee  AL  36078\r
+                               US\r
+\r
+A8-55-6A   (hex)               3S System Technology Inc.\r
+A8556A     (base 16)           3S System Technology Inc.\r
+                               6F, No. 5, Ln. 16, Sec. 2, Sichuan Rd., Banqiao Dist.,\r
+                               New Taipei City    220620\r
+                               TW\r
+\r
+68-EC-8A   (hex)               Private\r
+68EC8A     (base 16)           Private\r
+\r
 F8-D0-27   (hex)               Seiko Epson Corporation\r
 F8D027     (base 16)           Seiko Epson Corporation\r
                                2070 Kotobuki Koaka\r
@@ -107768,12 +108563,6 @@ DC48B2     (base 16)         Baraja Pty. Ltd.
                                NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
                                CN\r
 \r
-10-12-B4   (hex)               SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-1012B4     (base 16)           SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
-                               CHENGDU  SICHUAN  611330\r
-                               CN\r
-\r
 B8-2C-A0   (hex)               Resideo\r
 B82CA0     (base 16)           Resideo\r
                                2 Corporate Center Dr.\r
@@ -107894,12 +108683,6 @@ B8599F     (base 16)         Mellanox Technologies, Inc.
                                Fürth  Deutschlang  90766\r
                                DE\r
 \r
-04-6B-25   (hex)               SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-046B25     (base 16)           SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
-                               CHENGDU  SICHUAN  611330\r
-                               CN\r
-\r
 98-D3-E7   (hex)               Netafim L\r
 98D3E7     (base 16)           Netafim L\r
                                Kibutz Magal\r
@@ -107930,12 +108713,6 @@ F063F9     (base 16)         HUAWEI TECHNOLOGIES CO.,LTD
                                Xinzhuang Dist., New Taipei City    24255\r
                                TW\r
 \r
-14-69-A2   (hex)               SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-1469A2     (base 16)           SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
-                               CHENGDU  SICHUAN  611330\r
-                               CN\r
-\r
 54-80-28   (hex)               Hewlett Packard Enterprise\r
 548028     (base 16)           Hewlett Packard Enterprise\r
                                8000 Foothills Blvd.\r
@@ -110786,12 +111563,6 @@ B02628     (base 16)         Broadcom Limited
                                Dallas  TX  75243\r
                                US\r
 \r
-68-26-2A   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-68262A     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 E8-DE-8E   (hex)               Integrated Device Technology (Malaysia) Sdn. Bhd.\r
 E8DE8E     (base 16)           Integrated Device Technology (Malaysia) Sdn. Bhd.\r
                                Phase 3, Bayan Lepas FIZ\r
@@ -110816,12 +111587,6 @@ AC202E     (base 16)         Hitron Technologies. Inc
                                Hsin-chu  Taiwan  300\r
                                TW\r
 \r
-9C-32-A9   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-9C32A9     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 1C-5A-0B   (hex)               Tegile Systems\r
 1C5A0B     (base 16)           Tegile Systems\r
                                7999 Gateway Blvd Suite 120\r
@@ -111020,12 +111785,6 @@ E8D11B     (base 16)         ASKEY COMPUTER CORP
                                NEW TAIPEI  TAIWAN  23585\r
                                TW\r
 \r
-B8-22-4F   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-B8224F     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 98-00-C1   (hex)               GuangZhou CREATOR Technology Co.,Ltd.(CHINA)\r
 9800C1     (base 16)           GuangZhou CREATOR Technology Co.,Ltd.(CHINA)\r
                                Level 3,Blg 6,No 9 Keji Yuan,LanYusi St,\r
@@ -111224,12 +111983,6 @@ C87324     (base 16)          Sow Cheng Technology Co. Ltd.
                                Hui Zhou  Guang Dong  516006\r
                                CN\r
 \r
-90-86-74   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-908674     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 90-17-11   (hex)               Hagenuk Marinekommunikation GmbH\r
 901711     (base 16)           Hagenuk Marinekommunikation GmbH\r
                                Hamburger Chaussee 25\r
@@ -111656,12 +112409,6 @@ FCECDA     (base 16)         Ubiquiti Networks Inc.
                                Zhubei City  Hsinchu County  30265\r
                                TW\r
 \r
-44-BA-46   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-44BA46     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 E0-7C-13   (hex)               zte corporation\r
 E07C13     (base 16)           zte corporation\r
                                12/F.,zte R&D building ,kejinan Road,Shenzhen,P.R.China\r
@@ -112868,12 +113615,6 @@ D8EB97     (base 16)         TRENDnet, Inc.
                                Zhongshan  Guangdong  528437\r
                                CN\r
 \r
-64-3A-B1   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-643AB1     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 00-1B-FE   (hex)               Zavio Inc.\r
 001BFE     (base 16)           Zavio Inc.\r
                                No.1,Lising 1st Rd. Science Based Industrial Park,\r
@@ -112916,12 +113657,6 @@ D8EB97     (base 16)         TRENDnet, Inc.
                                Lawrenceville  GA  30044\r
                                US\r
 \r
-80-48-A5   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-8048A5     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,TianYi International Hotel\r
-                               Chengdu  Sichuan  61000\r
-                               CN\r
-\r
 68-3E-34   (hex)               MEIZU Technology Co., Ltd.\r
 683E34     (base 16)           MEIZU Technology Co., Ltd.\r
                                MEIZU Tech Bldg., Technology & Innovation Coast\r
@@ -130484,12 +131219,6 @@ A07332     (base 16)         Cashmaster International Limited
                                Palo Alto  CA  94303\r
                                US\r
 \r
-00-0C-04   (hex)               Tecnova\r
-000C04     (base 16)           Tecnova\r
-                               1486 St. Paul Ave.\r
-                               Gurnee  Illinois  60031\r
-                               US\r
-\r
 00-0C-01   (hex)               Abatron AG\r
 000C01     (base 16)           Abatron AG\r
                                Lettenstrasse 9\r
@@ -139238,12 +139967,6 @@ D01411     (base 16)         IEEE Registration Authority
                                Landquart    7302\r
                                CH\r
 \r
-00-E5-E4   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-00E5E4     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
-                               Chengdu  Sichuan  611330\r
-                               CN\r
-\r
 E8-13-6E   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
 E8136E     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
@@ -141014,12 +141737,6 @@ A4CEDA     (base 16)         Arcadyan Corporation
                                Hsinchu City  Hsinchu  30071\r
                                TW\r
 \r
-00-C0-6A   (hex)               Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
-00C06A     (base 16)           Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
-                               P.O. BOX 1846\r
-                                   \r
-                               DE\r
-\r
 8C-43-61   (hex)               Hailo Digital Hub GmbH & Co. KG\r
 8C4361     (base 16)           Hailo Digital Hub GmbH & Co. KG\r
                                Lahnstrasse 3a\r
@@ -141398,12 +142115,342 @@ DC87CB     (base 16)               Beijing Perfectek Technologies Co., Ltd.
                                Dongguan    523808\r
                                CN\r
 \r
+00-C0-6A   (hex)               Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
+00C06A     (base 16)           Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
+                               Thüringer Str. 12\r
+                               Kronach - Gundelsdorf  Bavaria  96317\r
+                               DE\r
+\r
+20-1E-88   (hex)               Intel Corporate\r
+201E88     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
 20-CE-2A   (hex)               IEEE Registration Authority\r
 20CE2A     (base 16)           IEEE Registration Authority\r
                                445 Hoes Lane\r
                                Piscataway  NJ  08554\r
                                US\r
 \r
+58-13-D3   (hex)               Gemtek Technology Co., Ltd.\r
+5813D3     (base 16)           Gemtek Technology Co., Ltd.\r
+                               No.15-1 Zhonghua Road\r
+                               Hukou  Hsinchu  30352\r
+                               TW\r
+\r
+00-E5-E4   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+00E5E4     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+14-69-A2   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+1469A2     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+                               CHENGDU  SICHUAN  611330\r
+                               CN\r
+\r
+04-6B-25   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+046B25     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+                               CHENGDU  SICHUAN  611330\r
+                               CN\r
+\r
+10-12-B4   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+1012B4     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+                               CHENGDU  SICHUAN  611330\r
+                               CN\r
+\r
+9C-32-A9   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+9C32A9     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+68-26-2A   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+68262A     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+B8-22-4F   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+B8224F     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+90-86-74   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+908674     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+88-C9-B3   (hex)               IEEE Registration Authority\r
+88C9B3     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+C8-BD-69   (hex)               Samsung Electronics Co.,Ltd\r
+C8BD69     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+64-3A-B1   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+643AB1     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+44-BA-46   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+44BA46     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+A8-76-50   (hex)               Samsung Electronics Co.,Ltd\r
+A87650     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+54-D1-7D   (hex)               Samsung Electronics Co.,Ltd\r
+54D17D     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+60-3A-AF   (hex)               Samsung Electronics Co.,Ltd\r
+603AAF     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+80-48-A5   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+8048A5     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,TianYi International Hotel\r
+                               Chengdu  Sichuan  61000\r
+                               CN\r
+\r
+54-66-F9   (hex)               ConMet\r
+5466F9     (base 16)           ConMet\r
+                               5701 SE Columbia Way\r
+                               Vancouver    WA  98661\r
+                               US\r
+\r
+58-91-53   (hex)               China Mobile IOT Company Limited\r
+589153     (base 16)           China Mobile IOT Company Limited\r
+                               NO.8 Yu Ma Road, NanAn Area\r
+                               Chongqing  Chongqing  401336\r
+                               CN\r
+\r
+9C-5A-81   (hex)               Xiaomi Communications Co Ltd\r
+9C5A81     (base 16)           Xiaomi Communications Co Ltd\r
+                               The Rainbow City of China Resources\r
+                               NO.68, Qinghe Middle Street  Haidian District, Beijing  100085\r
+                               CN\r
+\r
+B8-13-32   (hex)               AMPAK Technology,Inc.\r
+B81332     (base 16)           AMPAK Technology,Inc.\r
+                               3F, No.15-1 Zhonghua Road, Hsinchu Industrail Park, Hukou,\r
+                               Hsinchu  Hsinchu,Taiwan R.O.C.  30352\r
+                               TW\r
+\r
+98-7D-DD   (hex)               China Mobile Group Device Co.,Ltd.\r
+987DDD     (base 16)           China Mobile Group Device Co.,Ltd.\r
+                               32 Xuanwumen West Street,Xicheng District\r
+                               Beijing    100053\r
+                               CN\r
+\r
+44-DB-60   (hex)               Nanjing Baihezhengliu Technology Co., Ltd\r
+44DB60     (base 16)           Nanjing Baihezhengliu Technology Co., Ltd\r
+                               Science and technology innovation center, Shiqiu street, Lishui District\r
+                               Nanjing  Jiangsu  211222\r
+                               CN\r
+\r
+B8-B7-7D   (hex)               Guangdong Transtek Medical Electronics CO.,Ltd\r
+B8B77D     (base 16)           Guangdong Transtek Medical Electronics CO.,Ltd\r
+                               Zone A, No.105 ,Dongli Road,  Torch Development District  Zhongshan ,  CN  528437 \r
+                                Zhongshan  Guangdong  528437\r
+                               CN\r
+\r
+C4-78-A2   (hex)               Huawei Device Co., Ltd.\r
+C478A2     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+9C-9E-71   (hex)               Huawei Device Co., Ltd.\r
+9C9E71     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+0C-9A-3C   (hex)               Intel Corporate\r
+0C9A3C     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+DC-21-48   (hex)               Intel Corporate\r
+DC2148     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+74-CF-00   (hex)               Shenzhen SuperElectron Technology Co.,Ltd.\r
+74CF00     (base 16)           Shenzhen SuperElectron Technology Co.,Ltd.\r
+                               1213-1214, haosheng business center, dongbin road, nanshan street, nanshan district, shenzhen city\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+2C-EA-DC   (hex)               ASKEY COMPUTER CORP\r
+2CEADC     (base 16)           ASKEY COMPUTER CORP\r
+                               10F,No.119,JIANKANG RD,ZHONGHE DIST\r
+                               NEW TAIPEI  TAIWAN  23585\r
+                               TW\r
+\r
+AC-E1-4F   (hex)               Autonomic Controls, Inc.\r
+ACE14F     (base 16)           Autonomic Controls, Inc.\r
+                               28 Kaysal Ct\r
+                               ARMONK  NY  10504\r
+                               US\r
+\r
+AC-97-6C   (hex)               Greenliant\r
+AC976C     (base 16)           Greenliant\r
+                               3970 Freedom Circle, Suite 100\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+38-14-28   (hex)               Dell Inc.\r
+381428     (base 16)           Dell Inc.\r
+                               One Dell Way\r
+                               Round Rock  TX  78682\r
+                               US\r
+\r
+98-49-9F   (hex)               Domo Tactical Communications\r
+98499F     (base 16)           Domo Tactical Communications\r
+                               DTC Fusion 2, 1100 Parkway\r
+                               Whiteley  Hampshire  PO15 7AB\r
+                               GB\r
+\r
+C0-23-8D   (hex)               Samsung Electronics Co.,Ltd\r
+C0238D     (base 16)           Samsung Electronics Co.,Ltd\r
+                               129, Samsung-ro, Youngtongl-Gu\r
+                               Suwon  Gyeonggi-Do  16677\r
+                               KR\r
+\r
+28-11-A8   (hex)               Intel Corporate\r
+2811A8     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+20-CF-AE   (hex)               Cisco Systems, Inc\r
+20CFAE     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+C0-FB-F9   (hex)               IEEE Registration Authority\r
+C0FBF9     (base 16)           IEEE Registration Authority\r
+                               445 Hoes Lane\r
+                               Piscataway  NJ  08554\r
+                               US\r
+\r
+60-9B-B4   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+609BB4     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+7C-27-BC   (hex)               Hui Zhou Gaoshengda Technology Co.,LTD\r
+7C27BC     (base 16)           Hui Zhou Gaoshengda Technology Co.,LTD\r
+                               No.75,Zhongkai High-Tech Development District,Huizhou\r
+                               Hui Zhou  Guangdong  516006\r
+                               CN\r
+\r
+74-5D-68   (hex)               Fiberhome Telecommunication Technologies Co.,LTD\r
+745D68     (base 16)           Fiberhome Telecommunication Technologies Co.,LTD\r
+                               No.5 DongXin Road\r
+                               Wuhan  Hubei  430074\r
+                               CN\r
+\r
+EC-08-E5   (hex)               Motorola Mobility LLC, a Lenovo Company\r
+EC08E5     (base 16)           Motorola Mobility LLC, a Lenovo Company\r
+                               222 West Merchandise Mart Plaza\r
+                               Chicago  IL  60654\r
+                               US\r
+\r
+80-CC-9C   (hex)               NETGEAR\r
+80CC9C     (base 16)           NETGEAR\r
+                               350 East Plumeria Drive\r
+                               San Jose  CA  95134\r
+                               US\r
+\r
+0C-60-46   (hex)               vivo Mobile Communication Co., Ltd.\r
+0C6046     (base 16)           vivo Mobile Communication Co., Ltd.\r
+                               #283,BBK Road\r
+                               Wusha,Chang'An  DongGuan City,Guangdong,  523860\r
+                               CN\r
+\r
+C0-F9-B0   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+C0F9B0     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+14-8C-4A   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+148C4A     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+50-70-97   (hex)               China Mobile Group Device Co.,Ltd.\r
+507097     (base 16)           China Mobile Group Device Co.,Ltd.\r
+                               32 Xuanwumen West Street,Xicheng District\r
+                               Beijing    100053\r
+                               CN\r
+\r
+CC-15-31   (hex)               Intel Corporate\r
+CC1531     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+28-0F-EB   (hex)               LG Innotek\r
+280FEB     (base 16)           LG Innotek\r
+                               26, Hanamsandan 5beon-ro\r
+                               Gwangju  Gwangsan-gu  506-731\r
+                               KR\r
+\r
+4C-D5-77   (hex)               CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+4CD577     (base 16)           CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+                               Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
+                               Chongqing  Chongqing  401332\r
+                               CN\r
+\r
+74-E2-0C   (hex)               Amazon Technologies Inc.\r
+74E20C     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102 \r
+                               Reno  NV  89507\r
+                               US\r
+\r
+00-0C-04   (hex)               Tecnova\r
+000C04     (base 16)           Tecnova\r
+                               2383 N Delany Rd\r
+                               Waukegan  IL  60087-1836\r
+                               US\r
+\r
+10-54-03   (hex)               INTARSO GmbH\r
+105403     (base 16)           INTARSO GmbH\r
+                               Schuchardstr. 3\r
+                               Düsseldorf  NRW  40595\r
+                               DE\r
+\r
 7C-8A-E1   (hex)               COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
 7C8AE1     (base 16)           COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
                                NO. 25, THE 3RD Street KUNSHAN EXPORT PROCESSING ZONE \r
@@ -143042,12 +144089,6 @@ C09AD0     (base 16)         Apple, Inc.
                                Shenzhen   Guangdong  518000\r
                                CN\r
 \r
-C0-1B-23   (hex)               SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-C01B23     (base 16)           SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY,\r
-                               CHENGDU  SICHUAN  611330\r
-                               CN\r
-\r
 B8-C7-4A   (hex)               GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
 B8C74A     (base 16)           GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
                                NO.18 HAIBIN ROAD,\r
@@ -144803,12 +145844,6 @@ E43022     (base 16)         Hanwha Techwin Security Vietnam
                                Seongnam-si  Gyeonggi-do  463-875\r
                                KR\r
 \r
-5C-4A-1F   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-5C4A1F     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 E4-8F-34   (hex)               Vodafone Italia S.p.A.\r
 E48F34     (base 16)           Vodafone Italia S.p.A.\r
                                Via Lorenteggio nr. 240\r
@@ -145196,12 +146231,6 @@ B0ECE1     (base 16)         Private
                                Taipei City  Neihu Dist  248\r
                                TW\r
 \r
-24-8B-E0   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-248BE0     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 00-24-24   (hex)               Ace Axis Limited\r
 002424     (base 16)           Ace Axis Limited\r
                                602 Delta Business Park, Welton Road\r
@@ -145316,12 +146345,6 @@ B4A382     (base 16)         Hangzhou Hikvision Digital Technology Co.,Ltd.
                                Hangzhou  Zhejiang  310052\r
                                CN\r
 \r
-9C-9C-40   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-9C9C40     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 A4-07-B6   (hex)               Samsung Electronics Co.,Ltd\r
 A407B6     (base 16)           Samsung Electronics Co.,Ltd\r
                                #94-1, Imsoo-Dong\r
@@ -146468,12 +147491,6 @@ C0D3C0     (base 16)         Samsung Electronics Co.,Ltd
                                Cupertino  CA  95014\r
                                US\r
 \r
-54-E0-61   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-54E061     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 50-3A-7D   (hex)               AlphaTech PLC Int’l Co., Ltd.\r
 503A7D     (base 16)           AlphaTech PLC Int’l Co., Ltd.\r
                                13F., No.618, Sec. 7, New Taipei Blvd., Xinzhuang Dist., \r
@@ -147026,12 +148043,6 @@ A0E0AF     (base 16)         Cisco Systems, Inc
                                San Jose  CA  94568\r
                                US\r
 \r
-18-75-32   (hex)               SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-187532     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 4C-B8-1C   (hex)               SAM Electronics GmbH\r
 4CB81C     (base 16)           SAM Electronics GmbH\r
                                Behringstr. 120\r
@@ -147257,12 +148268,6 @@ E49E12     (base 16)         FREEBOX SAS
                                HangZhou  ZheJiang  310053\r
                                CN\r
 \r
-FC-37-2B   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-FC372B     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 A4-D9-A4   (hex)               neXus ID Solutions AB\r
 A4D9A4     (base 16)           neXus ID Solutions AB\r
                                Telefonvägen 26\r
@@ -147287,12 +148292,6 @@ CCB0DA     (base 16)         Liteon Technology Corporation
                                New Taipei City  Taiwan  23585\r
                                TW\r
 \r
-7C-CC-1F   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-7CCC1F     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 18-F2-92   (hex)               Shannon Systems\r
 18F292     (base 16)           Shannon Systems\r
                                Suite 1801,Wentong Building,739 Kunming Road, Yangpu, Shanghai\r
@@ -148847,12 +149846,6 @@ D8D43C     (base 16)         Sony Corporation
                                Minato-ku  Tokyo  108-0075\r
                                JP\r
 \r
-D4-41-65   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-D44165     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, \r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 E4-02-9B   (hex)               Intel Corporate\r
 E4029B     (base 16)           Intel Corporate\r
                                Lot 8, Jalan Hi-Tech 2/3\r
@@ -149207,12 +150200,6 @@ A81559     (base 16)         Breathometer, Inc.
                                Heuchelheim  Hessen  35452\r
                                DE\r
 \r
-78-B8-4B   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-78B84B     (base 16)           SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 7C-B0-C2   (hex)               Intel Corporate\r
 7CB0C2     (base 16)           Intel Corporate\r
                                Lot 8, Jalan Hi-Tech 2/3\r
@@ -154103,12 +155090,6 @@ ACC73F     (base 16)         VITSMO CO., LTD.
                                  SEOUL  135-918\r
                                KR\r
 \r
-44-35-6F   (hex)               Neterix\r
-44356F     (base 16)           Neterix\r
-                               The Printworks\r
-                               Chester  Cheshire  CH1 4RN\r
-                               GB\r
-\r
 74-E2-77   (hex)               Vizmonet Pte Ltd\r
 74E277     (base 16)           Vizmonet Pte Ltd\r
                                32,Canberra drive,#05-28\r
@@ -156728,12 +157709,6 @@ F40F9B     (base 16)         WAVELINK
                                Middleton  WI  53562\r
                                US\r
 \r
-AC-7A-42   (hex)               iConnectivity\r
-AC7A42     (base 16)           iConnectivity\r
-                               #21, 1725 30th Ave NE\r
-                               Calgary  Alberta  T2E 7P6\r
-                               CA\r
-\r
 70-0B-C0   (hex)               Dewav Technology Company\r
 700BC0     (base 16)           Dewav Technology Company\r
                                Room 1408, Real Estate Mansion\r
@@ -160943,12 +161918,6 @@ EC6C9F     (base 16)         Chengdu Volans Technology CO.,LTD
                                North Wales  PA  19454\r
                                US\r
 \r
-00-22-89   (hex)               Vandelrande APC inc.\r
-002289     (base 16)           Vandelrande APC inc.\r
-                               1280 Lebourgneuf Blvd.\r
-                               Quebec    G2K 0H1\r
-                               CA\r
-\r
 00-22-7D   (hex)               YE DATA INC.\r
 00227D     (base 16)           YE DATA INC.\r
                                182 Shinko\r
@@ -167231,12 +168200,6 @@ EC6C9F     (base 16)         Chengdu Volans Technology CO.,LTD
                                    224-0034\r
                                JP\r
 \r
-00-08-18   (hex)               Pixelworks, Inc.\r
-000818     (base 16)           Pixelworks, Inc.\r
-                               7700 SW Mohawk Street\r
-                               Tualatin  OR  97062\r
-                               US\r
-\r
 00-08-2A   (hex)               Powerwallz Network Security\r
 00082A     (base 16)           Powerwallz Network Security\r
                                120-13160 Vanier Place,\r
@@ -174104,12 +175067,6 @@ CCAB2C     (base 16)         HUMAX Co., Ltd.
                                Takarazuka  Hyogo  665-0051\r
                                JP\r
 \r
-24-E1-24   (hex)                Xiamen Ursalink Technology Co., Ltd.\r
-24E124     (base 16)            Xiamen Ursalink Technology Co., Ltd.\r
-                               4/F, No. 63-2 Wanghai Road, 2nd Software Park\r
-                               Xiamen  Fujian  361008\r
-                               CN\r
-\r
 24-43-E2   (hex)               DASAN Network Solutions\r
 2443E2     (base 16)           DASAN Network Solutions\r
                                DASAN Tower 8F, 49 Daewangpangyo-ro644beon-gil Bundang-gu\r
@@ -174338,12 +175295,6 @@ D0768F     (base 16)         Calix Inc.
                                San Jose  CA  95131\r
                                US\r
 \r
-1C-FF-59   (hex)               Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-1CFF59     (base 16)           Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
-                               Chengdu  Sichuan  611330\r
-                               CN\r
-\r
 14-13-FB   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
 1413FB     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
@@ -176660,6 +177611,12 @@ ECB4E8     (base 16)         Wistron Mexico SA de CV
                                Kulim  Kedah  09000\r
                                MY\r
 \r
+5C-C8-E3   (hex)               Shintec Hozumi co.ltd.\r
+5CC8E3     (base 16)           Shintec Hozumi co.ltd.\r
+                               neura-machi 3-5-1\r
+                               Miyoshi  Aichi  470-0217\r
+                               JP\r
+\r
 18-BB-41   (hex)               Huawei Device Co., Ltd.\r
 18BB41     (base 16)           Huawei Device Co., Ltd.\r
                                No.2 of Xincheng Road, Songshan Lake Zone\r
@@ -176678,26 +177635,26 @@ ECB4E8     (base 16)                Wistron Mexico SA de CV
                                Dongguan  Guangdong  523808\r
                                CN\r
 \r
-E8-F6-54   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
-E8F654     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+54-F6-E2   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+54F6E2     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
                                Dongguan    523808\r
                                CN\r
 \r
-20-87-EC   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
-2087EC     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+A8-50-81   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+A85081     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
                                Dongguan    523808\r
                                CN\r
 \r
-54-F6-E2   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
-54F6E2     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+E8-F6-54   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+E8F654     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
                                Dongguan    523808\r
                                CN\r
 \r
-A8-50-81   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
-A85081     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+20-87-EC   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+2087EC     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
                                No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
                                Dongguan    523808\r
                                CN\r
@@ -176708,8 +177665,335 @@ A85081     (base 16)                HUAWEI TECHNOLOGIES CO.,LTD
                                Kulim  Kedah  09000\r
                                MY\r
 \r
+08-6A-C5   (hex)               Intel Corporate\r
+086AC5     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
 8C-36-7A   (hex)               Palo Alto Networks\r
 8C367A     (base 16)           Palo Alto Networks\r
                                3000 Tannery Way\r
                                Santa Clara  CA  95054\r
                                US\r
+\r
+1C-FF-59   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+1CFF59     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+                               Chengdu  Sichuan  611330\r
+                               CN\r
+\r
+C0-1B-23   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+C01B23     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY,\r
+                               CHENGDU  SICHUAN  611330\r
+                               CN\r
+\r
+10-1E-DA   (hex)                INGENICO TERMINALS SAS\r
+101EDA     (base 16)            INGENICO TERMINALS SAS\r
+                               28-32 Boulevard de Grenelle\r
+                               PARIS    75015\r
+                               FR\r
+\r
+8C-6A-8D   (hex)               Technicolor CH USA Inc.\r
+8C6A8D     (base 16)           Technicolor CH USA Inc.\r
+                               5030 Sugarloaf Parkway Bldg 6 \r
+                               Lawrenceville  GA  30044\r
+                               US\r
+\r
+68-DD-D9   (hex)               HMD Global Oy\r
+68DDD9     (base 16)           HMD Global Oy\r
+                               Bertel Jungin aukio 9\r
+                               Espoo    02600\r
+                               FI\r
+\r
+3C-19-5E   (hex)               Samsung Electronics Co.,Ltd\r
+3C195E     (base 16)           Samsung Electronics Co.,Ltd\r
+                               #94-1, Imsoo-Dong\r
+                               Gumi  Gyeongbuk  730-350\r
+                               KR\r
+\r
+6C-94-66   (hex)               Intel Corporate\r
+6C9466     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+4C-3B-6C   (hex)               GARO AB\r
+4C3B6C     (base 16)           GARO AB\r
+                               Södergatan 26\r
+                               Gnosjö  Jönköping  33525\r
+                               SE\r
+\r
+FC-37-2B   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+FC372B     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+7C-CC-1F   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+7CCC1F     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+5C-4A-1F   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+5C4A1F     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+24-8B-E0   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+248BE0     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+9C-9C-40   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+9C9C40     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+54-E0-61   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+54E061     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+18-75-32   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+187532     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+78-B8-4B   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+78B84B     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+D4-41-65   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+D44165     (base 16)           Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, \r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+EC-8A-C4   (hex)               Amazon Technologies Inc.\r
+EC8AC4     (base 16)           Amazon Technologies Inc.\r
+                               P.O Box 8102 \r
+                               Reno  NV  89507\r
+                               US\r
+\r
+44-35-6F   (hex)               Neterix Ltd\r
+44356F     (base 16)           Neterix Ltd\r
+                               Viscount House, River Lane\r
+                               Chester  Cheshire  CH4 8RH\r
+                               GB\r
+\r
+00-22-89   (hex)                Vanderlande APC inc.\r
+002289     (base 16)            Vanderlande APC inc.\r
+                               1280 Lebourgneuf Blvd.\r
+                               Quebec    G2K 0H1\r
+                               CA\r
+\r
+50-8A-06   (hex)               Tuya Smart Inc.\r
+508A06     (base 16)           Tuya Smart Inc.\r
+                               160 Greentree Drive, Suite 101\r
+                               Dover  DE  19904\r
+                               US\r
+\r
+D4-08-68   (hex)               Beijing Lanxum Computer Technology CO.,LTD.\r
+D40868     (base 16)           Beijing Lanxum Computer Technology CO.,LTD.\r
+                               3A Floor,BlockB,Technology Fortune Center,No 8 Xueqing Road,Haidian District,\r
+                               Beijing  Beijing  100192\r
+                               CN\r
+\r
+B8-14-5C   (hex)               Huawei Device Co., Ltd.\r
+B8145C     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C8-9D-18   (hex)               Huawei Device Co., Ltd.\r
+C89D18     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+C4-80-25   (hex)               Huawei Device Co., Ltd.\r
+C48025     (base 16)           Huawei Device Co., Ltd.\r
+                               No.2 of Xincheng Road, Songshan Lake Zone\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
+DC-03-98   (hex)               LG Innotek\r
+DC0398     (base 16)           LG Innotek\r
+                               26, Hanamsandan 5beon-ro\r
+                               Gwangju  Gwangsan-gu  506-731\r
+                               KR\r
+\r
+E8-DA-00   (hex)               Kivo Technology, Inc.\r
+E8DA00     (base 16)           Kivo Technology, Inc.\r
+                               218 Main Street, Suite #724\r
+                               Kirkland    98033\r
+                               US\r
+\r
+78-D6-DC   (hex)               Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.\r
+78D6DC     (base 16)           Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.\r
+                               No.19, Gaoxin 4th Road, Wuhan East Lake High-tech Zone, Wuhan\r
+                               Wuhan  Hubei  430000\r
+                               CN\r
+\r
+0C-43-14   (hex)               Silicon Laboratories\r
+0C4314     (base 16)           Silicon Laboratories\r
+                               400 West Cesar Chavez Street\r
+                               Austin  TX  78701\r
+                               US\r
+\r
+F4-C0-2F   (hex)               BlueBite\r
+F4C02F     (base 16)           BlueBite\r
+                               230, Simin-daero\r
+                               Anyang-si  Gyeonggi-do  14067\r
+                               KR\r
+\r
+78-86-B6   (hex)               Shenzhen YOUHUA Technology Co., Ltd\r
+7886B6     (base 16)           Shenzhen YOUHUA Technology Co., Ltd\r
+                               Room 407 Shenzhen University-town Business Park,Lishan Road,Taoyuan Street,Nanshan District\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+CC-B5-D1   (hex)               Beijing Xiaomi Mobile Software Co., Ltd\r
+CCB5D1     (base 16)           Beijing Xiaomi Mobile Software Co., Ltd\r
+                               The Rainbow City Office Building, 68 Qinghe Middle Street Haidian District\r
+                               Beijing  Beijing  100085\r
+                               CN\r
+\r
+24-E1-24   (hex)               Xiamen Milesight IoT Co., Ltd.\r
+24E124     (base 16)           Xiamen Milesight IoT Co., Ltd.\r
+                               4/F, No. 63-2 Wanghai Road, 2nd Software Park\r
+                               Xiamen  Fujian  361008\r
+                               CN\r
+\r
+28-FB-AE   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+28FBAE     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+88-A0-BE   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+88A0BE     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+A4-78-06   (hex)               Cisco Systems, Inc\r
+A47806     (base 16)           Cisco Systems, Inc\r
+                               80 West Tasman Drive\r
+                               San Jose  CA  94568\r
+                               US\r
+\r
+D0-54-75   (hex)               SAVI Controls\r
+D05475     (base 16)           SAVI Controls\r
+                               2420 Tarpley Rd, Suite 205\r
+                               Carrollton  TX  75006\r
+                               US\r
+\r
+08-05-E2   (hex)               Juniper Networks\r
+0805E2     (base 16)           Juniper Networks\r
+                               1133 Innovation Way\r
+                               Sunnyvale  CA  94089\r
+                               US\r
+\r
+B8-D5-6B   (hex)               Mirka Ltd.\r
+B8D56B     (base 16)           Mirka Ltd.\r
+                               Pensalavägen 210\r
+                               Jeppo    66850\r
+                               FI\r
+\r
+B8-A1-4A   (hex)               Raisecom Technology CO.,LTD\r
+B8A14A     (base 16)           Raisecom Technology CO.,LTD\r
+                               No. 11, East Area, No. 10 Block, East Xibeiwang Road\r
+                               Beijing    100094\r
+                               CN\r
+\r
+BC-A3-7F   (hex)               Rail-Mil Sp. z o.o. Sp. K.\r
+BCA37F     (base 16)           Rail-Mil Sp. z o.o. Sp. K.\r
+                               Kosmatki 82\r
+                               Warsaw    03-982\r
+                               PL\r
+\r
+00-08-18   (hex)               Pixelworks, Inc.\r
+000818     (base 16)           Pixelworks, Inc.\r
+                               226 Airport Parkway, Suite 595\r
+                               San Jose  CA  95110\r
+                               US\r
+\r
+94-90-10   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+949010     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+98-F0-83   (hex)               HUAWEI TECHNOLOGIES CO.,LTD\r
+98F083     (base 16)           HUAWEI TECHNOLOGIES CO.,LTD\r
+                               No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+                               Dongguan    523808\r
+                               CN\r
+\r
+8C-64-A2   (hex)               OnePlus Technology (Shenzhen) Co., Ltd\r
+8C64A2     (base 16)           OnePlus Technology (Shenzhen) Co., Ltd\r
+                               18C02, 18C03, 18C04 ,18C05,TAIRAN BUILDING,\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+28-FA-19   (hex)               Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd\r
+28FA19     (base 16)           Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd\r
+                               3/F,A5 Building Zhiyuan Community No.1001,Xueyuan Road Nanshan District\r
+                               Shenzhen  Guangdong  518055\r
+                               CN\r
+\r
+20-3C-C0   (hex)               Beijing Tosee Technology Co., Ltd.\r
+203CC0     (base 16)           Beijing Tosee Technology Co., Ltd.\r
+                               Room S125, 1st Floor, Building 1, No. 9, Keyuan Road, Economic Development Zone, Daxing District\r
+                               beijing    102600 \r
+                               CN\r
+\r
+D8-A0-11   (hex)               WiZ\r
+D8A011     (base 16)           WiZ\r
+                               Unit 1203-5, 12/F, Tower 1, Enterprise Square, 9 Sheung Yuet Road\r
+                               Kowloon Bay  Hong Kong  0000\r
+                               HK\r
+\r
+50-09-E5   (hex)               Drimsys,Inc\r
+5009E5     (base 16)           Drimsys,Inc\r
+                               147, Baumoe-ro\r
+                               Seocho-gu  Seoul  06752\r
+                               KR\r
+\r
+64-B3-79   (hex)               Private\r
+64B379     (base 16)           Private\r
+\r
+28-DF-EB   (hex)               Intel Corporate\r
+28DFEB     (base 16)           Intel Corporate\r
+                               Lot 8, Jalan Hi-Tech 2/3  \r
+                               Kulim  Kedah  09000\r
+                               MY\r
+\r
+88-FC-A6   (hex)               devolo AG\r
+88FCA6     (base 16)           devolo AG\r
+                               Charlottenburger Allee 67\r
+                               Aachen  NRW  52068\r
+                               DE\r
+\r
+AC-7A-42   (hex)               iConnectivity\r
+AC7A42     (base 16)           iConnectivity\r
+                               4620 Manilla Road SE, Unit 58\r
+                               Calgary  Alberta  T2G 4B7\r
+                               CA\r
+\r
+48-9E-BD   (hex)               HP Inc.\r
+489EBD     (base 16)           HP Inc.\r
+                               10300 Energy Dr\r
+                               Spring  TX  77389\r
+                               US\r
index bb59963edb62231090dfbf6dd97b31014cbb59c5..ffc4ae59b837311f39413792d620828f69936e9c 100644 (file)
@@ -4307,12 +4307,6 @@ C00000-CFFFFF     (base 16)              Changzhou Haitu Electronic Technology Co.,Ltd
                                Palmetto Bay  FL  33157\r
                                US\r
 \r
-04-11-19   (hex)               Herrick Tech Labs\r
-700000-7FFFFF     (base 16)            Herrick Tech Labs\r
-                               20201 Century Blvd.\r
-                               Germantown  MD  20874\r
-                               US\r
-\r
 E8-6C-C7   (hex)               Limited Liability Company M.S.Korp\r
 C00000-CFFFFF     (base 16)            Limited Liability Company M.S.Korp\r
                                Mironovskaya st., 33, bldg.26, floor 4, office 5\r
@@ -4325,24 +4319,30 @@ E8-6C-C7   (hex)                Trapeze Switzerland GmbH
                                Neuhausen am Rheinfall  Schaffhausen  8212\r
                                CH\r
 \r
+04-11-19   (hex)               Herrick Tech Labs\r
+700000-7FFFFF     (base 16)            Herrick Tech Labs\r
+                               20201 Century Blvd.\r
+                               Germantown  MD  20874\r
+                               US\r
+\r
 E8-6C-C7   (hex)               Lighthouse EIP\r
 800000-8FFFFF     (base 16)            Lighthouse EIP\r
                                21370 Heywood Avenue\r
                                Lakeville  MN  55044\r
                                US\r
 \r
-E8-6C-C7   (hex)               Koal Software Co., Ltd\r
-400000-4FFFFF     (base 16)            Koal Software Co., Ltd\r
-                               Floor 6, Building 4, Lane 299, Jiangchang West Road, Jing 'an District\r
-                               Shanghai  Shanghai  200436\r
-                               CN\r
-\r
 E8-6C-C7   (hex)               Xirgo Technologies LLC\r
 200000-2FFFFF     (base 16)            Xirgo Technologies LLC\r
                                188 Camino Ruiz\r
                                Camarillo  CA  93012\r
                                US\r
 \r
+E8-6C-C7   (hex)               Koal Software Co., Ltd\r
+400000-4FFFFF     (base 16)            Koal Software Co., Ltd\r
+                               Floor 6, Building 4, Lane 299, Jiangchang West Road, Jing 'an District\r
+                               Shanghai  Shanghai  200436\r
+                               CN\r
+\r
 24-5D-FC   (hex)               Cosmicnode\r
 800000-8FFFFF     (base 16)            Cosmicnode\r
                                Zandstrand\r
@@ -4367,23 +4367,17 @@ B00000-BFFFFF     (base 16)             Annapurna labs
                                Mail box 15123  Haifa  3508409\r
                                IL\r
 \r
-0C-5C-B5   (hex)               The Raymond Corporation\r
-500000-5FFFFF     (base 16)            The Raymond Corporation\r
-                               22 South Canal St\r
-                               Greene  NY  13778\r
-                               US\r
-\r
 60-15-92   (hex)               Zaptec\r
 400000-4FFFFF     (base 16)            Zaptec\r
                                Richard Johnsensgate 4\r
                                Stavanger   Rogaland  N-4021\r
                                NO\r
 \r
-1C-A0-EF   (hex)               Shenzhen Liandian Communication Technology Co.LTD\r
-D00000-DFFFFF     (base 16)            Shenzhen Liandian Communication Technology Co.LTD\r
-                               1307, building A4, workshop 2, LiLang International Jewelry Industrial Park, 31 Bulan Road, xialilang community, Nanwan street, Longgang District\r
-                               Shenzhen  Guangdong  518112\r
-                               CN\r
+0C-5C-B5   (hex)               The Raymond Corporation\r
+500000-5FFFFF     (base 16)            The Raymond Corporation\r
+                               22 South Canal St\r
+                               Greene  NY  13778\r
+                               US\r
 \r
 0C-5C-B5   (hex)               ADI\r
 B00000-BFFFFF     (base 16)            ADI\r
@@ -4391,12 +4385,78 @@ B00000-BFFFFF     (base 16)             ADI
                                Manorville  NY  11949\r
                                US\r
 \r
+1C-A0-EF   (hex)               Shenzhen Liandian Communication Technology Co.LTD\r
+D00000-DFFFFF     (base 16)            Shenzhen Liandian Communication Technology Co.LTD\r
+                               1307, building A4, workshop 2, LiLang International Jewelry Industrial Park, 31 Bulan Road, xialilang community, Nanwan street, Longgang District\r
+                               Shenzhen  Guangdong  518112\r
+                               CN\r
+\r
 1C-A0-EF   (hex)               Wisnu and Supak Co.,Ltd.\r
 100000-1FFFFF     (base 16)            Wisnu and Supak Co.,Ltd.\r
                                102/111-112  Mooban  Sinpattanatanee,, Tessabansongkroh  Road.,     Ladyao,  Jatujak,\r
                                Jatujak  Bangkok Metropolis  10900\r
                                TH\r
 \r
+88-C9-B3   (hex)               Shenzhen MMUI Co.,Ltd\r
+B00000-BFFFFF     (base 16)            Shenzhen MMUI Co.,Ltd\r
+                               Shenzhen MMUI Co.,Ltd\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+88-C9-B3   (hex)               Robert Bosch JuP1\r
+700000-7FFFFF     (base 16)            Robert Bosch JuP1\r
+                               Robert Bosch 1150\r
+                               Juarez  Chihuahua  32557\r
+                               MX\r
+\r
+C8-F5-D6   (hex)               Yarward Electronics  Co., Ltd.\r
+800000-8FFFFF     (base 16)            Yarward Electronics  Co., Ltd.\r
+                               9509 Qinglongshan Street\r
+                               Zibo  Shandong  255089\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               Valeo Interior Controls (Shenzhen) Co.,Ltd\r
+100000-1FFFFF     (base 16)            Valeo Interior Controls (Shenzhen) Co.,Ltd\r
+                               North Junyi Ind. Park, Huaide Vil., Fuyong Town, Baoan Dist.\r
+                               Shenzhen  Guangzhong  518103\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               Dongmengling\r
+800000-8FFFFF     (base 16)            Dongmengling\r
+                               Floor 1, pool-side building, Villa district, Jiuwei Xiange Musical Instrument Co. , Ltd. , Jiuwei community, Hangcheng Street, Bao 'an district\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               Qbic Technology Co., Ltd\r
+200000-2FFFFF     (base 16)            Qbic Technology Co., Ltd\r
+                               26F.-12, No.99, Sec. 1, Xintai 5th Rd., Xizhi Dist.,\r
+                               New Taipei     22175\r
+                               TW\r
+\r
+C8-F5-D6   (hex)               EVOTOR LLC\r
+400000-4FFFFF     (base 16)            EVOTOR LLC\r
+                               Timura Frunze Str., 24\r
+                               Moscow    119021\r
+                               RU\r
+\r
+C0-FB-F9   (hex)               Dongguan Chuan OptoElectronics Limited\r
+200000-2FFFFF     (base 16)            Dongguan Chuan OptoElectronics Limited\r
+                               No.43 Songshui Road,Songmushan Village, Dalang Town\r
+                               Dongguan  Guangdong  523795\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               IVT corporation\r
+600000-6FFFFF     (base 16)            IVT corporation\r
+                               5/F, Zhongguancun Fazhan Building, No 12, Shangdi Xinxi Road, Haidian District, Beijing, 100085, P.R. CHINA\r
+                               Beijing    100085\r
+                               CN\r
+\r
+18-74-E2   (hex)               HANGZHOU ZHOUJU ELECTRONIC TECHNOLOGICAL CO.,LTD \r
+500000-5FFFFF     (base 16)            HANGZHOU ZHOUJU ELECTRONIC TECHNOLOGICAL CO.,LTD \r
+                               Floor 6,A Building, Xianxing Road NO.32,Xianlin Town,Yuhang District\r
+                               Hangzhou  Zhejiang  311122\r
+                               CN\r
+\r
 4C-4B-F9   (hex)               Shenzhen dingsheng technology co., LTD\r
 400000-4FFFFF     (base 16)            Shenzhen dingsheng technology co., LTD\r
                                Floor 3, building 5, kaijeda industrial zone, no.97, huaxing road, langkou community, dalang street, longhua district\r
@@ -5573,9 +5633,6 @@ B00000-BFFFFF     (base 16)               KAGA ELECTRONICS CO.,LTD.
                                Berlin    13127\r
                                DE\r
 \r
-2C-D1-41   (hex)               Private\r
-D00000-DFFFFF     (base 16)            Private\r
-\r
 28-2C-02   (hex)               Shenzhen emb-star technology co. LTD\r
 200000-2FFFFF     (base 16)            Shenzhen emb-star technology co. LTD\r
                                2/f,building C,qinghu science park,qingxiang road,qinghu,longhua new district\r
@@ -8324,18 +8381,18 @@ A00000-AFFFFF     (base 16)             ZHEJIANG HIKAILINK TECHNOLOGY Co., Ltd
                                Guangzhou  Guangdong  510530\r
                                CN\r
 \r
-98-27-82   (hex)               Nanjing BianYu Future Home Technology Co.Ltd\r
-A00000-AFFFFF     (base 16)            Nanjing BianYu Future Home Technology Co.Ltd\r
-                                Longyu Middle Street\r
-                               Beijing  Beijing  100085\r
-                               CN\r
-\r
 98-27-82   (hex)               Wuxi GuoYiHaiJu Technology Co.,Ltd.\r
 900000-9FFFFF     (base 16)            Wuxi GuoYiHaiJu Technology Co.,Ltd.\r
                                Innovation Industrial Park E2-2F\r
                                hefei    230000\r
                                CN\r
 \r
+98-27-82   (hex)               Nanjing BianYu Future Home Technology Co.Ltd\r
+A00000-AFFFFF     (base 16)            Nanjing BianYu Future Home Technology Co.Ltd\r
+                                Longyu Middle Street\r
+                               Beijing  Beijing  100085\r
+                               CN\r
+\r
 98-27-82   (hex)               CATS Power design\r
 800000-8FFFFF     (base 16)            CATS Power design\r
                                144 route des Vernes\r
@@ -8348,17 +8405,23 @@ A00000-AFFFFF     (base 16)             Nanjing BianYu Future Home Technology Co.Ltd
                                Bangalore  Karnataka  560102\r
                                IN\r
 \r
+E8-6C-C7   (hex)               Huaqin Technology Co.,Ltd\r
+700000-7FFFFF     (base 16)            Huaqin Technology Co.,Ltd\r
+                               No. 10 Keyuan Road, Songshan Lake\r
+                               Dongguan  Guangdong  523808\r
+                               CN\r
+\r
 04-11-19   (hex)               Acentury\r
 100000-1FFFFF     (base 16)            Acentury\r
                                120 West Beaver Creek Road, Unit 13\r
                                Richmond Hill  ON  L4B 1L2\r
                                CA\r
 \r
-E8-6C-C7   (hex)               Huaqin Technology Co.,Ltd\r
-700000-7FFFFF     (base 16)            Huaqin Technology Co.,Ltd\r
-                               No. 10 Keyuan Road, Songshan Lake\r
-                               Dongguan  Guangdong  523808\r
-                               CN\r
+E8-6C-C7   (hex)               CoxSpace\r
+A00000-AFFFFF     (base 16)            CoxSpace\r
+                               858ho, Business Support Hub, 815, Daewangpangyo-ro Sujeong-gu\r
+                               Seongnam  Kyeonggi-do  13449\r
+                               KR\r
 \r
 38-B8-EB   (hex)               Sirin Mobile Technologies\r
 700000-7FFFFF     (base 16)            Sirin Mobile Technologies\r
@@ -8366,35 +8429,23 @@ E8-6C-C7   (hex)                Huaqin Technology Co.,Ltd
                                Schaffhausen    8200\r
                                CH\r
 \r
-24-5D-FC   (hex)               CompanyDeep\r
-000000-0FFFFF     (base 16)            CompanyDeep\r
-                               122, Ross Street\r
-                               Cambridge  Cambridgeshire  CB13BU\r
-                               GB\r
-\r
 24-5D-FC   (hex)               TORGOVYY DOM  TEHNOLOGIY LLC\r
 900000-9FFFFF     (base 16)            TORGOVYY DOM  TEHNOLOGIY LLC\r
                                Gospytalnaya 10, ap. 109, village Selyatino, city Naro-Fominsk,\r
                                Moscow  Moscow Region  143345\r
                                RU\r
 \r
-E8-6C-C7   (hex)               CoxSpace\r
-A00000-AFFFFF     (base 16)            CoxSpace\r
-                               858ho, Business Support Hub, 815, Daewangpangyo-ro Sujeong-gu\r
-                               Seongnam  Kyeonggi-do  13449\r
-                               KR\r
-\r
 24-5D-FC   (hex)               ContactProximity Inc\r
 500000-5FFFFF     (base 16)            ContactProximity Inc\r
                                241 Arlington Street #966\r
                                Acton  MA  01720\r
                                US\r
 \r
-F0-23-B9   (hex)               Shenyang Ali Technology Company Limited\r
-D00000-DFFFFF     (base 16)            Shenyang Ali Technology Company Limited\r
-                               No.17-5, Wensu Street\r
-                               Dongling District  Shenyang Liaoning Province  110168\r
-                               CN\r
+24-5D-FC   (hex)               CompanyDeep\r
+000000-0FFFFF     (base 16)            CompanyDeep\r
+                               122, Ross Street\r
+                               Cambridge  Cambridgeshire  CB13BU\r
+                               GB\r
 \r
 24-5D-FC   (hex)               Guangzhou Lango Electronics Technology Co.,Ltd.\r
 600000-6FFFFF     (base 16)            Guangzhou Lango Electronics Technology Co.,Ltd.\r
@@ -8402,6 +8453,12 @@ D00000-DFFFFF     (base 16)              Shenyang Ali Technology Company Limited
                                Guangzhou  Guangdong  510336\r
                                CN\r
 \r
+F0-23-B9   (hex)               Shenyang Ali Technology Company Limited\r
+D00000-DFFFFF     (base 16)            Shenyang Ali Technology Company Limited\r
+                               No.17-5, Wensu Street\r
+                               Dongling District  Shenyang Liaoning Province  110168\r
+                               CN\r
+\r
 0C-5C-B5   (hex)               Hunan Newman Car NetworKing Technology Co.,Ltd\r
 C00000-CFFFFF     (base 16)            Hunan Newman Car NetworKing Technology Co.,Ltd\r
                                128 Lixiang East Road,ChangshaEconomic and Technological Development Zone\r
@@ -8414,6 +8471,12 @@ C00000-CFFFFF     (base 16)              Hunan Newman Car NetworKing Technology Co.,Ltd
                                Shanghai          Shanghai        201135\r
                                CN\r
 \r
+1C-A0-EF   (hex)               Tangshan Liulin Automation Equipment Co., Ltd.\r
+000000-0FFFFF     (base 16)            Tangshan Liulin Automation Equipment Co., Ltd.\r
+                               Building 110-3, No.410 Huoju Road, High-tech Zone\r
+                               Tangshan City  Hebei Province  063000\r
+                               CN\r
+\r
 1C-A0-EF   (hex)               LLC Gagar.In\r
 C00000-CFFFFF     (base 16)            LLC Gagar.In\r
                                Rybnikov Pereulok 1\r
@@ -8426,12 +8489,6 @@ C00000-CFFFFF     (base 16)              LLC Gagar.In
                                Chengdu    610000\r
                                CN\r
 \r
-1C-A0-EF   (hex)               Tangshan Liulin Automation Equipment Co., Ltd.\r
-000000-0FFFFF     (base 16)            Tangshan Liulin Automation Equipment Co., Ltd.\r
-                               Building 110-3, No.410 Huoju Road, High-tech Zone\r
-                               Tangshan City  Hebei Province  063000\r
-                               CN\r
-\r
 1C-A0-EF   (hex)               Leviathan Solutions Ltd.\r
 400000-4FFFFF     (base 16)            Leviathan Solutions Ltd.\r
                                Abel Jeno utca 23\r
@@ -8444,6 +8501,96 @@ C00000-CFFFFF     (base 16)              LLC Gagar.In
                                Shanghai  Minhang District  201103\r
                                CN\r
 \r
+20-CE-2A   (hex)               Intelligraphics\r
+800000-8FFFFF     (base 16)            Intelligraphics\r
+                               11615 Angus Road, Suite #104L\r
+                               Austin  TX  78759\r
+                               US\r
+\r
+2C-D1-41   (hex)               Square Inc.\r
+D00000-DFFFFF     (base 16)            Square Inc.\r
+                               1455 Market St.\r
+                               San Francisco  CA  94103\r
+                               US\r
+\r
+88-C9-B3   (hex)               shenzhen franklin ESS technology CO.,Ltd\r
+200000-2FFFFF     (base 16)            shenzhen franklin ESS technology CO.,Ltd\r
+                               102, 61 Liuxian Rd 2, Baoan Dst., Shenzhen\r
+                               shenzhen    518000\r
+                               CN\r
+\r
+88-C9-B3   (hex)               Cervoz Technology Co; Ltd.\r
+100000-1FFFFF     (base 16)            Cervoz Technology Co; Ltd.\r
+                               8F; No.10, Aly6, Ln.235, Baociao Rd; \r
+                               Sindian Dist.  New Taipei City  23145\r
+                               TW\r
+\r
+C8-F5-D6   (hex)               Oscars Pro\r
+700000-7FFFFF     (base 16)            Oscars Pro\r
+                               A 45, 1st Floor, Sector 4\r
+                               Noida  Uttar Pradesh  201301\r
+                               IN\r
+\r
+C8-F5-D6   (hex)               Pinmicro K K\r
+500000-5FFFFF     (base 16)            Pinmicro K K\r
+                               Kanda Jimbocho, 2-20-13\r
+                               Chiyoda Ku  Tokyo  1010051\r
+                               JP\r
+\r
+D0-9F-D9   (hex)               Shenzhen eloT Technology Co.,Ltd\r
+D00000-DFFFFF     (base 16)            Shenzhen eloT Technology Co.,Ltd\r
+                               North Wing of 2/F, Block 2, Viseen Technology & Business Park, No.43 Gaoxin South Ring Road\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               Tiandi(Changzhou) Automation Co., Ltd.\r
+A00000-AFFFFF     (base 16)            Tiandi(Changzhou) Automation Co., Ltd.\r
+                               Tiandi(Changzhou) Automation Co., Ltd.\r
+                               Changzhou  Jiangsu  213015\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               Navitas Digital Safety Ltd\r
+E00000-EFFFFF     (base 16)            Navitas Digital Safety Ltd\r
+                               1ST FLOOR, 13  PHOENIX PARK \r
+                               COALVILLE  Leicestershire  LE673HB\r
+                               GB\r
+\r
+D0-9F-D9   (hex)               Poten (Shanghai) Technology Co.,Ltd.\r
+400000-4FFFFF     (base 16)            Poten (Shanghai) Technology Co.,Ltd.\r
+                               Rm.B,6th Fl., No.5, Caoxi Rd.251\r
+                               Shanghai  Shanghai  200235\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Raymax Technology Ltd.\r
+700000-7FFFFF     (base 16)            Raymax Technology Ltd.\r
+                               604, Building D, No.1001 Wen Yi Xi Road\r
+                               Hangzhou  China  310012\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Queclink Wireless Solutions Co., Ltd.\r
+800000-8FFFFF     (base 16)            Queclink Wireless Solutions Co., Ltd.\r
+                               No.30, Lane 500, Xinlong Road, Minhang District\r
+                               Shanghai    201101\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+C00000-CFFFFF     (base 16)            Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+                               Newland Science & Technology Park, No.1 Rujiang West Rd,Mawei,Fuzhou, P.R.China\r
+                               Fuzhou    350015\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Lemei Intelligent IOT (Shenzhen) Co., Ltd\r
+000000-0FFFFF     (base 16)            Lemei Intelligent IOT (Shenzhen) Co., Ltd\r
+                               #1101, Building #1, Yishang Sanwei Inductry Park, Zhongwu, Hangcheng Street, Baoan District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+18-74-E2   (hex)               Kano Computing Limited\r
+800000-8FFFFF     (base 16)            Kano Computing Limited\r
+                               Unit 12.1 - 12.2, 11-29 Fashion Street\r
+                               London    E1 6PX\r
+                               GB\r
+\r
 20-85-93   (hex)               UNILUMIN GROUP CO.,LTD\r
 300000-3FFFFF     (base 16)            UNILUMIN GROUP CO.,LTD\r
                                No.112 Yongfu Rd.,BaoanDistrict,\r
@@ -10319,12 +10466,6 @@ A4-58-0F   (hex)               Ksenia Security srl
                                Salford    M5 4TH\r
                                GB\r
 \r
-7C-CB-E2   (hex)               Aplex Technology Inc.\r
-E00000-EFFFFF     (base 16)            Aplex Technology Inc.\r
-                               2nd Floor,Tower3,District5,HongHuaLing industrial park,  Nanshan District\r
-                               Shenzhen  Guangdong  518055\r
-                               CN\r
-\r
 24-4E-7B   (hex)               Nanjing Wanlida Technology Co., Ltd.\r
 700000-7FFFFF     (base 16)            Nanjing Wanlida Technology Co., Ltd.\r
                                Wanlida Industry Zone, Nanjing County\r
@@ -12113,12 +12254,6 @@ D0-14-11   (hex)               Video Security, Inc.
                                Kaohsiung, Taiwan, R.O.C.  Kaohsiung City  807\r
                                TW\r
 \r
-30-49-50   (hex)               Xio Research, Inc\r
-D00000-DFFFFF     (base 16)            Xio Research, Inc\r
-                               405 Lexington Avenue, Suite 3504\r
-                               New York  NY  10174\r
-                               US\r
-\r
 D0-14-11   (hex)               Realwave Inc.\r
 700000-7FFFFF     (base 16)            Realwave Inc.\r
                                5857 Owens Avenue, Suite 300\r
@@ -12485,10 +12620,10 @@ D00000-DFFFFF     (base 16)           SCAIME
                                JUVIGNY  Select State  74100\r
                                FR\r
 \r
-98-27-82   (hex)               SHENZHEN HEROFUN BIO-TECH CO., LTD\r
-000000-0FFFFF     (base 16)            SHENZHEN HEROFUN BIO-TECH CO., LTD\r
-                               7001B, 7th Floor, LaoBing Building, East Block 2, No. 3012 XingYe Road, BaoAn District\r
-                               Shenzhen    518100\r
+44-6F-D8   (hex)               Anhui GuDao Tech\r
+600000-6FFFFF     (base 16)            Anhui GuDao Tech\r
+                               Dangtu Qingshanhe\r
+                               MaAnShan  AnHui  243000\r
                                CN\r
 \r
 44-6F-D8   (hex)               Annapurna labs\r
@@ -12497,10 +12632,10 @@ D00000-DFFFFF     (base 16)           SCAIME
                                Mail box 15123  Haifa  3508409\r
                                IL\r
 \r
-44-6F-D8   (hex)               Anhui GuDao Tech\r
-600000-6FFFFF     (base 16)            Anhui GuDao Tech\r
-                               Dangtu Qingshanhe\r
-                               MaAnShan  AnHui  243000\r
+98-27-82   (hex)               SHENZHEN HEROFUN BIO-TECH CO., LTD\r
+000000-0FFFFF     (base 16)            SHENZHEN HEROFUN BIO-TECH CO., LTD\r
+                               7001B, 7th Floor, LaoBing Building, East Block 2, No. 3012 XingYe Road, BaoAn District\r
+                               Shenzhen    518100\r
                                CN\r
 \r
 98-27-82   (hex)               RayTron, INC.\r
@@ -12533,11 +12668,11 @@ D00000-DFFFFF     (base 16)           Thorlabs GmbH
                                Burbank  CA  91505\r
                                US\r
 \r
-04-11-19   (hex)               Nuance Hearing Ltd.\r
-D00000-DFFFFF     (base 16)            Nuance Hearing Ltd.\r
-                               Raoul Wallenberg 24, Building A1, Floor 3\r
-                               Tel Aviv    6971920\r
-                               IL\r
+04-11-19   (hex)               CyOne Security AG\r
+A00000-AFFFFF     (base 16)            CyOne Security AG\r
+                               Hinterbergstrasse 18\r
+                               Steinhausen  Zug  6312\r
+                               CH\r
 \r
 04-11-19   (hex)               SUZHOU RIBAO TECHNOLOGY CO.,LTD.\r
 300000-3FFFFF     (base 16)            SUZHOU RIBAO TECHNOLOGY CO.,LTD.\r
@@ -12545,11 +12680,11 @@ D00000-DFFFFF     (base 16)           Nuance Hearing Ltd.
                                SUZHOU  JIANGSU  215133\r
                                CN\r
 \r
-04-11-19   (hex)               CyOne Security AG\r
-A00000-AFFFFF     (base 16)            CyOne Security AG\r
-                               Hinterbergstrasse 18\r
-                               Steinhausen  Zug  6312\r
-                               CH\r
+04-11-19   (hex)               Nuance Hearing Ltd.\r
+D00000-DFFFFF     (base 16)            Nuance Hearing Ltd.\r
+                               Raoul Wallenberg 24, Building A1, Floor 3\r
+                               Tel Aviv    6971920\r
+                               IL\r
 \r
 E8-6C-C7   (hex)               Annapurna labs\r
 E00000-EFFFFF     (base 16)            Annapurna labs\r
@@ -12599,24 +12734,12 @@ C00000-CFFFFF     (base 16)           PSS Co., Ltd
                                New Taipei City  ???  235\r
                                TW\r
 \r
-0C-5C-B5   (hex)               Annapurna labs\r
-400000-4FFFFF     (base 16)            Annapurna labs\r
-                               Matam Scientific Industries Center,   Building 8.2\r
-                               Mail box 15123  Haifa  3508409\r
-                               IL\r
-\r
 60-15-92   (hex)               RTDS Technologies Inc.\r
 100000-1FFFFF     (base 16)            RTDS Technologies Inc.\r
                                100-150 Innovation Drive\r
                                Winnipeg  Manitoba  R3T 2E1\r
                                CA\r
 \r
-60-15-92   (hex)               Annapurna labs\r
-E00000-EFFFFF     (base 16)            Annapurna labs\r
-                               Matam Scientific Industries Center,   Building 8.2\r
-                               Mail box 15123  Haifa  3508409\r
-                               IL\r
-\r
 60-15-92   (hex)               JIANGSU SUNFY TECHNOLOGIES HOLDING CO.,LTD.\r
 900000-9FFFFF     (base 16)            JIANGSU SUNFY TECHNOLOGIES HOLDING CO.,LTD.\r
                                Building 6, No. 1088, Jiangcheng Road, Sutong Technology Industrial Park\r
@@ -12629,6 +12752,18 @@ E00000-EFFFFF     (base 16)            Annapurna labs
                                Kaohsiung City  Taiwan  807\r
                                TW\r
 \r
+60-15-92   (hex)               Annapurna labs\r
+E00000-EFFFFF     (base 16)            Annapurna labs\r
+                               Matam Scientific Industries Center,   Building 8.2\r
+                               Mail box 15123  Haifa  3508409\r
+                               IL\r
+\r
+0C-5C-B5   (hex)               Annapurna labs\r
+400000-4FFFFF     (base 16)            Annapurna labs\r
+                               Matam Scientific Industries Center,   Building 8.2\r
+                               Mail box 15123  Haifa  3508409\r
+                               IL\r
+\r
 0C-5C-B5   (hex)               Shenzhen C & D Electronics Co., Ltd.\r
 800000-8FFFFF     (base 16)            Shenzhen C & D Electronics Co., Ltd.\r
                                9th FIoor, Building 9, No.1 Qingxiang road, BaoNeng Science and TechnoIogy Industrial Park, Longhua New District\r
@@ -12641,12 +12776,6 @@ E00000-EFFFFF     (base 16)            Annapurna labs
                                7/F, Unify Commercial & Ind. Bldg., 31 Tai Yip Street, Kwun Tong  Hong Kong  999077\r
                                HK\r
 \r
-0C-5C-B5   (hex)               Colordeve International\r
-900000-9FFFFF     (base 16)            Colordeve International\r
-                               601, block B, Logistics Park, Yihong Road, Yantian village, Fenggang Town, DG, GD, China\r
-                               Dongguan City    523702\r
-                               CN\r
-\r
 0C-5C-B5   (hex)               Energybox Limited\r
 700000-7FFFFF     (base 16)            Energybox Limited\r
                                8/F., Green 18, HK Science Park\r
@@ -12659,12 +12788,114 @@ E00000-EFFFFF     (base 16)          Annapurna labs
                                NEW TAIPEI CITY  TAIWAN  235\r
                                TW\r
 \r
+0C-5C-B5   (hex)               Colordeve International\r
+900000-9FFFFF     (base 16)            Colordeve International\r
+                               601, block B, Logistics Park, Yihong Road, Yantian village, Fenggang Town, DG, GD, China\r
+                               Dongguan City    523702\r
+                               CN\r
+\r
 20-CE-2A   (hex)               Beijing Huadianzhongxin Tech.Co.,Ltd\r
 700000-7FFFFF     (base 16)            Beijing Huadianzhongxin Tech.Co.,Ltd\r
                                Room 318,the 3rd Floorl,Xingtianhaiyuan Building,Xianghuangqi East Rd,Nongda South Rd, Haidian District,Beijing,P.R.C\r
                                Bei Jing    100193\r
                                CN\r
 \r
+20-CE-2A   (hex)               Ariston Thermo s.p.a.\r
+C00000-CFFFFF     (base 16)            Ariston Thermo s.p.a.\r
+                               Via Aristide Merloni 45\r
+                               Fabriano  Ancona  60044\r
+                               IT\r
+\r
+20-CE-2A   (hex)               Jabil\r
+200000-2FFFFF     (base 16)            Jabil\r
+                               10560 Dr M.L.K. Jr St N, St.\r
+                               St. Petersburg    33716\r
+                               US\r
+\r
+88-C9-B3   (hex)               ADOPT NETTECH PVT LTD\r
+000000-0FFFFF     (base 16)            ADOPT NETTECH PVT LTD\r
+                               A - 11, OKHLA INDUSTRIAL AREA, PHASE - I, \r
+                               NEW DELHI  DELHI  110020\r
+                               IN\r
+\r
+7C-CB-E2   (hex)               Aplex Technology Inc.\r
+E00000-EFFFFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+88-C9-B3   (hex)               Gefran Drive & Motion srl\r
+A00000-AFFFFF     (base 16)            Gefran Drive & Motion srl\r
+                               Via Carducci 24\r
+                               Gerenzano (VA)  Varese  21040\r
+                               IT\r
+\r
+C8-F5-D6   (hex)               Jabil\r
+600000-6FFFFF     (base 16)            Jabil\r
+                               10560 Dr M.L.K. Jr St N, St.\r
+                               St. Petersburg    33716\r
+                               US\r
+\r
+C8-F5-D6   (hex)               Volansys technologies pvt ltd\r
+D00000-DFFFFF     (base 16)            Volansys technologies pvt ltd\r
+                               Block A-7th Floor, Safal Profitaire, Corporate Road, Prahaladnagar\r
+                               Ahmedabad  Gujarat  380015\r
+                               IN\r
+\r
+C0-FB-F9   (hex)               HAGUENET\r
+500000-5FFFFF     (base 16)            HAGUENET\r
+                                Nieuwe Parklaan 17\r
+                               The Hague    2597 LA\r
+                               NL\r
+\r
+C0-FB-F9   (hex)               LIXIL Corporation\r
+100000-1FFFFF     (base 16)            LIXIL Corporation\r
+                               2-1-1 Ojima, Koto-ku\r
+                               Tokyo  Select Stat  136-8535\r
+                               JP\r
+\r
+C0-FB-F9   (hex)               SHENZHEN COMIX HST CLOUD COMPUTING CO., LTD.\r
+B00000-BFFFFF     (base 16)            SHENZHEN COMIX HST CLOUD COMPUTING CO., LTD.\r
+                               1408? Qiancheng Commercial Center, No. 5 Haicheng Road, Mabu Community, Xixiang Sub-district, Bao'an District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               SHENZHEN HEQIANG ELECTRONICS LIMITED\r
+300000-3FFFFF     (base 16)            SHENZHEN HEQIANG ELECTRONICS LIMITED\r
+                               ROOM F7, 6TH FLOOR, A1 BUILDING, RED BOX LOFT, NO. 3 SOUTH HUANCHENG ROAD, LONGGANG DISTRICT,\r
+                               SHENZHEN  GUANGDONG  518129\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Carbon Mobile GmbH\r
+500000-5FFFFF     (base 16)            Carbon Mobile GmbH\r
+                               Winterfeldtstr. 21\r
+                               Berlin    10781\r
+                               DE\r
+\r
+D0-9F-D9   (hex)               ENTTEC Pty Ltd.\r
+900000-9FFFFF     (base 16)            ENTTEC Pty Ltd.\r
+                               po box 4051\r
+                               ringwood  vic  3134\r
+                               AU\r
+\r
+D0-9F-D9   (hex)               elecgator bvba\r
+100000-1FFFFF     (base 16)            elecgator bvba\r
+                               Heerbaan, 308\r
+                               Beringen  Limburg  3582\r
+                               BE\r
+\r
+D0-9F-D9   (hex)               Minibems Ltd\r
+E00000-EFFFFF     (base 16)            Minibems Ltd\r
+                               Oxford Point, 19 Oxford Road\r
+                               Bournemouth    BH88GS\r
+                               GB\r
+\r
+30-49-50   (hex)               Merlyn Mind, Inc.\r
+D00000-DFFFFF     (base 16)            Merlyn Mind, Inc.\r
+                               405 Lexington Avenue, Suite 3504\r
+                               New York  NY  10174\r
+                               US\r
+\r
 4C-4B-F9   (hex)               Shandong Linkotech Electronic Co., Ltd.\r
 600000-6FFFFF     (base 16)            Shandong Linkotech Electronic Co., Ltd.\r
                                22nd Floor, Building 2, Aosheng Building, No.1166 Xinyi Street, High-tech Zone\r
@@ -13226,12 +13457,6 @@ D00000-DFFFFF     (base 16)            Elink Technology (Shenzhen) Co., Limited
                                Shenzhen  Guangdong  518101\r
                                CN\r
 \r
-E0-5A-9F   (hex)               Fujian Newland Auto-ID Tech. Co.,Ltd.\r
-800000-8FFFFF     (base 16)            Fujian Newland Auto-ID Tech. Co.,Ltd.\r
-                               Newland Science & Technology Park, No.1 Rujiang West Rd,Mawei,Fuzhou, P.R.China\r
-                               Fuzhou  Fujian  350015\r
-                               CN\r
-\r
 4C-BC-98   (hex)               Charge-Amps AB\r
 000000-0FFFFF     (base 16)            Charge-Amps AB\r
                                GUSTAV III:S BOULEVARD 42, 8TR\r
@@ -16643,18 +16868,18 @@ B00000-BFFFFF     (base 16)           Beijing gpthink technology co.,LTD.
                                Beijing    100070\r
                                CN\r
 \r
-40-11-75   (hex)               disguise Technologies Limited\r
-C00000-CFFFFF     (base 16)            disguise Technologies Limited\r
-                               88-89 Blackfriars Rd\r
-                               London  South Bank  SE1 8HA,\r
-                               GB\r
-\r
 44-6F-D8   (hex)               Global Telecom Engineering, Inc\r
 800000-8FFFFF     (base 16)            Global Telecom Engineering, Inc\r
                                17901 Von Karman Ave, Suite 600\r
                                Irvine  CA  92614\r
                                US\r
 \r
+40-11-75   (hex)               disguise Technologies Limited\r
+C00000-CFFFFF     (base 16)            disguise Technologies Limited\r
+                               88-89 Blackfriars Rd\r
+                               London  South Bank  SE1 8HA,\r
+                               GB\r
+\r
 74-F8-DB   (hex)               Avantree Corporation\r
 900000-9FFFFF     (base 16)            Avantree Corporation\r
                                175 Bernal road Ste 106\r
@@ -16685,12 +16910,6 @@ E00000-EFFFFF     (base 16)            JULIDA LIMITED
                                Philadelphia  PA  19106\r
                                US\r
 \r
-E8-6C-C7   (hex)               Shenzhen Rongda Computer Co.,Ltd\r
-500000-5FFFFF     (base 16)            Shenzhen Rongda Computer Co.,Ltd\r
-                               905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
-                               Longhua District  Shenzhen, Guangdong    518110\r
-                               CN\r
-\r
 E8-6C-C7   (hex)               Hangzhou Lanxum Security Technology Co., Ltd\r
 900000-9FFFFF     (base 16)            Hangzhou Lanxum Security Technology Co., Ltd\r
                                Room 402, Block A, 4th Floor, Building 3, No. 351 changhe Road, Changhe Street, Binjiang District\r
@@ -16715,17 +16934,11 @@ D00000-DFFFFF     (base 16)           Hunan Honestone lntelligence Technology Co.,Ltd
                                Changsha    410007\r
                                CN\r
 \r
-24-5D-FC   (hex)               Dodge\r
-E00000-EFFFFF     (base 16)            Dodge\r
-                               6040 Ponders Court\r
-                               Greenville  SC  29615\r
-                               US\r
-\r
-60-15-92   (hex)               insensiv GmbH\r
-A00000-AFFFFF     (base 16)            insensiv GmbH\r
-                               Auf dem Esch 28\r
-                               Bielefeld  Nordrhein-Westfalen  33619\r
-                               DE\r
+E8-6C-C7   (hex)               Shenzhen Rongda Computer Co.,Ltd\r
+500000-5FFFFF     (base 16)            Shenzhen Rongda Computer Co.,Ltd\r
+                               905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
+                               Longhua District  Shenzhen, Guangdong    518110\r
+                               CN\r
 \r
 00-55-DA   (hex)               Nanoleaf\r
 500000-5FFFFF     (base 16)            Nanoleaf\r
@@ -16733,12 +16946,24 @@ A00000-AFFFFF     (base 16)           insensiv GmbH
                                Toronto  Ontario  M5A 1E1\r
                                CA\r
 \r
+24-5D-FC   (hex)               Dodge\r
+E00000-EFFFFF     (base 16)            Dodge\r
+                               6040 Ponders Court\r
+                               Greenville  SC  29615\r
+                               US\r
+\r
 60-15-92   (hex)               EDA Technology Co.,LTD\r
 200000-2FFFFF     (base 16)            EDA Technology Co.,LTD\r
                                Room 301, Building 24, Shengchuang Enterprise Park,No.1661 Jialuo Road, Jiading District\r
                                Shanghai  Shanghai  201822\r
                                CN\r
 \r
+60-15-92   (hex)               insensiv GmbH\r
+A00000-AFFFFF     (base 16)            insensiv GmbH\r
+                               Auf dem Esch 28\r
+                               Bielefeld  Nordrhein-Westfalen  33619\r
+                               DE\r
+\r
 60-15-92   (hex)               REMOWIRELESS COMMUNICATION INTERNATIONAL CO.,LIMITED\r
 D00000-DFFFFF     (base 16)            REMOWIRELESS COMMUNICATION INTERNATIONAL CO.,LIMITED\r
                                 REMOWIRELESS RM1111,HONGYI BUILDING NO.2158 WANYUAN ROAD\r
@@ -16751,6 +16976,18 @@ D00000-DFFFFF     (base 16)            REMOWIRELESS COMMUNICATION INTERNATIONAL CO.,LIMITE
                                Dubai  United Arab Emirates  33964\r
                                AE\r
 \r
+0C-5C-B5   (hex)               Munters Europe AB\r
+E00000-EFFFFF     (base 16)            Munters Europe AB\r
+                               Borgarfjordsgatan 16\r
+                               Kista    16440\r
+                               SE\r
+\r
+0C-5C-B5   (hex)               HongKong Blossom Limited\r
+200000-2FFFFF     (base 16)            HongKong Blossom Limited\r
+                               B1715,Jiansheng Building,No. 1 Pingji Road, NanWan Street Longgang\r
+                               Shenzhen    518112\r
+                               CN\r
+\r
 1C-A0-EF   (hex)               Sequent AG\r
 300000-3FFFFF     (base 16)            Sequent AG\r
                                Eptingerstrasse 3\r
@@ -16763,24 +17000,144 @@ D00000-DFFFFF     (base 16)          REMOWIRELESS COMMUNICATION INTERNATIONAL CO.,LIMITE
                                Taipei  Taiwan (R.O.C.)  114\r
                                TW\r
 \r
-0C-5C-B5   (hex)               HongKong Blossom Limited\r
-200000-2FFFFF     (base 16)            HongKong Blossom Limited\r
-                               B1715,Jiansheng Building,No. 1 Pingji Road, NanWan Street Longgang\r
-                               Shenzhen    518112\r
-                               CN\r
-\r
-0C-5C-B5   (hex)               Munters Europe AB\r
-E00000-EFFFFF     (base 16)            Munters Europe AB\r
-                               Borgarfjordsgatan 16\r
-                               Kista    16440\r
-                               SE\r
-\r
 1C-A0-EF   (hex)               tec5AG\r
 700000-7FFFFF     (base 16)            tec5AG\r
                                Weisskirchener Strasse 2-6\r
                                Steinbach  Hessen  61449\r
                                DE\r
 \r
+20-CE-2A   (hex)               MeshPlusPlus, Inc.\r
+A00000-AFFFFF     (base 16)            MeshPlusPlus, Inc.\r
+                               935 W. Chestnut St., Suite #505\r
+                               Chicago  IL  60642\r
+                               US\r
+\r
+20-CE-2A   (hex)               LAUDA DR R WOBSER GMBH & CO KG\r
+D00000-DFFFFF     (base 16)            LAUDA DR R WOBSER GMBH & CO KG\r
+                               Pfarrstrasse 41/43\r
+                               Lauda-Koenigshofen    97922\r
+                               DE\r
+\r
+20-CE-2A   (hex)               Rugged Monitoring\r
+900000-9FFFFF     (base 16)            Rugged Monitoring\r
+                               1415 Frank-Carrel, Suite 230\r
+                               Quebec City  Quebec  G1N4N7\r
+                               CA\r
+\r
+20-CE-2A   (hex)               Zaber Technologies Inc.\r
+500000-5FFFFF     (base 16)            Zaber Technologies Inc.\r
+                               #2 - 605 West Kent Ave. N.\r
+                               Vancouver  B.C.  V6P 6T7\r
+                               CA\r
+\r
+20-CE-2A   (hex)               Swarovski Optik KG\r
+B00000-BFFFFF     (base 16)            Swarovski Optik KG\r
+                               Daniel Swarovski Street 70\r
+                               Absam    6067\r
+                               AT\r
+\r
+88-C9-B3   (hex)               Brabender Technologie GmbH & Co, KG\r
+500000-5FFFFF     (base 16)            Brabender Technologie GmbH & Co, KG\r
+                               Kulturstrasse 49\r
+                               Duisburg    47055\r
+                               DE\r
+\r
+20-CE-2A   (hex)               Funkwerk Systems GmbH\r
+E00000-EFFFFF     (base 16)            Funkwerk Systems GmbH\r
+                               Im Funkwerk 5\r
+                               Koelleda    99625\r
+                               DE\r
+\r
+88-C9-B3   (hex)               Hasbro Inc\r
+400000-4FFFFF     (base 16)            Hasbro Inc\r
+                               1027 Newport Ave\r
+                               Pawtucket  RI  02861\r
+                               US\r
+\r
+88-C9-B3   (hex)               Sercomm Corporation.\r
+E00000-EFFFFF     (base 16)            Sercomm Corporation.\r
+                               3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+                               Miao-Lih Hsuan    115\r
+                               TW\r
+\r
+88-C9-B3   (hex)               Divelbiss Corporation\r
+800000-8FFFFF     (base 16)            Divelbiss Corporation\r
+                               9778 Mount Gilead Road\r
+                               Fredericktown  OH  43019\r
+                               US\r
+\r
+88-C9-B3   (hex)               Origins Technology Limited\r
+D00000-DFFFFF     (base 16)            Origins Technology Limited\r
+                               18 Xinzhong St Dushiyangguang4-1106, Dongcheng\r
+                               Beijing    100027\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               Shanghai Mo xiang Network Technology CO.,Ltd\r
+900000-9FFFFF     (base 16)            Shanghai Mo xiang Network Technology CO.,Ltd\r
+                               Room#418-421, ShaHeXiLi, 2-2 XiLi North Road, LiCheng Community, Xili Street, NanShan District\r
+                               Shenzhen  Guangdong  518071\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               United Barcode Systems\r
+B00000-BFFFFF     (base 16)            United Barcode Systems\r
+                               Av. Progres 56, Pol. Ind. els Garrofers\r
+                               Vilassar de Mar  Barcelona  08340\r
+                               ES\r
+\r
+C8-F5-D6   (hex)               Eltako GmbH\r
+C00000-CFFFFF     (base 16)            Eltako GmbH\r
+                               Hofener Straße 54\r
+                               Fellbach  BW  70736\r
+                               DE\r
+\r
+C0-FB-F9   (hex)               SHENZHEN ELSKY TECHNOLOGY CO., LTD\r
+C00000-CFFFFF     (base 16)            SHENZHEN ELSKY TECHNOLOGY CO., LTD\r
+                               1F BUILDING 2# ASIA INDUSTIAL PARK BANTIAN STREET LONGGANG DISTRICT \r
+                               SHENZHEN  GUANGDONG  518000\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               Dropbeats Technology Co., Ltd.\r
+D00000-DFFFFF     (base 16)            Dropbeats Technology Co., Ltd.\r
+                               Room 304, Building 4?Juli Road ? Pudong New District\r
+                               Shanghai  Shanghai  201203\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Elevoc Technology Co., Ltd.\r
+600000-6FFFFF     (base 16)            Elevoc Technology Co., Ltd.\r
+                               5/F,Unit B,Block12,ShenZhenwan Science and Technology Ecological Garden,Nanshan Dist.\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Eurolan Ltd\r
+A00000-AFFFFF     (base 16)            Eurolan Ltd\r
+                               jk. Drujba 1, ul. 5028, do bl. 15\r
+                               Sofia  Sofia (stolitsa)  1592\r
+                               BG\r
+\r
+E0-5A-9F   (hex)               Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+800000-8FFFFF     (base 16)            Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+                               Newland Science & Technology Park, No.1 Rujiang West Rd,Mawei,Fuzhou, P.R.China\r
+                               Fuzhou  Fujian  350015\r
+                               CN\r
+\r
+18-74-E2   (hex)               NextGen RF Design, Inc.\r
+C00000-CFFFFF     (base 16)            NextGen RF Design, Inc.\r
+                               2130 Howard Dr W\r
+                               North Mankato  MN  56003\r
+                               US\r
+\r
+18-74-E2   (hex)               Sartorius Lab Instruments GmbH & Co. KG\r
+100000-1FFFFF     (base 16)            Sartorius Lab Instruments GmbH & Co. KG\r
+                               Otto-Brenner-Straße 20\r
+                               Goettingen    37079\r
+                               DE\r
+\r
+D0-9F-D9   (hex)               Sanken-Densetsu Co.,LTD.\r
+300000-3FFFFF     (base 16)            Sanken-Densetsu Co.,LTD.\r
+                               677 Shimoakasaka-Ohnohara\r
+                               Kawagoe-Shi  Saitama  350-1155\r
+                               JP\r
+\r
 20-85-93   (hex)               Great Lite International\r
 700000-7FFFFF     (base 16)            Great Lite International\r
                                11F., No.207-2, Sec. 3, Beixin Rd., Xindian Dist.,\r
@@ -18866,12 +19223,6 @@ D00000-DFFFFF     (base 16)            Hubei Boyuan Zhijia Network Media Co. Ltd.
                                Wuhan  Hubei  42000\r
                                CN\r
 \r
-78-C2-C0   (hex)               SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-600000-6FFFFF     (base 16)            SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
-                               Chengdu  Sichuan  610000\r
-                               CN\r
-\r
 8C-19-2D   (hex)               Elcon AB\r
 E00000-EFFFFF     (base 16)            Elcon AB\r
                                Hyttrisvagen 27\r
@@ -20894,6 +21245,12 @@ E00000-EFFFFF     (base 16)            SureFlap Ltd
                                Cambridge  Cambridgeshire  CB23 8AR\r
                                GB\r
 \r
+04-11-19   (hex)               CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
+500000-5FFFFF     (base 16)            CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
+                               611, Renbao Building, 32 Baolong Road, Changlong Community, Buji Street, Longgang District\r
+                               Shenzhen  Guangdong  518000\r
+                               CN\r
+\r
 98-27-82   (hex)               KRISTECH Krzysztof Kajstura\r
 C00000-CFFFFF     (base 16)            KRISTECH Krzysztof Kajstura\r
                                Porzeczkowa 12\r
@@ -20906,16 +21263,16 @@ C00000-CFFFFF     (base 16)           KRISTECH Krzysztof Kajstura
                                Beijing  Beijing  100015\r
                                CN\r
 \r
-04-11-19   (hex)               CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
-500000-5FFFFF     (base 16)            CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
-                               611, Renbao Building, 32 Baolong Road, Changlong Community, Buji Street, Longgang District\r
-                               Shenzhen  Guangdong  518000\r
+E8-6C-C7   (hex)               ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
+100000-1FFFFF     (base 16)            ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
+                               Plant Building 5, 106 Xieshi Highway, Shibi 1st Village\r
+                               Guangzhou  GuangDong  511495\r
                                CN\r
 \r
-24-5D-FC   (hex)               Shenzhen Hailuck Electronic Technology CO.,LTD\r
-300000-3FFFFF     (base 16)            Shenzhen Hailuck Electronic Technology CO.,LTD\r
-                               2/F, building 19, Baotian industrial zone, the Third Baotian Road, Bao'an district\r
-                               Shenzhen  GuangDong  518101\r
+04-11-19   (hex)               Haerbin Donglin Technology Co., Ltd.\r
+C00000-CFFFFF     (base 16)            Haerbin Donglin Technology Co., Ltd.\r
+                               Room 2, Floor 1, Unit 6, Building 2,Yuanshi Street 35, Nangang District\r
+                               Haerbin  Heilongjiang  150000\r
                                CN\r
 \r
 04-11-19   (hex)               Bolicom Innovation Technology (BeiJing) Co.,LTD.\r
@@ -20924,10 +21281,10 @@ C00000-CFFFFF     (base 16)           KRISTECH Krzysztof Kajstura
                                Bei Jing    100000\r
                                CN\r
 \r
-04-11-19   (hex)               Haerbin Donglin Technology Co., Ltd.\r
-C00000-CFFFFF     (base 16)            Haerbin Donglin Technology Co., Ltd.\r
-                               Room 2, Floor 1, Unit 6, Building 2,Yuanshi Street 35, Nangang District\r
-                               Haerbin  Heilongjiang  150000\r
+24-5D-FC   (hex)               Shenzhen Hailuck Electronic Technology CO.,LTD\r
+300000-3FFFFF     (base 16)            Shenzhen Hailuck Electronic Technology CO.,LTD\r
+                               2/F, building 19, Baotian industrial zone, the Third Baotian Road, Bao'an district\r
+                               Shenzhen  GuangDong  518101\r
                                CN\r
 \r
 E8-6C-C7   (hex)               MORNSUN Guangzhou Science & Technology Co., Ltd.\r
@@ -20936,12 +21293,6 @@ B00000-BFFFFF     (base 16)            MORNSUN Guangzhou Science & Technology Co., Ltd.
                                GuangZhou  GuangDong   510000\r
                                CN\r
 \r
-E8-6C-C7   (hex)               ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
-100000-1FFFFF     (base 16)            ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
-                               Plant Building 5, 106 Xieshi Highway, Shibi 1st Village\r
-                               Guangzhou  GuangDong  511495\r
-                               CN\r
-\r
 24-5D-FC   (hex)               ONLY\r
 B00000-BFFFFF     (base 16)            ONLY\r
                                1F., No. 16, Ln. 76, Zhongyang N. Rd., Sanchong Dist\r
@@ -20990,12 +21341,30 @@ D00000-DFFFFF     (base 16)           BSU Inc
                                Austin  TX  78754\r
                                US\r
 \r
+1C-A0-EF   (hex)               Atlas Aerospace\r
+900000-9FFFFF     (base 16)            Atlas Aerospace\r
+                               Ulbrokas 19a\r
+                               Riga  Riga  LV-1021\r
+                               LV\r
+\r
 0C-5C-B5   (hex)               Zhengzhou coal machinery hydraulic electric control Co.,Ltd\r
 A00000-AFFFFF     (base 16)            Zhengzhou coal machinery hydraulic electric control Co.,Ltd\r
                                167 Jingkai 9th Street, Zhengzhou Economic Development Zone\r
                                Zhengzhou    45000\r
                                CN\r
 \r
+1C-A0-EF   (hex)               Henrich Electronics Corporation\r
+A00000-AFFFFF     (base 16)            Henrich Electronics Corporation\r
+                               225 Deming Place\r
+                               Westmont    60559\r
+                               US\r
+\r
+1C-A0-EF   (hex)                BMK professional electronics GmbH\r
+B00000-BFFFFF     (base 16)             BMK professional electronics GmbH\r
+                               Werner-von-Siemens-Straße 6\r
+                               Augsburg     86159\r
+                               DE\r
+\r
 1C-A0-EF   (hex)               Nanjing Bilin Intelligent Identification Technology Co.,Ltd\r
 500000-5FFFFF     (base 16)            Nanjing Bilin Intelligent Identification Technology Co.,Ltd\r
                                No.9 Bancang Street\r
@@ -21008,26 +21377,128 @@ A00000-AFFFFF     (base 16)          Zhengzhou coal machinery hydraulic electric control
                                SHENZHEN    518000\r
                                CN\r
 \r
-1C-A0-EF   (hex)                BMK professional electronics GmbH\r
-B00000-BFFFFF     (base 16)             BMK professional electronics GmbH\r
-                               Werner-von-Siemens-Straße 6\r
-                               Augsburg     86159\r
+1C-A0-EF   (hex)               RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
+E00000-EFFFFF     (base 16)            RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
+                               Room 336, No.3, Lane 2288, Zuchongzhi Road, Pudong Area\r
+                               Shanghai  Shanghai  200120\r
+                               CN\r
+\r
+20-CE-2A   (hex)               Annapurna labs\r
+000000-0FFFFF     (base 16)            Annapurna labs\r
+                               Matam Scientific Industries Center,   Building 8.2\r
+                               Mail box 15123  Haifa  3508409\r
+                               IL\r
+\r
+20-CE-2A   (hex)               Cuculus GmbH\r
+300000-3FFFFF     (base 16)            Cuculus GmbH\r
+                               Lindenstr. 9 -11\r
+                               Ilmenau  Thuringia  98693\r
                                DE\r
 \r
-1C-A0-EF   (hex)               Atlas Aerospace\r
-900000-9FFFFF     (base 16)            Atlas Aerospace\r
-                               Ulbrokas 19a\r
-                               Riga  Riga  LV-1021\r
-                               LV\r
+20-CE-2A   (hex)               Annapurna labs\r
+400000-4FFFFF     (base 16)            Annapurna labs\r
+                               Matam Scientific Industries Center,   Building 8.2\r
+                               Mail box 15123  Haifa  3508409\r
+                               IL\r
 \r
-1C-A0-EF   (hex)               Henrich Electronics Corporation\r
-A00000-AFFFFF     (base 16)            Henrich Electronics Corporation\r
-                               225 Deming Place\r
-                               Westmont    60559\r
+20-CE-2A   (hex)               Radarxense BV\r
+600000-6FFFFF     (base 16)            Radarxense BV\r
+                               Kwekerijweg, 2A\r
+                               Zeist  Nederland  3709 JA\r
+                               NL\r
+\r
+78-C2-C0   (hex)               Sichuan Tianyi Comheart Telecom Co.,LTD\r
+600000-6FFFFF     (base 16)            Sichuan Tianyi Comheart Telecom Co.,LTD\r
+                               FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
+                               Chengdu  Sichuan  610000\r
+                               CN\r
+\r
+88-C9-B3   (hex)               Shenzhen Viewsmart Technology Co.,Ltd\r
+C00000-CFFFFF     (base 16)            Shenzhen Viewsmart Technology Co.,Ltd\r
+                               Room 10C?Floor 10,South China Navigation Building, No.7 North Langshan Road,Nanshan District, Shenzhen, China.\r
+                               SHENZHEN    518000\r
+                               CN\r
+\r
+88-C9-B3   (hex)               Hugo Techno\r
+600000-6FFFFF     (base 16)            Hugo Techno\r
+                               F92 Green Park\r
+                               New Delhi  Delhi  110016\r
+                               IN\r
+\r
+88-C9-B3   (hex)               Richbeam (Beijing) Technology Co., Ltd.\r
+900000-9FFFFF     (base 16)            Richbeam (Beijing) Technology Co., Ltd.\r
+                               2608, Tower A, Tianzuo International, No.12, Zhongguancun South Street, Haidian District\r
+                               Beijing  Beijing  100081\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               HENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.\r
+A00000-AFFFFF     (base 16)            HENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.\r
+                               No. 7 Bldg., Yulong Block, Longsheng Road, Optronic Industry Area, Nanyang,Henan,P.R.China\r
+                               Nanyang    473000\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               MEIRYO TECHNICA CORPORATION\r
+000000-0FFFFF     (base 16)            MEIRYO TECHNICA CORPORATION\r
+                               2039-1,Shimoi, Shimoi-cho\r
+                               Owariasahi-city  Aichi  488-0052\r
+                               JP\r
+\r
+C0-FB-F9   (hex)               Minato Advanced Technologies inc\r
+400000-4FFFFF     (base 16)            Minato Advanced Technologies inc\r
+                               4105, Minami Yamata-cho, Tsuzuki-ku,\r
+                               YOKOHAMA  Kanagawa  224-0026\r
+                               JP\r
+\r
+C0-FB-F9   (hex)                LongSung Technology (Shanghai) Co.,Ltd.   \r
+700000-7FFFFF     (base 16)             LongSung Technology (Shanghai) Co.,Ltd.   \r
+                                Room 606, Block B, Bldg. 1, No. 3000 Longdong Avenue., Zhangjiang Hi-Tech Park, Pudong District\r
+                               ShangHai    201203\r
+                               CN\r
+\r
+C8-F5-D6   (hex)               HEITEC AG\r
+E00000-EFFFFF     (base 16)            HEITEC AG\r
+                               Güterbahnhofstrasse 5\r
+                               Erlangen  Please select state  91052\r
+                               DE\r
+\r
+C8-F5-D6   (hex)               BBPOS International Limited\r
+300000-3FFFFF     (base 16)            BBPOS International Limited\r
+                               Suite 1602, Tower 2, Nina Tower, 8 Yeung Uk Road, Tsuen Wan, NT\r
+                               Hong Kong  China  00000\r
+                               HK\r
+\r
+88-C9-B3   (hex)               Fortive Setra-ICG(Tianjin)Co.,Ltd\r
+300000-3FFFFF     (base 16)            Fortive Setra-ICG(Tianjin)Co.,Ltd\r
+                               28 weiwu Road,Micro-electronics Industrial Park,Xiqing District Tianjin,P,R,China\r
+                               Tianjin    300380\r
+                               CN\r
+\r
+C0-FB-F9   (hex)               Xerox Corporation\r
+000000-0FFFFF     (base 16)            Xerox Corporation\r
+                               800 Phillips Rd, Mailstop 0207-2Z\r
+                               Webster  NY  14580\r
                                US\r
 \r
-1C-A0-EF   (hex)               RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
-E00000-EFFFFF     (base 16)            RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
-                               Room 336, No.3, Lane 2288, Zuchongzhi Road, Pudong Area\r
-                               Shanghai  Shanghai  200120\r
+C0-FB-F9   (hex)               zxsolution\r
+900000-9FFFFF     (base 16)            zxsolution\r
+                               nanshan shenzhen\r
+                               shenzhen    518000\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Westar Display Technologies\r
+200000-2FFFFF     (base 16)            Westar Display Technologies\r
+                               4 Research Park Dr\r
+                               St Charles  MO  63304\r
+                               US\r
+\r
+18-74-E2   (hex)               Sansec Technology Co.,Ltd\r
+700000-7FFFFF     (base 16)            Sansec Technology Co.,Ltd\r
+                               Bejing Chaoyang District Guangshun North Street Hostpital No.16 No.2 building 14 room 1406\r
+                               Bejing   Bejing   100102\r
+                               CN\r
+\r
+D0-9F-D9   (hex)               Cablewireless Laboratory Co., Ltd\r
+B00000-BFFFFF     (base 16)            Cablewireless Laboratory Co., Ltd\r
+                               Room 218,  Block E1, Yuanchenxin Building, 12 Yumin Road, Chaoyang District\r
+                               Beijing    100029\r
                                CN\r
index 1322dce12e87066b5f1589ca462c7c6a1159f9bb..b987a916deee771756afbc0f7655bfff83e2f5ec 100644 (file)
@@ -2081,12 +2081,6 @@ F8D000-F8DFFF     (base 16)              Flextronics Canafa Design Services
                                Niemce  lubelskie  21-025\r
                                PL\r
 \r
-70-B3-D5   (hex)               Aplex Technology Inc.\r
-9B1000-9B1FFF     (base 16)            Aplex Technology Inc.\r
-                               2nd Floor,Tower3,District5,HongHuaLing industrial park,  Nanshan District\r
-                               Shenzhen  Guangdong  518055\r
-                               CN\r
-\r
 70-B3-D5   (hex)               Netemera Sp. z o.o.\r
 CA4000-CA4FFF     (base 16)            Netemera Sp. z o.o.\r
                                Ostrobramska 83/1208A\r
@@ -4397,12 +4391,6 @@ D99000-D99FFF     (base 16)              Nilar AB
                                Gävle  Gavleborg  80647\r
                                SE\r
 \r
-70-B3-D5   (hex)               Jabil, Inc.\r
-736000-736FFF     (base 16)            Jabil, Inc.\r
-                               888 Executive Center Dr. W.\r
-                               St.Petersubrg  FL  33702\r
-                               US\r
-\r
 70-B3-D5   (hex)               Power Electronics Espana, S.L.\r
 632000-632FFF     (base 16)            Power Electronics Espana, S.L.\r
                                C/ Leonardo Da Vinci, 24-26\r
@@ -4823,47 +4811,35 @@ B92000-B92FFF     (base 16)             N A Communications LLC
                                TAIPEI    11560\r
                                TW\r
 \r
-70-B3-D5   (hex)               EBZ SysTec GmbH\r
-1FA000-1FAFFF     (base 16)            EBZ SysTec GmbH\r
-                               Bleicherstraße 7\r
-                               Ravensburg  DE    88212\r
-                               DE\r
-\r
 70-B3-D5   (hex)               nexgenwave\r
 5BD000-5BDFFF     (base 16)            nexgenwave\r
                                1209 sicox tower, 484 Dunchon-daero, jungwon-gu\r
                                Sungnam-si  gyeonggi-do  13229\r
                                KR\r
 \r
+70-B3-D5   (hex)               EBZ SysTec GmbH\r
+1FA000-1FAFFF     (base 16)            EBZ SysTec GmbH\r
+                               Bleicherstraße 7\r
+                               Ravensburg  DE    88212\r
+                               DE\r
+\r
 70-B3-D5   (hex)               TRIOPTICS\r
 A11000-A11FFF     (base 16)            TRIOPTICS\r
                                Strandbaddamm 6\r
                                Wedel  Schleswig-Holstein  22880\r
                                DE\r
 \r
-70-B3-D5   (hex)               Lockheed Martin - THAAD\r
-9EE000-9EEFFF     (base 16)            Lockheed Martin - THAAD\r
-                               4800 Bradford Drive\r
-                               Huntsville  AL  35805\r
-                               US\r
-\r
-70-B3-D5   (hex)               TT Group SRL\r
-BD7000-BD7FFF     (base 16)            TT Group SRL\r
-                               Via Pazzano 112\r
-                               Roma  RM  00118\r
-                               IT\r
-\r
 70-B3-D5   (hex)               SIAME\r
 66E000-66EFFF     (base 16)            SIAME\r
                                RUE DES MATHEMATIQUES\r
                                GROMBALIA    8030\r
                                TN\r
 \r
-70-B3-D5   (hex)               Stecomp\r
-EE0000-EE0FFF     (base 16)            Stecomp\r
-                               Bollaarsdijk 11\r
-                               Brielle    3231LA\r
-                               NL\r
+70-B3-D5   (hex)               Lockheed Martin - THAAD\r
+9EE000-9EEFFF     (base 16)            Lockheed Martin - THAAD\r
+                               4800 Bradford Drive\r
+                               Huntsville  AL  35805\r
+                               US\r
 \r
 70-B3-D5   (hex)               Plenty Unlimited Inc\r
 D04000-D04FFF     (base 16)            Plenty Unlimited Inc\r
@@ -4871,30 +4847,42 @@ D04000-D04FFF     (base 16)             Plenty Unlimited Inc
                                South San Francisco  CA  94080\r
                                US\r
 \r
+70-B3-D5   (hex)               TT Group SRL\r
+BD7000-BD7FFF     (base 16)            TT Group SRL\r
+                               Via Pazzano 112\r
+                               Roma  RM  00118\r
+                               IT\r
+\r
 70-B3-D5   (hex)               Aliter Technologies\r
 586000-586FFF     (base 16)            Aliter Technologies\r
                                Turcianska 16\r
                                Bratislava    82109\r
                                SK\r
 \r
+70-B3-D5   (hex)               Stecomp\r
+EE0000-EE0FFF     (base 16)            Stecomp\r
+                               Bollaarsdijk 11\r
+                               Brielle    3231LA\r
+                               NL\r
+\r
 70-B3-D5   (hex)               TORGOVYY DOM  TEHNOLOGIY LLC\r
 7C0000-7C0FFF     (base 16)            TORGOVYY DOM  TEHNOLOGIY LLC\r
                                Gospytalnaya 10, ap. 109, village Selyatino, city Naro-Fominsk,\r
                                Moscow  Moscow Region  143345\r
                                RU\r
 \r
-70-B3-D5   (hex)               Automata GmbH & Co. KG\r
-19D000-19DFFF     (base 16)            Automata GmbH & Co. KG\r
-                               Gewerbering 5\r
-                               Ried  Bavaria  86510\r
-                               DE\r
-\r
 70-B3-D5   (hex)               XJ ELECTRIC CO., LTD.\r
 F26000-F26FFF     (base 16)            XJ ELECTRIC CO., LTD.\r
                                #1298 XUJI AVENUE\r
                                XUCHANG  HENAN  461000\r
                                CN\r
 \r
+70-B3-D5   (hex)               Automata GmbH & Co. KG\r
+19D000-19DFFF     (base 16)            Automata GmbH & Co. KG\r
+                               Gewerbering 5\r
+                               Ried  Bavaria  86510\r
+                               DE\r
+\r
 70-B3-D5   (hex)               Topic Embedded Products B.V.\r
 63D000-63DFFF     (base 16)            Topic Embedded Products B.V.\r
                                Materiaalweg 4\r
@@ -4907,6 +4895,18 @@ F26000-F26FFF     (base 16)              XJ ELECTRIC CO., LTD.
                                Furth  Bavaria  82041\r
                                DE\r
 \r
+70-B3-D5   (hex)               Hubbell Power Systems\r
+DDA000-DDAFFF     (base 16)            Hubbell Power Systems\r
+                               353 Powerville Road\r
+                               Boonton Township  NJ  07005\r
+                               US\r
+\r
+70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
+6D5000-6D5FFF     (base 16)            Potter Electric Signal Co. LLC\r
+                               1609 Park 370 Place\r
+                               Hazelwood  MO  63042\r
+                               US\r
+\r
 70-B3-D5   (hex)               Jiangsu Etern Compamy Limited\r
 DA0000-DA0FFF     (base 16)            Jiangsu Etern Compamy Limited\r
                                No. 1788 fenhu Guo Dao Road, Foho New&High-tech Industrial Development Zone, Wujiang\r
@@ -4931,18 +4931,6 @@ CE0000-CE0FFF     (base 16)              M.S. CONTROL
                                WEST PERTH  WA  6005\r
                                AU\r
 \r
-70-B3-D5   (hex)               Hubbell Power Systems\r
-DDA000-DDAFFF     (base 16)            Hubbell Power Systems\r
-                               353 Powerville Road\r
-                               Boonton Township  NJ  07005\r
-                               US\r
-\r
-70-B3-D5   (hex)               Potter Electric Signal Co. LLC\r
-6D5000-6D5FFF     (base 16)            Potter Electric Signal Co. LLC\r
-                               1609 Park 370 Place\r
-                               Hazelwood  MO  63042\r
-                               US\r
-\r
 70-B3-D5   (hex)               Master Meter Inc.\r
 A9F000-A9FFFF     (base 16)            Master Meter Inc.\r
                                101 Regency Pkwy\r
@@ -4961,11 +4949,11 @@ A9F000-A9FFFF     (base 16)             Master Meter Inc.
                                Helsinki    00130\r
                                FI\r
 \r
-70-B3-D5   (hex)               OMNISENSING PHOTONICS LLC\r
-70D000-70DFFF     (base 16)            OMNISENSING PHOTONICS LLC\r
-                               8015 Four Quarter Road\r
-                               Ellicott City  MD  21043\r
-                               US\r
+70-B3-D5   (hex)               S Labs sp. z o.o.\r
+C53000-C53FFF     (base 16)            S Labs sp. z o.o.\r
+                               Dworska 1a/1u\r
+                               Kraków  Lesser Poland  30-314\r
+                               PL\r
 \r
 70-B3-D5   (hex)               Torion Plasma Corporation\r
 B70000-B70FFF     (base 16)            Torion Plasma Corporation\r
@@ -4973,17 +4961,11 @@ B70000-B70FFF     (base 16)             Torion Plasma Corporation
                                Barrie  Ontario  L4N9S3\r
                                CA\r
 \r
-70-B3-D5   (hex)               Horizon Co., Ltd\r
-69B000-69BFFF     (base 16)            Horizon Co., Ltd\r
-                               1600 Aza-Shironoshita Asahi\r
-                               Shin Asahi-cho  Takashima, Shiga  520-1501\r
-                               JP\r
-\r
-70-B3-D5   (hex)               S Labs sp. z o.o.\r
-C53000-C53FFF     (base 16)            S Labs sp. z o.o.\r
-                               Dworska 1a/1u\r
-                               Kraków  Lesser Poland  30-314\r
-                               PL\r
+70-B3-D5   (hex)               OMNISENSING PHOTONICS LLC\r
+70D000-70DFFF     (base 16)            OMNISENSING PHOTONICS LLC\r
+                               8015 Four Quarter Road\r
+                               Ellicott City  MD  21043\r
+                               US\r
 \r
 70-B3-D5   (hex)               Smart Systems LLC\r
 746000-746FFF     (base 16)            Smart Systems LLC\r
@@ -4997,17 +4979,23 @@ C53000-C53FFF     (base 16)             S Labs sp. z o.o.
                                Radeburg    01471\r
                                DE\r
 \r
+70-B3-D5   (hex)               Leviathan Solutions Ltd.\r
+A69000-A69FFF     (base 16)            Leviathan Solutions Ltd.\r
+                               Abel Jeno utca 23\r
+                               Budapest    1113\r
+                               HU\r
+\r
 70-B3-D5   (hex)               BluB0X Security, Inc.\r
 16D000-16DFFF     (base 16)            BluB0X Security, Inc.\r
                                9 Bartlet Street Suite 334\r
                                Andover  MA  01810\r
                                US\r
 \r
-70-B3-D5   (hex)               Leviathan Solutions Ltd.\r
-A69000-A69FFF     (base 16)            Leviathan Solutions Ltd.\r
-                               Abel Jeno utca 23\r
-                               Budapest    1113\r
-                               HU\r
+70-B3-D5   (hex)               biosilver .co.,ltd\r
+D21000-D21FFF     (base 16)            biosilver .co.,ltd\r
+                               2-14-4, shinyokohama\r
+                               yokohama  kanagawa  2220033\r
+                               JP\r
 \r
 70-B3-D5   (hex)               ACD Elekronik GmbH\r
 D6D000-D6DFFF     (base 16)            ACD Elekronik GmbH\r
@@ -5015,11 +5003,11 @@ D6D000-D6DFFF     (base 16)             ACD Elekronik GmbH
                                Achstetten    88480\r
                                DE\r
 \r
-70-B3-D5   (hex)               biosilver .co.,ltd\r
-D21000-D21FFF     (base 16)            biosilver .co.,ltd\r
-                               2-14-4, shinyokohama\r
-                               yokohama  kanagawa  2220033\r
-                               JP\r
+70-B3-D5   (hex)               Network Integrity Systems\r
+9FF000-9FFFFF     (base 16)            Network Integrity Systems\r
+                               1937 Tate Blvd. SE\r
+                               Hickory  NC  28602\r
+                               US\r
 \r
 70-B3-D5   (hex)               Vemco Sp. z o. o.\r
 D45000-D45FFF     (base 16)            Vemco Sp. z o. o.\r
@@ -5027,12 +5015,138 @@ D45000-D45FFF     (base 16)            Vemco Sp. z o. o.
                                Gdansk    80-435\r
                                PL\r
 \r
-70-B3-D5   (hex)               Network Integrity Systems\r
-9FF000-9FFFFF     (base 16)            Network Integrity Systems\r
-                               1937 Tate Blvd. SE\r
-                               Hickory  NC  28602\r
+70-B3-D5   (hex)               Beijing Xiansheng Technology Co., Ltd\r
+8D6000-8D6FFF     (base 16)            Beijing Xiansheng Technology Co., Ltd\r
+                               Room 02, 102-1 / F, building 32, yard 69, Yanfu Road, Fangshan District\r
+                               Beijing  Beijing  102488\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Subject Link Inc\r
+137000-137FFF     (base 16)            Subject Link Inc\r
+                               9F-1, No. 77, Sec 4. Nanjing E. Rd., SongShan Dist.\r
+                               Taipei City  Taiwan  105406\r
+                               TW\r
+\r
+70-B3-D5   (hex)               Crane-elec. Co., LTD.\r
+1FB000-1FBFFF     (base 16)            Crane-elec. Co., LTD.\r
+                               Tamakushicho-higashi 3-3-97\r
+                               Higashi osaka  OSAKA  5780932\r
+                               JP\r
+\r
+70-B3-D5   (hex)               Jabil\r
+736000-736FFF     (base 16)            Jabil\r
+                               888 Executive Center Dr. W.\r
+                               St.Petersubrg  FL  33702\r
+                               US\r
+\r
+70-B3-D5   (hex)               AudioTEC LLC\r
+33A000-33AFFF     (base 16)            AudioTEC LLC\r
+                               108 Scott Street\r
+                               Ripon  WI  54971\r
+                               US\r
+\r
+70-B3-D5   (hex)               IRT Technologies\r
+D13000-D13FFF     (base 16)            IRT Technologies\r
+                               5580 BOULEVARD THIMENS\r
+                               Saint-Laurent  Quebec  H4R 2K9\r
+                               CA\r
+\r
+70-B3-D5   (hex)               11811347 CANADA Inc.\r
+7E6000-7E6FFF     (base 16)            11811347 CANADA Inc.\r
+                               1215 13th St  SE, Suite 114\r
+                               Calgary  AB  T2G 3J4\r
+                               CA\r
+\r
+70-B3-D5   (hex)               Season Electronics Ltd\r
+BA0000-BA0FFF     (base 16)            Season Electronics Ltd\r
+                               600 Nest Business Park \r
+                               Havant  Hampshire  PO9 5TL\r
+                               GB\r
+\r
+70-B3-D5   (hex)               KST technology\r
+20B000-20BFFF     (base 16)            KST technology\r
+                               KST B/D 4-5, Wiryeseong-daero 12-gil\r
+                               Songpa-gu  Seoul  05636\r
+                               KR\r
+\r
+70-B3-D5   (hex)               Aplex Technology Inc.\r
+9B1000-9B1FFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Santa Barbara Imaging Systems\r
+4E6000-4E6FFF     (base 16)            Santa Barbara Imaging Systems\r
+                               340 Storke Road, Suite 101\r
+                               Goleta  CA  93117\r
+                               US\r
+\r
+70-B3-D5   (hex)               AM General Contractor\r
+2C6000-2C6FFF     (base 16)            AM General Contractor\r
+                               Via Angelo Scarsellini 147\r
+                               Genova  Italy  16149\r
+                               IT\r
+\r
+70-B3-D5   (hex)               ProtoConvert Pty Ltd\r
+EC0000-EC0FFF     (base 16)            ProtoConvert Pty Ltd\r
+                               2 Clyden Court\r
+                               Burwood East  Victoria  3151\r
+                               AU\r
+\r
+70-B3-D5   (hex)               Reflexion Medical\r
+298000-298FFF     (base 16)            Reflexion Medical\r
+                               Reflexion Medical 25841 Industrial Blvd.\r
+                               Hayward  CA  94545\r
+                               US\r
+\r
+70-B3-D5   (hex)               Zumbach Electronic AG\r
+C19000-C19FFF     (base 16)            Zumbach Electronic AG\r
+                               Hauptstrasse 93\r
+                               Orpund  Bern  2552\r
+                               CH\r
+\r
+70-B3-D5   (hex)               Lobaro GmbH\r
+E05000-E05FFF     (base 16)            Lobaro GmbH\r
+                               Stadtdeich 7\r
+                               Hamburg      20097\r
+                               DE\r
+\r
+70-B3-D5   (hex)               LDA Audiotech\r
+685000-685FFF     (base 16)            LDA Audiotech\r
+                               C/Severo Ochoa, 31\r
+                               Malaga  Malaga  29590\r
+                               ES\r
+\r
+70-B3-D5   (hex)               HORIZON.INC\r
+69B000-69BFFF     (base 16)            HORIZON.INC\r
+                               1600 Aza-Shironoshita Asahi\r
+                               Shin Asahi-cho  Takashima, Shiga  520-1501\r
+                               JP\r
+\r
+70-B3-D5   (hex)               aelettronica group srl\r
+A14000-A14FFF     (base 16)            aelettronica group srl\r
+                               via matteotti,22\r
+                               gaggiano  milano  20083\r
+                               IT\r
+\r
+70-B3-D5   (hex)               MedRx, Inc\r
+3B6000-3B6FFF     (base 16)            MedRx, Inc\r
+                               1200 Starkey Rd Ste.105\r
+                               Largo  FL  33771\r
                                US\r
 \r
+70-B3-D5   (hex)               ZIEHL-ABEGG SE\r
+698000-698FFF     (base 16)            ZIEHL-ABEGG SE\r
+                               Heinz-Ziehl-Strasse 1\r
+                               Kuenzelsau    74653\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Vema Venturi AB\r
+036000-036FFF     (base 16)            Vema Venturi AB\r
+                               Johan på gårdas gata 5A\r
+                               Gothenburg  Västra Götaland  41250\r
+                               SE\r
+\r
 70-B3-D5   (hex)               EVCO SPA\r
 A80000-A80FFF     (base 16)            EVCO SPA\r
                                VIA FELTRE N. 81\r
@@ -7463,12 +7577,6 @@ ABA000-ABAFFF     (base 16)              CL International
                                Seongnam   Kyeonggi-do   462-806\r
                                KR\r
 \r
-70-B3-D5   (hex)               Aplex Technology Inc.\r
-35F000-35FFFF     (base 16)            Aplex Technology Inc.\r
-                               2Q , NanYouTianAn industrial park Tower4 ,Nanshan District\r
-                               Shenzhen  Guangdong  518054\r
-                               CN\r
-\r
 70-B3-D5   (hex)               Emka Technologies\r
 AF1000-AF1FFF     (base 16)            Emka Technologies\r
                                59 bd General Martial Valin\r
@@ -9971,12 +10079,6 @@ FE1000-FE1FFF     (base 16)             Shenzhen Zhiting Technology Co.,Ltd
                                Shenzhen  Guangdong  518109\r
                                CN\r
 \r
-70-B3-D5   (hex)               MiraeSignal Co., Ltd\r
-38C000-38CFFF     (base 16)            MiraeSignal Co., Ltd\r
-                               #701,C-dong Bundang Techno Park Pangyoro 744\r
-                               Bundang-gu Sungnam-si  Kyungkido  13510\r
-                               KR\r
-\r
 70-B3-D5   (hex)               on-systems limited\r
 5B7000-5B7FFF     (base 16)            on-systems limited\r
                                615A Jubilee Road\r
@@ -9989,24 +10091,30 @@ FE0000-FE0FFF     (base 16)            Blueprint Lab
                                Glebe  NSW  2037\r
                                AU\r
 \r
+70-B3-D5   (hex)               MiraeSignal Co., Ltd\r
+38C000-38CFFF     (base 16)            MiraeSignal Co., Ltd\r
+                               #701,C-dong Bundang Techno Park Pangyoro 744\r
+                               Bundang-gu Sungnam-si  Kyungkido  13510\r
+                               KR\r
+\r
 70-B3-D5   (hex)               LEIDOS\r
 004000-004FFF     (base 16)            LEIDOS\r
                                1121 W Reeves\r
                                Ridgecrest  CA  93555\r
                                US\r
 \r
-70-B3-D5   (hex)               Avionica \r
-CC0000-CC0FFF     (base 16)            Avionica \r
-                               9941 West Jessamine St\r
-                               Miami   FL  33157 \r
-                               US\r
-\r
 70-B3-D5   (hex)               Swiss Timing LTD\r
 725000-725FFF     (base 16)            Swiss Timing LTD\r
                                Rue de l'Envers 1\r
                                Corgemont    2606\r
                                CH\r
 \r
+70-B3-D5   (hex)               Avionica \r
+CC0000-CC0FFF     (base 16)            Avionica \r
+                               9941 West Jessamine St\r
+                               Miami   FL  33157 \r
+                               US\r
+\r
 70-B3-D5   (hex)               RoyalShield Technologies India Private Limited\r
 F1B000-F1BFFF     (base 16)            RoyalShield Technologies India Private Limited\r
                                B-116, DDA Sheds, Okhla Industrial Area, Okhla Phase -I\r
@@ -10037,6 +10145,18 @@ B79000-B79FFF     (base 16)            Dadacon GmbH
                                HAYWARD  CA  94544\r
                                US\r
 \r
+70-B3-D5   (hex)               Nordson Corporation\r
+50B000-50BFFF     (base 16)            Nordson Corporation\r
+                               11475 Lakefield Dr\r
+                               Duluth  GA  30097\r
+                               US\r
+\r
+70-B3-D5   (hex)               Jeio Tech \r
+720000-720FFF     (base 16)            Jeio Tech \r
+                               19 Alexander Road, Suite 7\r
+                               Billerica  MA  01821\r
+                               US\r
+\r
 70-B3-D5   (hex)               BAB TECHNOLOGIE GmbH\r
 E19000-E19FFF     (base 16)            BAB TECHNOLOGIE GmbH\r
                                Hoerder Burgstr.18\r
@@ -10049,30 +10169,84 @@ E19000-E19FFF     (base 16)           BAB TECHNOLOGIE GmbH
                                Marlborough  CT  06447\r
                                US\r
 \r
-70-B3-D5   (hex)               Nordson Corporation\r
-50B000-50BFFF     (base 16)            Nordson Corporation\r
-                               11475 Lakefield Dr\r
-                               Duluth  GA  30097\r
-                               US\r
-\r
 70-B3-D5   (hex)               Done Design Inc\r
 928000-928FFF     (base 16)            Done Design Inc\r
                                930 Delray Drive\r
                                Forest Hill  MD  21050\r
                                US\r
 \r
-70-B3-D5   (hex)               Jeio Tech \r
-720000-720FFF     (base 16)            Jeio Tech \r
-                               19 Alexander Road, Suite 7\r
-                               Billerica  MA  01821\r
-                               US\r
-\r
 70-B3-D5   (hex)               TESCAN Brno, s.r.o.\r
 812000-812FFF     (base 16)            TESCAN Brno, s.r.o.\r
                                Libusina tr.1\r
                                Brno    62300\r
                                CZ\r
 \r
+70-B3-D5   (hex)               LINEAGE POWER PVT LTD.,\r
+965000-965FFF     (base 16)            LINEAGE POWER PVT LTD.,\r
+                               30-A1, KIADB, 1ST PHASE INDUSTRIAL ESTATE,KUMBALGODU, BANGALORE-MYSORE ROAD\r
+                               BANGALORE  KARNATAKA  560074\r
+                               IN\r
+\r
+70-B3-D5   (hex)               China Telecom Fufu Information Technology CO.,LTD\r
+38E000-38EFFF     (base 16)            China Telecom Fufu Information Technology CO.,LTD\r
+                               22 Shuitou Road, Doumen,Fuzhou\r
+                               Fuzhou  FuJian  350013\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Dynim Oy\r
+CE6000-CE6FFF     (base 16)            Dynim Oy\r
+                               Kirkkokatu 5b\r
+                               Oulu    90100\r
+                               FI\r
+\r
+70-B3-D5   (hex)               Beijing Muniulinghang Technology Co., Ltd\r
+198000-198FFF     (base 16)            Beijing Muniulinghang Technology Co., Ltd\r
+                               C9001 Kangjianbaosheng Square C, No.8 Heiquan Road, Haidian District,\r
+                               Beijing    100192\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Aplex Technology Inc.\r
+35F000-35FFFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+70-B3-D5   (hex)               TESSA AGRITECH SRL\r
+F74000-F74FFF     (base 16)            TESSA AGRITECH SRL\r
+                               VIA ALLA CASCATA, 56\r
+                               Trento  Trento  38123\r
+                               IT\r
+\r
+70-B3-D5   (hex)               CAR-connect GmbH\r
+81F000-81FFFF     (base 16)            CAR-connect GmbH\r
+                               Am Egelingsberg 8\r
+                               Leiferde  Niedersachsen  38542\r
+                               DE\r
+\r
+70-B3-D5   (hex)               MBJ\r
+E03000-E03FFF     (base 16)            MBJ\r
+                               Jochim-Klindt-Straße 7\r
+                               Ahrensburg  Schleswig Holstein  22926\r
+                               DE\r
+\r
+70-B3-D5   (hex)               Code Blue Corporation \r
+271000-271FFF     (base 16)            Code Blue Corporation \r
+                               259 Hedcor Street\r
+                               Holland  MI  49423\r
+                               US\r
+\r
+70-B3-D5   (hex)               Fischer Connectors\r
+BF7000-BF7FFF     (base 16)            Fischer Connectors\r
+                               11 Waterberry drive\r
+                               Waterlooville  Hampshire  PO7 7YH\r
+                               GB\r
+\r
+70-B3-D5   (hex)               VK Integrated Systems\r
+A8F000-A8FFFF     (base 16)            VK Integrated Systems\r
+                               810 Crossland Ave\r
+                               Clarksville  TN  37040\r
+                               US\r
+\r
 70-B3-D5   (hex)               System West dba ICS Electronics\r
 E06000-E06FFF     (base 16)            System West dba ICS Electronics\r
                                7034 Commerce Circle Suite A\r
@@ -12341,12 +12515,6 @@ FCA000-FCAFFF     (base 16)            M2M Cybernetics Pvt Ltd
                                Aarhus N    8200\r
                                DK\r
 \r
-70-B3-D5   (hex)               Aplex Technology Inc.\r
-906000-906FFF     (base 16)            Aplex Technology Inc.\r
-                               2nd Floor,Tower3,District5,HongHuaLing industrial park,  Nanshan District\r
-                               Shenzhen  Guangdong  518055\r
-                               CN\r
-\r
 70-B3-D5   (hex)               Zoe Medical\r
 721000-721FFF     (base 16)            Zoe Medical\r
                                460 Boston Street\r
@@ -14948,6 +15116,12 @@ D78000-D78FFF     (base 16)            Nxvi Microelectronics Technology (Jinan) Co., Ltd.
                                Seven Hills  NSW  1730\r
                                AU\r
 \r
+00-1B-C5   (hex)               OctoGate IT Security Systems GmbH\r
+030000-030FFF     (base 16)            OctoGate IT Security Systems GmbH\r
+                               Klingender Strasse 5\r
+                               Paderborn  NRW  33100\r
+                               DE\r
+\r
 70-B3-D5   (hex)               AKASAKATEC  INC.\r
 D83000-D83FFF     (base 16)            AKASAKATEC  INC.\r
                                3F Marina Plaza 4-2\r
@@ -14966,10 +15140,10 @@ B12000-B12FFF     (base 16)           VTEQ
                                Oberhasli  ZH  CH-8156\r
                                CH\r
 \r
-00-1B-C5   (hex)               OctoGate IT Security Systems GmbH\r
-030000-030FFF     (base 16)            OctoGate IT Security Systems GmbH\r
-                               Klingender Strasse 5\r
-                               Paderborn  NRW  33100\r
+70-B3-D5   (hex)               REO AG\r
+AD0000-AD0FFF     (base 16)            REO AG\r
+                               Brühlerstr. 100\r
+                               Solingen    42657\r
                                DE\r
 \r
 70-B3-D5   (hex)               Array Technologies Inc.\r
@@ -14978,12 +15152,6 @@ FB4000-FB4FFF     (base 16)            Array Technologies Inc.
                                Glastonbury    06033\r
                                US\r
 \r
-70-B3-D5   (hex)               REO AG\r
-AD0000-AD0FFF     (base 16)            REO AG\r
-                               Brühlerstr. 100\r
-                               Solingen    42657\r
-                               DE\r
-\r
 70-B3-D5   (hex)               ejoin, s.r.o.\r
 44C000-44CFFF     (base 16)            ejoin, s.r.o.\r
                                Sturova 1\r
@@ -15008,18 +15176,18 @@ D2C000-D2CFFF     (base 16)           microWerk GmbH
                                Halsenbach    56283\r
                                DE\r
 \r
-70-B3-D5   (hex)               Guan Show Technologe Co., Ltd.\r
-46D000-46DFFF     (base 16)            Guan Show Technologe Co., Ltd.\r
-                               No.127, Jianguo 1st Rd., Lingya Dist.\r
-                                Kaohsiung City     802\r
-                               TW\r
-\r
 70-B3-D5   (hex)               Foxtrot Research Corp\r
 604000-604FFF     (base 16)            Foxtrot Research Corp\r
                                6201 Johns Road, Suite 3\r
                                Tampa  FL  33634\r
                                US\r
 \r
+70-B3-D5   (hex)               Guan Show Technologe Co., Ltd.\r
+46D000-46DFFF     (base 16)            Guan Show Technologe Co., Ltd.\r
+                               No.127, Jianguo 1st Rd., Lingya Dist.\r
+                                Kaohsiung City     802\r
+                               TW\r
+\r
 70-B3-D5   (hex)               Monnit Corporation\r
 A1E000-A1EFFF     (base 16)            Monnit Corporation\r
                                450 South Simmons STE 670\r
@@ -15038,18 +15206,18 @@ A1E000-A1EFFF     (base 16)           Monnit Corporation
                                Moscow  Moscow  117246\r
                                RU\r
 \r
-70-B3-D5   (hex)               SMITEC S.p.A.\r
-312000-312FFF     (base 16)            SMITEC S.p.A.\r
-                               Via Carlo Ceresa, 10\r
-                               San Giovanni Bianco  Bergamo  24015\r
-                               IT\r
-\r
 70-B3-D5   (hex)               Sicon srl\r
 690000-690FFF     (base 16)            Sicon srl\r
                                Via Sila 1/3\r
                                Isola Vicentina  Vicenza  36033\r
                                IT\r
 \r
+70-B3-D5   (hex)               SMITEC S.p.A.\r
+312000-312FFF     (base 16)            SMITEC S.p.A.\r
+                               Via Carlo Ceresa, 10\r
+                               San Giovanni Bianco  Bergamo  24015\r
+                               IT\r
+\r
 70-B3-D5   (hex)               SCHEIBER\r
 CFA000-CFAFFF     (base 16)            SCHEIBER\r
                                2 BELLEVUE\r
@@ -15062,6 +15230,60 @@ CFA000-CFAFFF     (base 16)            SCHEIBER
                                Ostfildern    73760\r
                                DE\r
 \r
+70-B3-D5   (hex)               Metrasens Limited\r
+ED6000-ED6FFF     (base 16)            Metrasens Limited\r
+                               8 Beauchamp Business Centre,, Sparrowhawk Close\r
+                               Malvern  Worcestershire  WR14 1GL\r
+                               GB\r
+\r
+70-B3-D5   (hex)               Perform3-D LLC\r
+451000-451FFF     (base 16)            Perform3-D LLC\r
+                               411 Huronview Blvd STE 200\r
+                               Ann Arbor  MI  48103\r
+                               US\r
+\r
+70-B3-D5   (hex)               Aplex Technology Inc.\r
+906000-906FFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+70-B3-D5   (hex)               DesignA Electronics Limited\r
+A63000-A63FFF     (base 16)            DesignA Electronics Limited\r
+                               Unit 6\r
+                               Christchurch  New Zealand  8011\r
+                               NZ\r
+\r
+70-B3-D5   (hex)               Grayshift\r
+71F000-71FFFF     (base 16)            Grayshift\r
+                               931 Monroe Dr NE, Suite A102-340\r
+                               Atlanta  GA  30308\r
+                               US\r
+\r
+70-B3-D5   (hex)               dongsheng\r
+AFD000-AFDFFF     (base 16)            dongsheng\r
+                               No. 2, Sec. 2, Beiyi Rd., Xindian Dist.,\r
+                               New Taipei City    231067\r
+                               TW\r
+\r
+70-B3-D5   (hex)               Exemplar Medical, LLC\r
+318000-318FFF     (base 16)            Exemplar Medical, LLC\r
+                               4521 Wornall Road, #106\r
+                               Kansas City  MO  64111\r
+                               US\r
+\r
+70-B3-D5   (hex)               HLT Micro \r
+2B6000-2B6FFF     (base 16)            HLT Micro \r
+                               Bld 6, 4th Park, Xitian, GM Distinct\r
+                               shenzhen    511088\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Cucos Retail Systems GmbH\r
+4CB000-4CBFFF     (base 16)            Cucos Retail Systems GmbH\r
+                               Detmolder Straße 7\r
+                               Soest    59494\r
+                               DE\r
+\r
 70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
 BBB000-BBBFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
                                3-3-1\r
@@ -17172,16 +17394,10 @@ F96000-F96FFF     (base 16)           Ecologicsense
                                FR\r
 \r
 70-B3-D5   (hex)               Woodam Co., Ltd.\r
-C86000-C86FFF     (base 16)            Woodam Co., Ltd.\r
-                               Na 555, EZEN Mecha zone, 117 Hwanggeum-ro, Yangchon-eup\r
-                               Gimpo  Gyeonggi-do  10048\r
-                               KR\r
-\r
-70-B3-D5   (hex)               Aplex Technology Inc.\r
-666000-666FFF     (base 16)            Aplex Technology Inc.\r
-                               2nd Floor,Tower3,District5,HongHuaLing industrial park,  Nanshan District\r
-                               Shenzhen  Guangdong  518055\r
-                               CN\r
+C86000-C86FFF     (base 16)            Woodam Co., Ltd.\r
+                               Na 555, EZEN Mecha zone, 117 Hwanggeum-ro, Yangchon-eup\r
+                               Gimpo  Gyeonggi-do  10048\r
+                               KR\r
 \r
 70-B3-D5   (hex)               ATEME\r
 607000-607FFF     (base 16)            ATEME\r
@@ -17405,12 +17621,6 @@ C63000-C63FFF     (base 16)            Xentech Solutions Limited
                                St Albans  Hertfordshire  AL36PF\r
                                GB\r
 \r
-70-B3-D5   (hex)               Aplex Technology Inc.\r
-106000-106FFF     (base 16)            Aplex Technology Inc.\r
-                               2nd Floor,Tower3,District5,HongHuaLing industrial park,  Nanshan District\r
-                               Shenzhen  Guangdong  518055\r
-                               CN\r
-\r
 70-B3-D5   (hex)               EREE Electronique\r
 D11000-D11FFF     (base 16)            EREE Electronique\r
                                6 avenu Dr Schweitzer\r
@@ -17489,12 +17699,6 @@ F4F000-F4FFFF     (base 16)            Power Electronics Espana, S.L.
                                Paterna  Valencia  46980\r
                                ES\r
 \r
-70-B3-D5   (hex)               Aplex Technology Inc.\r
-B33000-B33FFF     (base 16)            Aplex Technology Inc.\r
-                               2Q , NanYouTianAn industrial park Tower4 ,Nanshan District\r
-                               Shenzhen  Guangdong  518054\r
-                               CN\r
-\r
 70-B3-D5   (hex)               Aplex Technology Inc.\r
 3D9000-3D9FFF     (base 16)            Aplex Technology Inc.\r
                                2Q , NanYouTianAn industrial park Tower4 ,Nanshan District\r
@@ -20069,17 +20273,11 @@ A79000-A79FFF     (base 16)           NOREYA Technology e.U.
                                Dinkelsbuehl  Bavaria  91550\r
                                DE\r
 \r
-70-B3-D5   (hex)               Akse srl\r
-128000-128FFF     (base 16)            Akse srl\r
-                               Via Aldo Moro, 39\r
-                               Reggio Emilia  Italy  42124\r
-                               IT\r
-\r
-70-B3-D5   (hex)               AXING AG\r
-CA6000-CA6FFF     (base 16)            AXING AG\r
-                               Gewerbehaus Moskau\r
-                               Ramsen    8262\r
-                               CH\r
+70-B3-D5   (hex)               NAL Research Corporation\r
+1B0000-1B0FFF     (base 16)            NAL Research Corporation\r
+                               11100 Endeavor Ct, Suite 300\r
+                               Manassas  VA  20109\r
+                               US\r
 \r
 70-B3-D5   (hex)               LLC NTZ Mekhanotronika\r
 6C0000-6C0FFF     (base 16)            LLC NTZ Mekhanotronika\r
@@ -20087,17 +20285,17 @@ CA6000-CA6FFF     (base 16)           AXING AG
                                Saint-Petersburg    198206\r
                                RU\r
 \r
-70-B3-D5   (hex)               NAL Research Corporation\r
-1B0000-1B0FFF     (base 16)            NAL Research Corporation\r
-                               11100 Endeavor Ct, Suite 300\r
-                               Manassas  VA  20109\r
-                               US\r
+70-B3-D5   (hex)               AXING AG\r
+CA6000-CA6FFF     (base 16)            AXING AG\r
+                               Gewerbehaus Moskau\r
+                               Ramsen    8262\r
+                               CH\r
 \r
-70-B3-D5   (hex)               Arwin Technology Limited\r
-8C9000-8C9FFF     (base 16)            Arwin Technology Limited\r
-                               Unit 215, 2/F, 19W, 19 Science Park West Avenue\r
-                               Hong Kong    0\r
-                               HK\r
+70-B3-D5   (hex)               Akse srl\r
+128000-128FFF     (base 16)            Akse srl\r
+                               Via Aldo Moro, 39\r
+                               Reggio Emilia  Italy  42124\r
+                               IT\r
 \r
 70-B3-D5   (hex)               PNETWORKS\r
 EF0000-EF0FFF     (base 16)            PNETWORKS\r
@@ -20105,6 +20303,12 @@ EF0000-EF0FFF     (base 16)            PNETWORKS
                                Istanbul    34906\r
                                TR\r
 \r
+70-B3-D5   (hex)               Arwin Technology Limited\r
+8C9000-8C9FFF     (base 16)            Arwin Technology Limited\r
+                               Unit 215, 2/F, 19W, 19 Science Park West Avenue\r
+                               Hong Kong    0\r
+                               HK\r
+\r
 70-B3-D5   (hex)               Herholdt Controls srl\r
 C6B000-C6BFFF     (base 16)            Herholdt Controls srl\r
                                Via Mestre 13\r
@@ -20135,59 +20339,47 @@ B01000-B01FFF     (base 16)           G.S.D GROUP INC.
                                LAVAL  Quebec  H7L 5C2\r
                                CA\r
 \r
-70-B3-D5   (hex)               DIC Corporation\r
-5C3000-5C3FFF     (base 16)            DIC Corporation\r
-                               DIC Building,7-20,Nihonbashi 3-chome\r
-                               Chuo-ku,Tokyo    103-8233\r
-                               JP\r
-\r
 70-B3-D5   (hex)               Medicomp, Inc\r
 F7C000-F7CFFF     (base 16)            Medicomp, Inc\r
                                600 Atlantis Rd\r
                                Melbourne  FL  32904\r
                                US\r
 \r
+70-B3-D5   (hex)               DIC Corporation\r
+5C3000-5C3FFF     (base 16)            DIC Corporation\r
+                               DIC Building,7-20,Nihonbashi 3-chome\r
+                               Chuo-ku,Tokyo    103-8233\r
+                               JP\r
+\r
 70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
 CAD000-CADFFF     (base 16)            YUYAMA MFG Co.,Ltd\r
                                3-3-1\r
                                TOYONAKASHI  OSAKA  561-0841\r
                                JP\r
 \r
-70-B3-D5   (hex)               Shenzhen Rongda Computer Co.,Ltd\r
-289000-289FFF     (base 16)            Shenzhen Rongda Computer Co.,Ltd\r
-                               905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
-                               Longhua District  Shenzhen, Guangdong    518110\r
-                               CN\r
-\r
 70-B3-D5   (hex)               Sono-Tek Corporation\r
 5C2000-5C2FFF     (base 16)            Sono-Tek Corporation\r
                                2012 Rte. 9W Bldg 3\r
                                Milton  NY  12547\r
                                US\r
 \r
-70-B3-D5   (hex)               Breas Medical AB\r
-CF9000-CF9FFF     (base 16)            Breas Medical AB\r
-                               Företagsvägen 1\r
-                               Mölnlycke    SE-435 33\r
-                               SE\r
-\r
 70-B3-D5   (hex)               Davitor AB\r
 E60000-E60FFF     (base 16)            Davitor AB\r
                                Skordarevagen 5\r
                                Kalmar    39353\r
                                SE\r
 \r
-70-B3-D5   (hex)               Coloet S.r.l.\r
-713000-713FFF     (base 16)            Coloet S.r.l.\r
-                               Via Mascheroni, 20\r
-                               MILANO  Italy  20145\r
-                               IT\r
+70-B3-D5   (hex)               Shenzhen Rongda Computer Co.,Ltd\r
+289000-289FFF     (base 16)            Shenzhen Rongda Computer Co.,Ltd\r
+                               905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
+                               Longhua District  Shenzhen, Guangdong    518110\r
+                               CN\r
 \r
-70-B3-D5   (hex)               meoENERGY\r
-7FA000-7FAFFF     (base 16)            meoENERGY\r
-                               Glacisstraße 9/1\r
-                               Graz    8010\r
-                               AT\r
+70-B3-D5   (hex)               Breas Medical AB\r
+CF9000-CF9FFF     (base 16)            Breas Medical AB\r
+                               Företagsvägen 1\r
+                               Mölnlycke    SE-435 33\r
+                               SE\r
 \r
 70-B3-D5   (hex)               European Synchrotron Radiation Facility\r
 160000-160FFF     (base 16)            European Synchrotron Radiation Facility\r
@@ -20201,6 +20393,18 @@ E60000-E60FFF     (base 16)            Davitor AB
                                Lafayette  IN  47905\r
                                US\r
 \r
+70-B3-D5   (hex)               Coloet S.r.l.\r
+713000-713FFF     (base 16)            Coloet S.r.l.\r
+                               Via Mascheroni, 20\r
+                               MILANO  Italy  20145\r
+                               IT\r
+\r
+70-B3-D5   (hex)               meoENERGY\r
+7FA000-7FAFFF     (base 16)            meoENERGY\r
+                               Glacisstraße 9/1\r
+                               Graz    8010\r
+                               AT\r
+\r
 70-B3-D5   (hex)               VERTEL DIGITAL PRIVATE LIMITED\r
 912000-912FFF     (base 16)            VERTEL DIGITAL PRIVATE LIMITED\r
                                C-98, SECTOR-10 \r
@@ -20225,12 +20429,99 @@ D1D000-D1DFFF     (base 16)           Stuyts Engineering Haarlem BV
                                Quebec  Quebec  G1V 4P1\r
                                CA\r
 \r
+70-B3-D5   (hex)               IP Devices\r
+5CE000-5CEFFF     (base 16)            IP Devices\r
+                               Etrog 72 8\r
+                               Givat Zeev    9091700\r
+                               IL\r
+\r
+70-B3-D5   (hex)               JESE Ltd\r
+0E2000-0E2FFF     (base 16)            JESE Ltd\r
+                               Unit 2 Gales\r
+                               Newton Abbot  Devon  TQ13 8FD\r
+                               GB\r
+\r
 70-B3-D5   (hex)               IDZ Ltd\r
 7F6000-7F6FFF     (base 16)            IDZ Ltd\r
                                160 CITY ROAD\r
-                               LONDON  Select One...  EC1V 2NX\r
+                               LONDON    EC1V 2NX\r
                                GB\r
 \r
+70-B3-D5   (hex)               Private Enterprise Scientific and Production Private EnterpriseSparing-Vist Center\r
+076000-076FFF     (base 16)            Private Enterprise Scientific and Production Private EnterpriseSparing-Vist Center\r
+                               33 V.Velykoho Str.\r
+                               Lviv    79026\r
+                               UA\r
+\r
+70-B3-D5   (hex)               LinkAV Technology Co., Ltd\r
+1F6000-1F6FFF     (base 16)            LinkAV Technology Co., Ltd\r
+                               Room 401, 4F, Skyworth Digital Building, Songbai Rd, Baoan District \r
+                               Shenzhen  Guangdong  518108\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Aplex Technology Inc.\r
+B33000-B33FFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Aplex Technology Inc.\r
+106000-106FFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+70-B3-D5   (hex)               Aplex Technology Inc.\r
+666000-666FFF     (base 16)            Aplex Technology Inc.\r
+                               501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+                               Shenzhen City  Guangdong  518129\r
+                               CN\r
+\r
+70-B3-D5   (hex)               FARHO DOMOTICA SL\r
+ACE000-ACEFFF     (base 16)            FARHO DOMOTICA SL\r
+                               POLIGONO DE TABAZA II, NAVES 9-13\r
+                               TABAZA  ASTURIAS  33439\r
+                               ES\r
+\r
+70-B3-D5   (hex)               The Engineerix Group\r
+C71000-C71FFF     (base 16)            The Engineerix Group\r
+                               1418 Beech Ave 119A\r
+                               McAllen  TX  78501\r
+                               US\r
+\r
+70-B3-D5   (hex)               Flextronics International Kft\r
+1BC000-1BCFFF     (base 16)            Flextronics International Kft\r
+                               38. Zrinyi Str.\r
+                               Zalaegerszeg  Zala  8900\r
+                               HU\r
+\r
+70-B3-D5   (hex)               Research Laboratory of Design Automation, Ltd.\r
+223000-223FFF     (base 16)            Research Laboratory of Design Automation, Ltd.\r
+                               8 Birzhevoy Spusk\r
+                               Taganrog    347900\r
+                               RU\r
+\r
+70-B3-D5   (hex)               Private\r
+315000-315FFF     (base 16)            Private\r
+\r
+70-B3-D5   (hex)               JOLANYEE  Technology Co., Ltd.\r
+9D8000-9D8FFF     (base 16)            JOLANYEE  Technology Co., Ltd.\r
+                               2F., No. 13, Sec. 1, Yonghe Rd.\r
+                               Yonghe Dist., New Taipei City    234014\r
+                               TW\r
+\r
+70-B3-D5   (hex)               SEASONS 4 INC\r
+D5D000-D5DFFF     (base 16)            SEASONS 4 INC\r
+                               3601 LA GRANGE PKWY, SUITE 500\r
+                               TOANO  VA  23168\r
+                               US\r
+\r
+70-B3-D5   (hex)               VulcanForms\r
+E0E000-E0EFFF     (base 16)            VulcanForms\r
+                               20 North Ave.\r
+                               Burlington  MA  01803\r
+                               US\r
+\r
 70-B3-D5   (hex)               DISMUNTEL SAL\r
 92C000-92CFFF     (base 16)            DISMUNTEL SAL\r
                                Pol ind cotes\r
@@ -23258,12 +23549,6 @@ DDF000-DDFFFF     (base 16)            AeroVision Avionics, Inc.
                                Almelo  Overijssel  7602 EA\r
                                NL\r
 \r
-70-B3-D5   (hex)               Refecor Oy\r
-DF7000-DF7FFF     (base 16)            Refecor Oy\r
-                               Isokatu 8A1\r
-                               OULU  FInland  90100\r
-                               FI\r
-\r
 70-B3-D5   (hex)               ARD\r
 C89000-C89FFF     (base 16)            ARD\r
                                MICROPOLIS\r
@@ -25067,12 +25352,6 @@ B27000-B27FFF     (base 16)            Naval Group
                                Hangzhou  Zhejiang  310000\r
                                CN\r
 \r
-70-B3-D5   (hex)               Coda Octopus Products Limited\r
-4D9000-4D9FFF     (base 16)            Coda Octopus Products Limited\r
-                               38 S. Gyle Crescent, South Gyle Business Park\r
-                               Edinburgh  Scotland  EH12 9EB\r
-                               GB\r
-\r
 70-B3-D5   (hex)               Xirgo Technologies LLC\r
 CA0000-CA0FFF     (base 16)            Xirgo Technologies LLC\r
                                188 Camino Ruiz\r
@@ -25097,36 +25376,42 @@ A02000-A02FFF     (base 16)           GreenFlux
                                Arlington  VA  22201\r
                                US\r
 \r
+70-B3-D5   (hex)               Coda Octopus Products Limited\r
+4D9000-4D9FFF     (base 16)            Coda Octopus Products Limited\r
+                               38 S. Gyle Crescent, South Gyle Business Park\r
+                               Edinburgh  Scotland  EH12 9EB\r
+                               GB\r
+\r
 70-B3-D5   (hex)               Walter Müller AG\r
 0E4000-0E4FFF     (base 16)            Walter Müller AG\r
                                Russikerstrasse 37\r
                                Fehraltorf  Zürich  8320\r
                                CH\r
 \r
-70-B3-D5   (hex)               COONTROL Tecnologia em Combustão LTDA EPP\r
-8E9000-8E9FFF     (base 16)            COONTROL Tecnologia em Combustão LTDA EPP\r
-                               RUA ABRAHAN LINCOLS, 464, Jardim América\r
-                               RIO DO SUL  SANTA CATARINA  89160202\r
-                               BR\r
-\r
-70-B3-D5   (hex)               Private\r
-278000-278FFF     (base 16)            Private\r
-                               600 Atlantis Rd\r
-                               Melbourne  FL  32904\r
-                               US\r
-\r
 70-B3-D5   (hex)               Sensoronic Co.,Ltd\r
 D52000-D52FFF     (base 16)            Sensoronic Co.,Ltd\r
                                1311ho, sambo techno tower, Jomaru-ro 385beongil,\r
                                Bucheon-si  Gyeonggi-do  14556\r
                                KR\r
 \r
+70-B3-D5   (hex)               COONTROL Tecnologia em Combustão LTDA EPP\r
+8E9000-8E9FFF     (base 16)            COONTROL Tecnologia em Combustão LTDA EPP\r
+                               RUA ABRAHAN LINCOLS, 464, Jardim América\r
+                               RIO DO SUL  SANTA CATARINA  89160202\r
+                               BR\r
+\r
 70-B3-D5   (hex)               Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd\r
 E42000-E42FFF     (base 16)            Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd\r
                                No.2 Xinxiu Street, Hunnan District, Shenyang\r
                                Shenyang  Liaoning  110000\r
                                CN\r
 \r
+70-B3-D5   (hex)               Private\r
+278000-278FFF     (base 16)            Private\r
+                               600 Atlantis Rd\r
+                               Melbourne  FL  32904\r
+                               US\r
+\r
 70-B3-D5   (hex)               YUYAMA MFG Co.,Ltd\r
 196000-196FFF     (base 16)            YUYAMA MFG Co.,Ltd\r
                                1-4-30\r
@@ -25151,12 +25436,6 @@ E42000-E42FFF     (base 16)            Neusoft Reach Automotive Technology (Shenyang) Co.,
                                Augsburg    86156\r
                                DE\r
 \r
-70-B3-D5   (hex)               MB connect line GmbH Fernwartungssysteme\r
-71A000-71AFFF     (base 16)            MB connect line GmbH Fernwartungssysteme\r
-                               Winnettener Straße 6\r
-                               Dinkelsbuehl  Bavaria  91550\r
-                               DE\r
-\r
 70-B3-D5   (hex)               Loma Systems s.r.o.\r
 BC8000-BC8FFF     (base 16)            Loma Systems s.r.o.\r
                                Southwood\r
@@ -25169,11 +25448,11 @@ BC8000-BC8FFF     (base 16)           Loma Systems s.r.o.
                                ALPIGNANO  string:TO  10091\r
                                IT\r
 \r
-70-B3-D5   (hex)               CTROGERS LLC\r
-474000-474FFF     (base 16)            CTROGERS LLC\r
-                               815 1st Ave #174\r
-                               Seattle  WA  98104\r
-                               US\r
+70-B3-D5   (hex)               MB connect line GmbH Fernwartungssysteme\r
+71A000-71AFFF     (base 16)            MB connect line GmbH Fernwartungssysteme\r
+                               Winnettener Straße 6\r
+                               Dinkelsbuehl  Bavaria  91550\r
+                               DE\r
 \r
 70-B3-D5   (hex)               EIZO RUGGED SOLUTIONS\r
 5B9000-5B9FFF     (base 16)            EIZO RUGGED SOLUTIONS\r
@@ -25187,8 +25466,92 @@ DEF000-DEFFFF     (base 16)            ISG Nordic AB
                                KUNGSBACKA  Select State  SE-43437\r
                                SE\r
 \r
-70-B3-D5   (hex)               PARAGON ID\r
-036000-036FFF     (base 16)            PARAGON ID\r
-                               Les Aubépins\r
-                               ARGENT SUR SAULDRE  CHER  18410\r
+70-B3-D5   (hex)               CTROGERS LLC\r
+474000-474FFF     (base 16)            CTROGERS LLC\r
+                               815 1st Ave #174\r
+                               Seattle  WA  98104\r
+                               US\r
+\r
+70-B3-D5   (hex)               Deep Secure Limited\r
+DD0000-DD0FFF     (base 16)            Deep Secure Limited\r
+                               1 Nimrod House, Sandys Road\r
+                               Malvern  Worcestershire  WR14 1JJ\r
+                               GB\r
+\r
+70-B3-D5   (hex)               Mi-Fi Networks Pvt Ltd\r
+411000-411FFF     (base 16)            Mi-Fi Networks Pvt Ltd\r
+                               No 13 A, Kalakshetra Road , Thiruvanmiyur \r
+                               Chennai  Tamil Nadu  600041\r
+                               IN\r
+\r
+70-B3-D5   (hex)               CesiumAstro Inc.\r
+E5F000-E5FFFF     (base 16)            CesiumAstro Inc.\r
+                               13412 Galleria Circle, Suite H-100\r
+                               Austin  TX  78738\r
+                               US\r
+\r
+70-B3-D5   (hex)               Druck Ltd.\r
+EAA000-EAAFFF     (base 16)            Druck Ltd.\r
+                               Firtree Lane, Groby, Leicester\r
+                               Le6 0FH  England  \r
+                               GB\r
+\r
+70-B3-D5   (hex)               Panoramic Power\r
+4ED000-4EDFFF     (base 16)            Panoramic Power\r
+                               Atir Yeda 15\r
+                               Kfar Saba    4464312\r
+                               IL\r
+\r
+70-B3-D5   (hex)               STENTORIUS by ADI\r
+5B3000-5B3FFF     (base 16)            STENTORIUS by ADI\r
+                               41 - 47 Rue des frères Lumière\r
+                               Neuilly sur Marne  Ile-de-France  93330\r
+                               FR\r
+\r
+70-B3-D5   (hex)               Codewerk GmbH\r
+4D0000-4D0FFF     (base 16)            Codewerk GmbH\r
+                               Siemensallee 75\r
+                               Karlsruhe    76187 \r
+                               DE\r
+\r
+70-B3-D5   (hex)               Orlaco Products B.V.\r
+333000-333FFF     (base 16)            Orlaco Products B.V.\r
+                               Albert Plesmanstraat 42\r
+                               Barneveld    3772MN\r
+                               NL\r
+\r
+70-B3-D5   (hex)               ScopeSensor Oy\r
+DF7000-DF7FFF     (base 16)            ScopeSensor Oy\r
+                               Teollisuustie 1\r
+                               Haukipudas    90830\r
+                               FI\r
+\r
+70-B3-D5   (hex)               KBPR LLC\r
+11E000-11EFFF     (base 16)            KBPR LLC\r
+                               Raketny bulvar street 16\r
+                               Moscow  Select State  129164\r
+                               RU\r
+\r
+70-B3-D5   (hex)               Anello Photonics\r
+96A000-96AFFF     (base 16)            Anello Photonics\r
+                               3964 Rivermark Plaza, Suite 144\r
+                               Santa Clara  CA  95054\r
+                               US\r
+\r
+70-B3-D5   (hex)               HORIZON.INC\r
+F40000-F40FFF     (base 16)            HORIZON.INC\r
+                               1600 Aza-Shironoshita Asahi\r
+                               Shin Asahi-cho  Takashima, Shiga  520-1501\r
+                               JP\r
+\r
+70-B3-D5   (hex)               SUS Corporation\r
+1ED000-1EDFFF     (base 16)            SUS Corporation\r
+                               6F, S-patio Bldg. 14-25 Minami-cho, Suruga-ku,\r
+                               Shizuoka city,  Shizuoka  422-8067\r
+                               JP\r
+\r
+70-B3-D5   (hex)               Lumiplan Duhamel\r
+A0C000-A0CFFF     (base 16)            Lumiplan Duhamel\r
+                               2 rue de l'industrie\r
+                               Domène  Isère  38420\r
                                FR\r
index 54c6f4d5e2def43cae06b6fda8a4cbdafb84a75c..7221a1ae9f64bf0b5eba5df3a6f7e8ba174757bb 100644 (file)
@@ -4,6 +4,7 @@
 # they are very long but quite repetitive and the parser is not very fast.
 # So we don't "test" them.
 hwdb_files_notest = files('''
+        README
         20-dmi-id.hwdb
         20-pci-vendor-model.hwdb
         20-pci-classes.hwdb
index 2e223ef23734a6c368ebc1bf4068b4541db0eaf9..604fba5eb938f38932d7980913cc8040559beb07 100644 (file)
@@ -1,8 +1,8 @@
 #
 #      List of PCI ID's
 #
-#      Version: 2021.02.12
-#      Date:    2021-02-12 03:15:01
+#      Version: 2021.03.22
+#      Date:    2021-03-22 03:15:01
 #
 #      Maintained by Albert Pool, Martin Mares, and other volunteers from
 #      the PCI ID Project at https://pci-ids.ucw.cz/.
                1000 3040  9210-8i
                1000 3080  9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA]
                1000 30b0  9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA]
+               1014 03ca  IBM 6Gb SAS HBA [9212-4i4e]
                1028 1f1c  6Gbps SAS HBA Adapter
                1028 1f1d  PERC H200 Adapter
                1028 1f1e  PERC H200 Integrated
                1d49 060e  ThinkSystem RAID 940-32i 8GB Flash PCIe Gen4 12Gb Adapter
                1d49 060f  ThinkSystem RAID 940-8e 4GB Flash PCIe Gen4 12Gb Adapter
        10e2  MegaRAID 12GSAS/PCIe Secure SAS39xx
+# 9560 16 internal port RAID controller
+               1000 4000  MegaRAID 9560-16i
+# 9560 8 internal port RAID controller
+               1000 4010  MegaRAID 9560-8i
+# 9580 8 internal & 8 external port RAID controller
+               1000 4020  MegaRAID 9580-8i8e
+# MegaRAID 9562-16i 9562 16 internal port RAID controller
+               1000 40b0  MegaRAID 9562-16i
                1028 1ae0  PERC H755 Adapter
                1028 1ae1  PERC H755 Front
                1028 1ae2  PERC H755N Front
        1561  Anubis
        15d8  Picasso
                103c 8615  Pavilion Laptop 15-cw1xxx
+               17aa 3181  ThinkCentre M75n IoT
                17aa 5124  ThinkPad E595
                ea50 cc10  RXi2-BP
        15dd  Raven Ridge [Radeon Vega Series / Radeon Vega Mobile Series]
        5e6d  RV410 [Radeon X700] (Secondary)
                148c 2117  Bravo X700 (Secondary)
        5f57  R423 [Radeon X800 XT]
-       6600  Mars [Radeon HD 8670A/8670M/8750M]
+       6600  Mars [Radeon HD 8670A/8670M/8750M / R7 M370]
                103c 1952  ProBook 455 G1
        6601  Mars [Radeon HD 8730M]
                103c 2100  FirePro M4100
        6608  Oland GL [FirePro W2100]
                13cc 3d28  MXRT-2600
        6609  Oland GL [FirePro W2100 / Barco MXRT 2600]
-       6610  Oland XT [Radeon HD 8670 / R7 250/350]
+       6610  Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM]
                1019 0030  Radeon HD 8670
+               1028 0081  Radeon R7 350X OEM
+               1028 0083  Radeon R5 340X OEM
                1028 2120  Radeon R7 250
                1028 2322  Radeon R7 250
                1462 2910  Radeon HD 8670
                1642 3c91  Radeon HD 8670
                1642 3f09  Radeon R7 350
        6611  Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM]
+               1028 1001  Radeon R5 430 OEM (1024 MByte)
+               1028 1002  Radeon R5 430 OEM (2048 MByte)
+# The 'AMD Radeon R5 430' instead of 240/340 is NOT a typo! It's actually correct.
+               1028 1711  R5 430 OEM (2048 MByte)
                1028 210b  Radeon R5 240 OEM
+# OEM-card for Dell; verified through AMD's own drivers (*.inf) and a TPU BIOS in database
+               1028 2121  Radeon HD 8570 OEM
+# OEM-card from Fujitsu; verified through AMD's own drivers (*.inf)
+               10cf 1889  Radeon HD 8570 OEM
                1642 1869  Radeon 520 OEM
                174b 4248  Radeon R7 240 OEM
                174b a240  Radeon R7 240 OEM
                8086 2111  Radeon HD 6625M
        6743  Whistler [Radeon E6760]
        6749  Turks GL [FirePro V4900]
-               15c3 2b06  MED-X4900
+               15c3 2b06  MED-X4900 (EIZO)
        674a  Turks GL [FirePro V3900]
                13cc 3d22  MXRT-2500
                15c3 0106  MED-X3900
                174b 7670  Radeon HD 7670
                174b e181  Radeon HD 6670
                1787 2309  Radeon HD 6670
-       6759  Turks PRO [Radeon HD 6570/7570/8550]
+       6759  Turks PRO [Radeon HD 6570/7570/8550 / R5 230]
                103c 3130  Radeon HD 6570
                1043 0403  Radeon HD 6570
                1462 2500  Radeon HD 6570
                1642 3a67  Radeon HD 6570
                1682 3280  Radeon HD 7570
                1682 3530  Radeon HD 8550
+               1682 5230  Radeon R5 230 series
+               1682 6450  Radeon HD 6450 series
                174b 7570  Radeon HD 7570
+               174b 8550  Radeon HD8550 OEM
+               174b 8570  Radeon HD8550 OEM
                174b e142  Radeon HD 6570
                174b e181  Radeon HD 6570
+               1787 a230  Radeon R5 230 series
+               1787 a450  Radeon HD 6450 series
                1b0a 908f  Radeon HD 6570
                1b0a 9090  Radeon HD 6570
                1b0a 9091  Radeon HD 6570
                174b e329  Radeon R9 FURY
        7310  Navi 10 [Radeon Pro W5700X]
        7312  Navi 10 [Radeon Pro W5700]
+       7314  Navi 10 USB
        731f  Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
                1458 2313  Radeon RX 5700 XT Gaming OC
                1682 5701  RX 5700 XT RAW II
        7341  Navi 14 [Radeon Pro W5500]
        7347  Navi 14 [Radeon Pro W5500M]
        734f  Navi 14 [Radeon Pro W5300M]
-       7360  Navi 12 [Radeon Pro 5600M]
+       7360  Navi 12 [Radeon Pro 5600M / V520]
+       7362  Navi 12 [Radeon Pro V520]
        7388  Arcturus GL-XL
        738c  Arcturus GL-XL [AMD Instinct MI100]
        738e  Arcturus GL-XL
+       73a4  Navi 21 USB
+       73af  Navi 21 [Radeon RX 6900 XT]
        73bf  Navi 21 [Radeon RX 6800/6800 XT / 6900 XT]
                1eae 6701  XFX Speedster MERC 319 AMD Radeon RX 6800 XT Black
        73c3  Navi 22
-       73df  Navi 22
+       73c4  Navi 22 USB
+       73df  Navi 22 [Radeon RX 6700/6700 XT / 6800M]
        73e0  Navi 23
-       73ff  Navi 23
+       73e1  Navi 23
+       73e4  Navi 23 USB
+       73ff  Navi 23 [Radeon RX 6600/6600 XT]
        7833  RS350 Host Bridge
        7834  RS350 [Radeon 9100 PRO/XT IGP]
        7835  RS350M [Mobility Radeon 9000 IGP]
                2646 0001  KNE100TX Fast Ethernet
        000a  21230 Video Codec
        000d  PBXGB [TGA2]
-       000f  DEFPA FDDI PCI-to-PDQ Interface Chip [PFI]
-               1011 def1  FDDI controller (DEFPA)
-               103c def1  FDDI controller (3X-DEFPA)
+       000f  PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA)
+               1011 def1  FDDIcontroller/PCI (DEFPA)
+               103c def1  FDDIcontroller/PCI (3X-DEFPA)
        0014  DECchip 21041 [Tulip Pass 3]
                1186 0100  DE-530+
-       0016  DGLPB [OPPO]
+       0016  ATMworks 350 Adapter [OPPO] (DGLPB)
        0017  PV-PCI Graphics Controller (ZLXp-L)
        0018  Memory Channel interface
        0019  DECchip 21142/43
                4c53 1030  PC5 mainboard
                4c53 1040  CL7 mainboard
                4c53 1060  PC7 mainboard
-       2001  79c978 [HomePNA]
+# Via AMD's own technical reference on their Am79C978 NICs; https://www.amd.com/system/files/TechDocs/22206.pdf
+       2001  Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY]
                1092 0a78  Multimedia Home Network Adapter
                1668 0299  ActionLink Home Network Adapter
        2003  Am 1771 MBW [Alchemy]
        2096  CS5536 [Geode companion] UDC
        2097  CS5536 [Geode companion] UOC
        209a  CS5536 [Geode companion] IDE
+       2625  Am79C973 [Lance/PCI PCNet/32]
+       2627  Am79C975 [Lance/PCI PCNet/32]
        3000  ELanSC520 Microcontroller
        43a0  Hudson PCI to PCI bridge (PCIE port 0)
        43a1  Hudson PCI to PCI bridge (PCIE port 1)
        0003  Control Video
        0004  PlanB Video-In
        0007  O'Hare I/O
+       000b  Apple Camera
        000c  DOS on Mac
        000e  Hydra Mac I/O
        0010  Heathrow Mac I/O
        0331  NV35 [GeForce FX 5900]
                1043 8145  V9950GE
        0332  NV35 [GeForce FX 5900XT]
-       0333  NV38 [GeForce FX 5950 Ultra]
+       0333  NV38 [GeForce FX 5950 Ultra / PCX 5950]
        0334  NV35 [GeForce FX 5900ZT]
                1462 9373  FX5900ZT-VTD128 (MS-8937)
        0338  NV35GL [Quadro FX 3000]
        1f08  TU106 [GeForce RTX 2060 Rev. A]
        1f09  TU106 [GeForce GTX 1660 SUPER]
        1f0a  TU106 [GeForce GTX 1650]
+       1f0b  TU106 [CMP 40HX]
        1f10  TU106M [GeForce RTX 2070 Mobile]
        1f11  TU106M [GeForce RTX 2060 Mobile]
        1f12  TU106M [GeForce RTX 2060 Max-Q]
        2184  TU116 [GeForce GTX 1660]
        2187  TU116 [GeForce GTX 1650 SUPER]
        2188  TU116 [GeForce GTX 1650]
+       2189  TU116 [CMP 30HX]
        2191  TU116M [GeForce GTX 1660 Ti Mobile]
        2192  TU116M [GeForce GTX 1650 Ti Mobile]
        21ae  TU116GL
        21c2  TU116
        21c4  TU116 [GeForce GTX 1660 SUPER]
        21d1  TU116BM [GeForce GTX 1660 Ti Mobile]
+       2200  GA102
        2204  GA102 [GeForce RTX 3090]
-       2205  GA102 [GeForce RTX 3080 Ti]
+       2205  GA102 [GeForce RTX 3080 20GB]
        2206  GA102 [GeForce RTX 3080]
                10de 1467  GA102 [GeForce RTX 3080]
                10de 146d  GA102 [GeForce RTX 3080 20GB]
                1462 3892  RTX 3080 10GB GAMING X TRIO
+       2208  GA102 [GeForce RTX 3080 Ti]
        222b  GA102 [GeForce RTX 3090 Engineering Sample]
        222f  GA102 [GeForce RTX 3080 11GB / 12GB Engineering Sample]
        2230  GA102GL [RTX A6000]
+       2231  GA102GL
        2235  GA102GL [RTX A40]
        2236  GA102GL
+       2237  GA102GL
        223f  GA102GL
        228b  GA104 High Definition Audio Controller
+       2302  GA103
        2321  GA103
        2482  GA104 [GeForce RTX 3070 Ti]
        2484  GA104 [GeForce RTX 3070]
        252f  GA106 [GeForce RTX 3060 Engineering Sample]
        2560  GA106M [GeForce RTX 3060 Mobile / Max-Q]
        2583  GA107 [GeForce RTX 3050]
-       25a2  GA107
+       25a0  GA107M [GeForce RTX 3050 Ti Mobile]
+       25a2  GA107M [GeForce RTX 3050 Mobile]
        25a4  GA107
        25af  GA107 [GeForce RTX 3050 Engineering Sample]
 10df  Emulex Corporation
                1028 0283  Vostro 220
                1028 04b2  Vostro 3350
                1028 04da  Vostro 3750
+               1028 05d7  Alienware X51 R2
                1028 06f2  Latitude 3470
                1028 06f3  Latitude 3570
                1028 0869  Vostro 3470
        0336  K8M890CE Host Bridge
        0340  PT900 Host Bridge
        0351  K8T890CF Host Bridge
-       0353  VX800 Host Bridge
+       0353  VX800/820-Series Chipset Host-Bridge Controller
        0364  CN896/VN896/P4M900 Host Bridge
                1043 81ce  P5VD2-VM mothervoard
        0391  VT8371 [KX133]
        0409  VX855/VX875 Host Bridge: Host Control
-       0410  VX900 Host Bridge: Host Control
+       0410  VX900 Series Host Bridge: Host Control
        0415  VT6415 PATA IDE Host Controller
                1043 838f  Motherboard
        0501  VT8501 [Apollo MVP4]
 # probably all K7VT2/4*/6
                1849 0571  K7VT series Motherboards
        0576  VT82C576 3V [Apollo Master]
-       0581  CX700/VX700 RAID Controller
+       0581  CX700/VX700/VX800/820-Series Serial ATA RAID-Controller
 # Upgrade bios to get correct ID: 5324 instead of 0581
                1106 0581  Wrong IDE ID
        0585  VT82C585VP [Apollo VP1/VPX]
        1296  P4M800 Host Bridge
        1308  PT894 Host Bridge
        1314  CN700/VN800/P4M800CE/Pro Host Bridge
-       1324  CX700/VX700 Host Bridge
+       1324  CX700/VX700-Series Error Reporting
        1327  P4M890 Host Bridge
        1336  K8M890CE Host Bridge
        1340  PT900 Host Bridge
        1353  VX800/VX820 Error Reporting
        1364  CN896/VN896/P4M900 Host Bridge
        1409  VX855/VX875 Error Reporting
-       1410  VX900 Error Reporting
+       1410  VX900 Series Error Reporting
        1571  VT82C576M/VT82C586
        1595  VT82C595/97 [Apollo VP2/97]
        1732  VT1732 [Envy24 II] PCI Multi-Channel Audio Controller
        2296  P4M800 Host Bridge
        2308  PT894 Host Bridge
        2314  CN700/VN800/P4M800CE/Pro Host Bridge
-       2324  CX700/VX700 Host Bridge
+       2324  CX700/VX700-Series Host Interface Control
        2327  P4M890 Host Bridge
        2336  K8M890CE Host Bridge
        2340  PT900 Host Bridge
        2353  VX800/VX820 Host Bus Control
        2364  CN896/VN896/P4M900 Host Bridge
        2409  VX855/VX875 Host Bus Control
-       2410  VX900 CPU Bus Controller
+       2410  VX900 Series CPU Bus Controller
        287a  VT8251 PCI to PCI Bridge
        287b  VT8251 Host Bridge
        287c  VT8251 PCIE Root Port
        287d  VT8251 PCIE Root Port
        287e  VT8237/8251 Ultra VLINK Controller
        3022  CLE266
-       3038  VT82xx/62xx UHCI USB 1.1 Controller
+       3038  VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller
                0925 1234  onboard UHCI USB 1.1 Controller
                1019 0985  P6VXA Motherboard
                1019 0a81  L7VTA v1.0 Motherboard (KT400-8235)
                1043 8080  A7V333 motherboard
-               1043 808c  VT6202 USB2.0 4 port controller
+               1043 808c  VT62xx USB1.1 4 port controller
                1043 80a1  A7V8X-X motherboard
                1043 80ed  A7V600/K8V-X/A8V Deluxe motherboard
                1179 0001  Magnia Z310
+               1234 0925  MVP3 USB Controller
                1458 5004  GA-7VAX Mainboard
                1462 5901  KT6 Delta-FIS2R (MS-6590)
                1462 7020  K8T NEO 2 motherboard
        3101  VT8653 Host Bridge
        3102  VT8662 Host Bridge
        3103  VT8615 Host Bridge
-       3104  USB 2.0
+       3104  USB 2.0 EHCI-Compliant Host-Controller
                0925 1234  onboard EHCI USB 2.0 Controller
                1019 0a81  L7VTA v1.0 Motherboard (KT400-8235)
                1043 808c  A7V8X motherboard
        3269  KT880 Host Bridge
        3282  K8T800Pro Host Bridge
        3287  VT8251 PCI to ISA Bridge
-       3288  VT8237A/VT8251 HDA Controller
+       3288  VX900/VT8xxx High Definition Audio Controller
                19da a179  ZBOX VD01
        3290  K8M890 Host Bridge
        3296  P4M800 Host Bridge
-       3324  CX700/VX700 Host Bridge
+       3324  CX700/VX700-Series DRAM Bus Control
        3327  P4M890 Host Bridge
        3336  K8M890CE Host Bridge
        3337  VT8237A PCI to ISA Bridge
        3344  CN700/P4M800 Pro/P4M800 CE/VN800 Graphics [S3 UniChrome Pro]
        3349  VT8251 AHCI/SATA 4-Port Controller
        3351  VT3351 Host Bridge
-       3353  VX800 PCI to PCI Bridge
+       3353  VX800/820 PCI to PCI Bridge
        3364  CN896/VN896/P4M900 Host Bridge
+       3365  VT630x IEEE 1394 Host Controller [Fire II/M]
        3371  CN896/VN896/P4M900 [Chrome 9 HC]
        3372  VT8237S PCI to ISA Bridge
        337a  VT8237A PCI to PCI Bridge
                1043 8374  M5A88-V EVO
                1043 8384  P8P67 Deluxe Motherboard
        3409  VX855/VX875 DRAM Bus Control
-       3410  VX900 DRAM Bus Control
+       3410  VX900 Series DRAM Bus Control
                19da a179  ZBOX nano VD01
-       3432  VL80x xHCI USB 3.0 Controller
+       3432  VL800/801 xHCI USB 3.0 Controller
        3456  VX11 Standard Host Bridge
        345b  VX11 Miscellaneous Bus
-       3483  VL805 USB 3.0 Host Controller
+       3483  VL805/806 xHCI USB 3.0 Controller
        3a01  VX11 Graphics [Chrome 645/640]
        4149  VIA VT6420 (ATA133) Controller
        4204  K8M800 Host Bridge
        4296  P4M800 Host Bridge
        4308  PT894 Host Bridge
        4314  CN700/VN800/P4M800CE/Pro Host Bridge
-       4324  CX700/VX700 Host Bridge
+       4324  CX700/VX700-Series Power Management and Testing Control
        4327  P4M890 Host Bridge
        4336  K8M890CE Host Bridge
        4340  PT900 Host Bridge
        4353  VX800/VX820 Power Management Control
        4364  CN896/VN896/P4M900 Host Bridge
        4409  VX855/VX875 Power Management Control
-       4410  VX900 Power Management and Chip Testing Control
+       4410  VX900 Series Power Management and Chip Testing Control
                19da a179  ZBOX nano VD01
        5030  VT82C596 ACPI [Apollo PRO]
        5122  VX855/VX875 Chrome 9 HCM Integrated Graphics
        5287  VT8251 Serial ATA Controller
        5290  K8M890 I/O APIC Interrupt Controller
        5308  PT894 I/O APIC Interrupt Controller
-       5324  VX800 Serial ATA and EIDE Controller
+       5324  CX700M2/VX700/VX800/820-Series Serial ATA & EIDE-Controller
        5327  P4M890 I/O APIC Interrupt Controller
        5336  K8M890CE I/O APIC Interrupt Controller
        5340  PT900 I/O APIC Interrupt Controller
        5364  CN896/VN896/P4M900 I/O APIC Interrupt Controller
        5372  VT8237/8251 Serial ATA Controller
        5409  VX855/VX875 APIC and Central Traffic Control
-       5410  VX900 APIC and Central Traffic Control
+       5410  VX900 Series APIC and Central Traffic Control
        6100  VT85C100A [Rhine II]
        6287  SATA RAID Controller
        6290  K8M890CE Host Bridge
        6353  VX800/VX820 Scratch Registers
        6364  CN896/VN896/P4M900 Security Device
        6409  VX855/VX875 Scratch Registers
-       6410  VX900 Scratch Registers
+       6410  VX900 Series Scratch Registers
                19da a179  ZBOX nano VD01
        7122  VX900 Graphics [Chrome9 HD]
        7204  K8M800 Host Bridge
        7296  P4M800 Host Bridge
        7308  PT894 Host Bridge
        7314  CN700/VN800/P4M800CE/Pro Host Bridge
-       7324  CX700/VX700 Host Bridge
+       7324  CX700/VX700-Series North-South Module Interface Control
        7327  P4M890 Host Bridge
        7336  K8M890CE Host Bridge
        7340  PT900 Host Bridge
        7353  VX800/VX820 North-South Module Interface Control
        7364  CN896/VN896/P4M900 Host Bridge
        7409  VX855/VX875 North-South Module Interface Control
-       7410  VX900 North-South Module Interface Control
+       7410  VX900 Series North-South Module Interface Control
                19da a179  ZBOX nano VD01
        8231  VT8231 [PCI-to-ISA Bridge]
        8235  VT8235 ACPI
        8305  VT8363/8365 [KT133/KM133 AGP]
-       8324  CX700/VX700 PCI to ISA Bridge
+       8324  CX700/VX700-Series Bus Control and Power Management
        8353  VX800/VX820 Bus Control and Power Management
        8391  VT8371 [KX133 AGP]
        8400  MVP4
        8409  VX855/VX875 Bus Control and Power Management
-       8410  VX900 Bus Control and Power Management
+       8410  VX900 Series Bus Control and Power Management
                19da a179  ZBOX VD01
        8500  KLE133/PLE133/PLE133T
        8501  VT8501 [Apollo MVP4 AGP]
        8a26  KL133/KL133A/KM133/KM133A [S3 ProSavage]
        8d01  PN133/PN133T [S3 Twister]
        8d04  KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
-       9001  VX900 Serial ATA Controller
+       9001  VX900 Series Serial-ATA Controller
        9082  Standard AHCI 1.0 SATA Controller
        9140  HDMI Audio Device
        9201  USB3.0 Controller
-       9530  Secure Digital Memory Card Controller
-       95d0  SDIO Host Controller
+       9530  VX800/820/900 Series Secure Digital Memory Card Controller
+       95d0  VX800/820/900 Series SDIO Host Controller
        a208  PT890 PCI to PCI Bridge Controller
        a238  K8T890 PCI to PCI Bridge Controller
        a327  P4M890 PCI to PCI Bridge Controller
-       a353  VX8xx South-North Module Interface Control
+       a353  VX8xx/900 Series South-North Module Interface Control
        a364  CN896/VN896/P4M900 PCI to PCI Bridge Controller
-       a409  VX855/VX875 USB Device Controller
-       a410  VX900 PCI Express Root Port 0
+       a409  VX855/VX875/VX900 Series USB Device Controller
+       a410  VX900 Series PCI Express Root Port 0
        b091  VT8633 [Apollo Pro266 AGP]
        b099  VT8366/A/7 [Apollo KT266/A/333 AGP]
        b101  VT8653 AGP Bridge
        b168  VT8235 PCI Bridge
        b188  VT8237/8251 PCI bridge [K8M890/K8T800/K8T890 South]
                147b 1407  KV8-MAX3 motherboard
-       b198  VT8237/VX700 PCI Bridge
+       b198  VT8237/CX700/VX700-Series PCI to PCI Bridge
        b213  VPX/VPX2 I/O APIC Interrupt Controller
        b353  VX855/VX875/VX900 PCI to PCI Bridge
-       b410  VX900 PCI Express Root Port 1
+       b410  VX900 Series PCI Express Root Port 1
        b999  [K8T890 North / VT8237 South] PCI Bridge
        c208  PT890 PCI to PCI Bridge Controller
        c238  K8T890 PCI to PCI Bridge Controller
        c327  P4M890 PCI to PCI Bridge Controller
        c340  PT900 PCI to PCI Bridge Controller
-       c353  VX800/VX820 PCI Express Root Port
+       c353  VX800/820-Series PCI-Express Root (PCI-to-PCI Virtual Bridge)
        c364  CN896/VN896/P4M900 PCI to PCI Bridge Controller
        c409  VX855/VX875 EIDE Controller
-       c410  VX900 PCI Express Root Port 2
+       c410  VX900 Series PCI Express Root Port 2
        d104  VT8237R USB UDCI Controller
        d208  PT890 PCI to PCI Bridge Controller
        d213  VPX/VPX2 PCI to PCI Bridge Controller
        d238  K8T890 PCI to PCI Bridge Controller
        d340  PT900 PCI to PCI Bridge Controller
-       d410  VX900 PCI Express Root Port 3
+       d410  VX900 Series PCI Express Root Port 3
        e208  PT890 PCI to PCI Bridge Controller
        e238  K8T890 PCI to PCI Bridge Controller
        e340  PT900 PCI to PCI Bridge Controller
-       e353  VX800/VX820 PCI Express Root Port
-       e410  VX900 PCI Express Physical Layer Electrical Sub-block
+       e353  VX800/820-Series PCI-Express Root Port 0
+       e410  VX900 Series PCI Express Physical Layer Electrical Sub-block
        f208  PT890 PCI to PCI Bridge Controller
        f238  K8T890 PCI to PCI Bridge Controller
        f340  PT900 PCI to PCI Bridge Controller
-       f353  VX800/VX820 PCI Express Root Port
+       f353  VX800/820-Series PCI-Express Root Port 1
+       f410  VX900 Series PCI UART Port 0-3
 1107  Stratus Computers
        0576  VIA VT82C570MV [Apollo] (Wrong vendor ID!)
 1108  Proteon, Inc.
        0002  Dual PCI to RapidIO Bridge
        000b  POET Serial RapidIO Bridge
        000d  POET PSDMS Device
-1135  Fuji Xerox Co Ltd
+1135  FUJIFILM Business Innovation Corp.
        0001  Printer controller
 1136  Momentum Data Systems
        0002  PCI-JTAG
 11aa  Actel
 # Nee Galileo Technology, Inc.
 11ab  Marvell Technology Group Ltd.
+       0100  88F3700 [Armada 3700 Family] ARM SoC
        0146  GT-64010/64010A System Controller
        0f53  88E6318 Link Street network controller
        11ab  MV88SE614x SATA II PCI-E controller
        6480  MV64460/64461/64462 System Controller
                1775 c200  C2K CompactPCI single board computer
        6485  MV64460/64461/64462 System Controller, Revision B
+       6820  88F6820 [Armada 385] ARM SoC
+       6828  88F6828 [Armada 388] ARM SoC
        7042  88SX7042 PCI-e 4-port SATA-II
                16b8 434b  Tempo SATA E4P
        7810  MV78100 [Discovery Innovation] ARM SoC
                11ad 0003  LNE100TX
                11ad f003  LNE100TX
                11ad ffff  LNE100TX
-               1385 f004  FA310TX
+               1385 f004  FA310/TX LAN 10/100 PCI Ethernet Adapter
                2646 f002  KNE110TX EtheRx Fast Ethernet
        c115  LNE100TX [Linksys EtherFast 10/100]
                11ad c001  LNE100TX [ver 2.0]
        8073  PM8073 Tachyon SPCve 12G 16-port SAS/SATA controller
        8531  PM8531 PFX 24xG3 Fanout PCIe Switches
        8546  PM8546 B-FEIP PSX 96xG3 PCIe Storage Switch
+       8562  PM8562 Switchtec PFX-L 32xG3 Fanout-Lite PCIe Gen3 Switch
 11f9  I-Cube Inc
 11fa  Kasan Electronics Company, Ltd.
 11fb  Datel Inc
 1414  Microsoft Corporation
        0001  MN-120 (ADMtek Centaur-C based)
        0002  MN-130 (ADMtek Centaur-P based)
+# Virtual Video Card Device for Windows Remote Desktop (RDP)
+       008c  Basic Render Driver
        5353  Hyper-V virtual VGA
        5801  XMA Decoder (Xenon)
        5802  SATA Controller - CdRom (Xenon)
                1028 2097  EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 1.92TB
                1028 2098  EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 3.84TB
                1028 2099  EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB
+               1028 2118  Ent NVMe v2 AGN FIPS MU U.2 1.6TB
+               1028 2119  Ent NVMe v2 AGN MU U.2 1.6TB
+               1028 2120  Ent NVMe v2 AGN FIPS MU U.2 3.2T
+               1028 2121  Ent NVMe v2 AGN MU U.2 3.2TB
+               1028 2122  Ent NVMe v2 AGN FIPS MU U.2 6.4TB
+               1028 2123  Ent NVMe v2 AGN MU U.2 6.4TB
+               1028 2124  Ent NVMe v2 AGN FIPS MU U.2 6.4TB
+               1028 2125  Ent NVMe v2 AGN MU U.2 12.8TB
+               1028 2126  Ent NVMe v2 AGN FIPS RI U.2 1.92TB
+               1028 2127  Ent NVMe v2 AGN RI U.2 1.92TB
+               1028 2128  Ent NVMe v2 AGN FIPS RI U.2 3.84TB
+               1028 2129  Ent NVMe v2 AGN RI U.2 3.84TB
+               1028 2130  Ent NVMe v2 AGN FIPS RI U.2 7.68TB
+               1028 2131  Ent NVMe v2 AGN RI U.2 7.68TB
+               1028 2132  Ent NVMe v2 AGN FIPS RI U.2 15.36TB
+               1028 2133  Ent NVMe v2 AGN RI U.2 15.36TB
        ecec  Exynos 8895 PCIe Root Complex
 144e  OLITEC
 144f  Askey Computer Corp.
 1456  Advanced Hardware Architectures
 1457  Nuera Communications Inc
 1458  Gigabyte Technology Co., Ltd
+       3483  USB 3.0 Controller (VIA VL80x-based xHCI Controller)
 1459  DOOIN Electronics
 145a  Escalate Networks Inc
 145b  PRAIM SRL
        e836  M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner
        f436  AVerTV Hybrid+FM
 1462  Micro-Star International Co., Ltd. [MSI]
+# VIA Driver-inf
+       3483  MSI USB 3.0 (VIA VL80x-based xHCI USB Controller)
        aaf0  Radeon RX 580 Gaming X 8G
 1463  Fast Corporation
 1464  Interactive Circuits & Systems Ltd
                103c 0890  NC6000 laptop
                103c 099c  NX6110/NC6120
                10cf 1279  LifeBook E8010D
-       165f  NetXtreme BCM5720 2-port Gigabit Ethernet PCIe
+       165f  NetXtreme BCM5720 Gigabit Ethernet PCIe
                1028 04f7  PowerEdge R320 server
                1028 08fd  PowerEdge R6515/R7515 LOM
                1028 08ff  PowerEdge Rx5xx LOM Board
        16d4  BCM57402 NetXtreme-E Ethernet Partition
        16d5  BCM57407 NetXtreme-E 10GBase-T Ethernet Controller
        16d6  BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
+               14e4 1202  BCM957412M4122C OCP 1x25G Type1 wRoCE
                14e4 4120  NetXtreme E-Series Advanced Dual-port 10Gb SFP+ Ethernet Network Daughter Card
                14e4 4126  NetXtreme-E Dual-port 10G SFP+ Ethernet OCP 3.0 Adapter (BCM957412N4120C)
                152d 8b20  BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
                152d 8b22  BCM57412 NetXtreme-E 25Gb RDMA Ethernet Controller
        16d7  BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller
-               14e4 1202  BCM957412M4122C OCP 1x25G Type1 wRoCE
                14e4 1402  BCM957414A4142CC 10Gb/25Gb Ethernet PCIe
                14e4 1404  BCM957414M4142C OCP 2x25G Type1 wRoCE
                14e4 4140  NetXtreme E-Series Advanced Dual-port 25Gb SFP28 Network Daughter Card
        1750  BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet
                14e4 2100  NetXtreme-E Dual-port 100G QSFP56 Ethernet PCIe4.0 x16 Adapter (BCM957508-P2100G)
                14e4 5208  NetXtreme-E Dual-port 100G QSFP56 Ethernet OCP 3.0 Adapter (BCM957508-N2100G)
+               14e4 df24  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet
        1751  BCM57504 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet
        1752  BCM57502 NetXtreme-E 10Gb/25Gb/40Gb/50Gb Ethernet
        1800  BCM57502 NetXtreme-E Ethernet Partition
        1801  BCM57504 NetXtreme-E Ethernet Partition
        1802  BCM57508 NetXtreme-E Ethernet Partition
+               14e4 df24  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Partition
        1803  BCM57502 NetXtreme-E RDMA Partition
        1804  BCM57504 NetXtreme-E RDMA Partition
-       1805  BCM57508 NetXtreme-E RDMA Partition
+       1805  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Partition
+               14e4 df24  NetXtreme-E NGM2100D BCM57508 2x100G KR Mezz RDMA Partition
        1806  BCM5750X NetXtreme-E Ethernet Virtual Function
+               14e4 df24  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function
        1807  BCM5750X NetXtreme-E RDMA Virtual Function
+               14e4 df24  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function
+       1808  BCM5750X NetXtreme-E Ethernet Virtual Function
+               14e4 df24  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function
+       1809  BCM5750X NetXtreme-E RDMA Virtual Function
+               14e4 df24  BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function
        2711  BCM2711 PCIe Bridge
        3352  BCM3352
        3360  BCM3360
        9260  RCIM-II Real-Time Clock & Interrupt Module
        9271  RCIM-III Real-Time Clock & Interrupt Module (PCIe)
        9272  Pulse Width Modulator Card
+       9273  RCIM-IV Real-Time Clock & Interrupt Module (PCIe)
        9277  5 Volt Delta Sigma Converter Card
        9278  10 Volt Delta Sigma Converter Card
        9287  Analog Output Card
                15b3 0021  MCX4421A-ACQN ConnectX-4 Lx EN OCP,2x25G
                15b3 0025  ConnectX-4 Lx 25 GbE Dual Port SFP28 rNDC
                193d 100a  620F-B
+# NIC-ETH540F-LP-2P SFP+ Ethernet Card
+               193d 1023  NIC-ETH540F-LP-2P
                193d 1031  NIC-ETH640i-Mb-2x25G
+# NIC-ETH640F-3S-2P OCP3.0 Card
+               193d 1083  NIC-ETH640F-3S-2P
+# NIC-ETH540F-3S-2P OCP3.0 2x10G Card
+               193d 1084  NIC-ETH540F-3S-2P
        1016  MT27710 Family [ConnectX-4 Lx Virtual Function]
        1017  MT27800 Family [ConnectX-5]
                15b3 0006  ConnectX®-5 EN network interface card, 100GbE single-port QSFP28, PCIe3.0 x16, tall bracket; MCX515A-CCAT
        2086  CryptoServer Se-Series Hardware Security Module
        c040  CryptoServer CSe-Series Hardware Security Module
        c051  CryptoServer Se-Series Gen2 Hardware Security Module
+       c070  u.trust Anchor Hardware Security Module cs7.2 Series
+       c071  u.trust Anchor Hardware Security Module cs7.3 Series
+       c072  u.trust Anchor Hardware Security Module cs7.3 Series Virtual Function
 # nee Atheros Communications, Inc.
 168c  Qualcomm Atheros
        0007  AR5210 Wireless Network Adapter [AR5000 802.11a]
        ab08  21x4x DEC-Tulip compatible 10/100 Ethernet
        ab09  21x4x DEC-Tulip compatible 10/100 Ethernet
 173b  Altima (nee Broadcom)
+       0001  AC1002 PCI Gigabit Ethernet controller
        03e8  AC1000 Gigabit Ethernet
        03e9  AC1001 Gigabit Ethernet
        03ea  AC9100 Gigabit Ethernet
        9750  GL9750 SD Host Controller
        e763  GL9763E eMMC Controller
 17aa  Lenovo
+       3181  ThinkCentre M75n IoT
        402b  Intel 82599ES 10Gb 2-port Server Adapter X520-2
 17ab  Phillips Components
 17af  Hightech Information System Ltd.
        1242  ASM1142 USB 3.1 Host Controller
        1343  ASM1143 USB 3.1 Host Controller
        2142  ASM2142 USB 3.1 Host Controller
+               1462 7a72  H270 PC MATE
        3242  ASM3242 USB 3.2 Host Controller
 1b26  Netcope Technologies, a.s.
        c132  COMBO-LXT155
        0601  NumaChip N601
        0602  NumaChip N602
 1b4b  Marvell Technology Group Ltd.
+# device 1b4b:0100 reports incorrect vendor id due to hw erratum (correct is 11ab)
+       0100  88F3700 [Armada 3700 Family] ARM SoC
        0640  88SE9128 SATA III 6Gb/s RAID Controller
        2241  88NR2241 Non-Volatile memory controller
                1028 2112  BOSS-N1 Monolithic
        1002  PM1553-5 (PC/104+ MIL-STD-1553 Interface Card)
        1004  AB3000 Series Rugged Computer
        1005  PE1000 (Multi-Protocol PCIe/104 Interface Card)
+       1006  webCS Wireless Aircraft Communications Server
+       1007  AB3000 Series Rugged Computer (Series N)
+       1008  ME1000 mPCIe Avionics Interface Card
+       100a  NG1 Series Avionics Converter
        1101  OmniBus II PCIe Multi-Protocol Interface Card
        1102  OmniBusBox II Multi-Protocol Interface Core
        1103  OmniBus II cPCIe/PXIe Multi-Protocol Interface Card
+       1200  NG3 Series Mil-Std-1553 Interface
+       1201  NG3 Series ARINC 429 Interface
+       1202  NG3 Series Avionics Discrete & Serial Interface
+       1203  NG3 Series Avionics Discrete Interface
 1bd4  Inspur Electronic Information Industry Co., Ltd.
        0911  Arria10_PCIe_F10A1150
 1bee  IXXAT Automation GmbH
        001b  FD720
        001c  FD922
        001d  Vega
+       001f  FD940
 1c28  Lite-On IT Corp. / Plextor
        0122  M6e PCI Express SSD [Marvell 88SS9183]
 # previously Fiberblaze
        1284  PC300 NVMe Solid State Drive 512GB
        1285  PC300 NVMe Solid State Drive 1TB
        1327  BC501 NVMe Solid State Drive 512GB
+       1339  BC511
        1504  SC300 512GB M.2 2280 SATA Solid State Drive
        1527  PC401 NVMe Solid State Drive 256GB
        243b  PE6110 NVMe Solid State Drive
        0009  ExaNIC X25
        000a  ExaNIC X100
        000b  ExaNIC V9P
+       000c  ExaNIC V9P-3
        0100  ExaDISK FX1
 1cf0  Akitio
 1cf7  Subspace Dynamics
        0101  Codensity D400 SSD
        0102  Codensity D408 PCIe Gen4 NVMe SSD
        0202  Codensity T408 Video Encoding-Decoding Accelerator
-1d87  Fuzhou Rockchip Electronics Co., Ltd
+# nee Fuzhou Rockchip Electronics Co., Ltd
+1d87  Rockchip Electronics Co., Ltd
        0100  RK3399 PCI Express Root Port
        1808  RK1808 Neural Network Processor Card
+       3566  RK3568 Remote Signal Processor
 1d8f  Enyx
 1d93  YADRO
 1d94  Chengdu Haiguang IC Design Co., Ltd.
        0000  TSP100 Tensor Streaming Processor
 1de1  Tekram Technology Co.,Ltd.
        0391  TRM-S1040 [DC-315 / DC-395 series]
-       2020  DC-390
+       2020  DC-390 Series SCSI Adapter [AMD Am53C974]
        690c  690c
        dc29  DC290
 1de5  Eideticom, Inc
        0206  ACE-NIC200 Programmable Network Accelerator
                1df3 0000  Maintenance Mode
                1df3 0001  ENA2200F
+       0207  ACE-NIC50RN Programmable Network Accelerator
+       0208  ACE-NIC100RN Programmable Network Accelerator
 1df7  opencpi.org
        0001  ml605
        0002  alst4
 1eae  XFX Limited
 1eb1  VeriSilicon Inc
        1001  Video Accelerator
+1ed3  Yeston
 1ed8  Digiteq Automotive
        0101  FG4 PCIe Frame Grabber
 1ed9  Myrtle.ai
        2010  8142 100VG/AnyLAN
 2646  Kingston Technology Company, Inc.
        0010  HyperX Predator PCIe AHCI SSD
+       2262  KC2000 NVMe SSD
        2263  A2000 NVMe SSD
        5008  U-SNS8154P3 NVMe SSD
        500d  OM3PDP3 NVMe SSD
        7053  CH353 PCI Dual Serial and Parallel Ports Controller
        7073  CH356 PCI Quad Serial and Parallel Ports Controller
        7173  CH355 PCI Quad Serial Port Controller
-434e  CAST Navigation LLC
+434e  Cornelis Networks
+43bc  Tiger Lake-H PCIe Root Port #5
 4444  Internext Compression Inc
        0016  iTVC16 (CX23416) Video Decoder
                0070 0003  WinTV PVR 250
        0406  Haswell Integrated Graphics Controller
        040a  Xeon E3-1200 v3 Processor Integrated Graphics Controller
        0412  Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
+               1028 05d7  Alienware X51 R2
                103c 1998  EliteDesk 800 G1
                17aa 3098  ThinkCentre E73
                17aa 309f  ThinkCentre M83
        06ab  Comet Lake PCH Serial IO SPI Controller #1
        06ac  Comet Lake PCI Express Root Port #21
        06b0  Comet Lake PCI Express Root Port #9
+       06bd  Comet Lake PCIe Port #6
        06c0  Comet Lake PCI Express Root Port #17
        06c8  Comet Lake PCH cAVS
+       06d2  Comet Lake SATA AHCI Controller
        06e0  Comet Lake HECI Controller
+       06e3  Comet Lake Keyboard and Text (KT) Redirection
        06e8  Comet Lake PCH Serial IO I2C Controller #0
        06e9  Comet Lake PCH Serial IO I2C Controller #1
        06ea  Comet Lake PCH Serial IO I2C Controller #2
                1028 2103  NVMe RI U.2 3.84TB (P5500)
                1028 2104  NVMe RI U.2 7.68TB (P5500)
                8086 8008  NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P5510)
+               8086 8d08  NVMe Datacenter SSD [3DNAND] VE 2.5" U.2 (P5316)
+               8086 8d1d  NVMe Datacenter SSD [3DNAND] VE E1.L 9.5/18mm (P5316)
        0be0  Atom Processor D2xxx/N2xxx Integrated Graphics Controller
        0be1  Atom Processor D2xxx/N2xxx Integrated Graphics Controller
                105b 0d7c  D270S/D250S Motherboard
        0bf6  Atom Processor D2xxx/N2xxx DRAM Controller
        0bf7  Atom Processor D2xxx/N2xxx DRAM Controller
        0c00  4th Gen Core Processor DRAM Controller
+               1028 05d7  Alienware X51 R2
                103c 1998  EliteDesk 800 G1
                17aa 3098  ThinkCentre E73
                17aa 309f  ThinkCentre M83
                18d4 0c07  I350 1Gb 2-port RJ45 OCP Mezz Card MOP41-I-1GT2
                193d 1005  360T-B
                193d 1007  360T-L
+# NIC-ETH360T-3S-4P OCP3.0 4x1G Base-T Card
+               193d 1080  NIC-ETH360T-3S-4P
                1bd4 001d  1G base-T QP EP014Ti1 Adapter
                1bd4 0035  1G base-T QP EP014Ti1 Adapter
                8086 0001  Ethernet Server Adapter I350-T4
                17aa 4002  ThinkServer X710-2 AnyFabric for 10GbE SFP+
                193d 1020  NIC-ETH561F-sL-4x10G
                193d 1021  NIC-ETH561F-sL-2x10G
+# NIC-ETH561F-3S-2P OCP3.0 2x10G SFP+ Card
+               193d 1081  NIC-ETH561F-3S-2P
                19e5 d11c  Ethernet 2-port X710 10Gb SFP+ Adapter SP330
+               1bd4 0042  10G SFP+ DP EP102Fi4 Adapter
                1bd4 0056  Ethernet Network Adapter X710-BM2 for OCP NIC 3.0
                8086 0000  Ethernet Converged Network Adapter X710
                8086 0001  Ethernet Converged Network Adapter X710-4
                8086 000b  Ethernet 100G 2P E810-C Adapter
                8086 000c  Ethernet 100G 2P E810-C OCP
                8086 000d  Ethernet Network Adapter E810-L-Q2 for OCP 3.0
+               8086 000e  Ethernet Network Adapter E810-2C-Q2
        1593  Ethernet Controller E810-C for SFP
                1137 02c3  E810XXVDA4 4x25/10 GbE SFP28 PCIe NIC
                8086 0002  Ethernet Network Adapter E810-L-2
        15b6  DSL6540 USB 3.1 Controller [Alpine Ridge]
        15b7  Ethernet Connection (2) I219-LM
        15b8  Ethernet Connection (2) I219-V
+               1462 7a72  H270 PC MATE
        15b9  Ethernet Connection (3) I219-LM
        15bb  Ethernet Connection (7) I219-LM
        15bc  Ethernet Connection (7) I219-V
                1137 02c2  X710T4LG 4x10 GbE RJ45 PCIe NIC
                1137 02d9  Ethernet Network Adapter X710-T2L OCP 3.0
                1137 02da  Ethernet Network Adapter X710-T4L OCP 3.0
+# NIC-ETH565T-3S-2P OCP3.0 2x10G Base-T Card
+               193d 1082  NIC-ETH565T-3S-2P
                8086 0000  Ethernet Network Adapter X710-TL
                8086 0001  Ethernet Network Adapter X710-T4L
                8086 0002  Ethernet Network Adapter X710-T4L
                103c 825b  OMEN-17-w001nv
        1911  Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
                1028 0869  Vostro 3470
+               1462 7a72  H270 PC MATE
                17aa 2247  ThinkPad T570
                17aa 224f  ThinkPad X1 Carbon 5th Gen
                17aa 225d  ThinkPad T480
                1cb8 0002  Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC6600 Fixed Port
                1cb8 0003  Omni-Path HFI Adapter 100 Series, 2 Port, 2 PCIe x16, Earth Simulation QSFP28
                1cb8 0004  Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600E QSFP28
+               434e 0001  Omni-Path HFI 100 Series, 1 Port, OCP 3.0 Adapter
                8086 2628  Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16
                8086 2629  Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x8
                8086 262a  Omni-Path HFI Adapter 100 Series, 2 Ports, Split PCIe x16
        277c  82975X Memory Controller Hub
                1043 8178  P5WDG2 WS Professional motherboard
        277d  82975X PCI Express Root Port
+       2780  82915G/GV/GL/910GL [Grantsdale] Graphics Device
        2782  82915G Integrated Graphics Controller
                1043 2582  P5GD1-VW Mainboard
                1734 105b  Scenic W620
                8086 1216  WiMAX/WiFi Link 5150 ABG
                8086 1311  WiMAX/WiFi Link 5150 AGN
                8086 1316  WiMAX/WiFi Link 5150 ABG
+       438b  Tiger Lake-H LPC/eSPI Controller
+       43a3  Tiger Lake-H SMBus Controller
+       43a4  Tiger Lake-H SPI Controller
+       43b0  Tiger Lake-H PCI Express Root Port #9
+       43bc  Tiger Lake-H PCI Express Root Port #5
+       43c8  Tiger Lake-H HD Audio Controller
+       43e0  Tiger Lake-H Management Engine Interface
+       43e8  Tiger Lake-H Serial IO I2C Controller #0
+       43ed  Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller
+       43ef  Tiger Lake-H Shared SRAM
+       43f0  Wi-Fi 6 AX201
        444e  Turbo Memory Controller
        467f  Volume Management Device NVMe RAID Controller
        4680  AlderLake-S GT1
                8086 0001  EtherExpress PRO/100 Server Ethernet Adapter
        530d  80310 (IOP) IO Processor
        5502  Ethernet Controller (2) I225-LMvP
+       5504  Ethernet Controller I226-K
        5845  QEMU NVM Express Controller
                1af4 1100  QEMU Virtual Machine
        5900  Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
        590c  Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
        590f  Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
                1462 7a68  B250 KRAIT GAMING (MS-7A68)
+               1462 7a72  H270 PC MATE
        5910  Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
        5911  Xeon E3-1200 v6/7th Gen Core Processor Gaussian Mixture Model
        5912  HD Graphics 630
+               1462 7a72  H270 PC MATE
        5914  Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
                17aa 225d  ThinkPad T480
        5916  HD Graphics 620
        8c00  8 Series/C220 Series Chipset Family 4-port SATA Controller 1 [IDE mode]
        8c01  8 Series Chipset Family 4-port SATA Controller 1 [IDE mode] - Mobile
        8c02  8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode]
+               1028 05d7  Alienware X51 R2
                103c 1998  EliteDesk 800 G1
                17aa 3098  ThinkCentre E73
                17aa 309f  ThinkCentre M83
        8c1e  8 Series/C220 Series Chipset Family PCI Express Root Port #8
        8c1f  8 Series/C220 Series Chipset Family PCI Express Root Port #8
        8c20  8 Series/C220 Series Chipset High Definition Audio Controller
+               1028 05d7  Alienware X51 R2
                103c 1909  ZBook 15
                103c 1998  EliteDesk 800 G1
                17aa 220e  ThinkPad T440p
                17aa 309f  ThinkCentre M83
        8c21  8 Series/C220 Series Chipset High Definition Audio Controller
        8c22  8 Series/C220 Series Chipset Family SMBus Controller
+               1028 05d7  Alienware X51 R2
                103c 1909  ZBook 15
                103c 1998  EliteDesk 800 G1
                17aa 220e  ThinkPad T440p
        8c23  8 Series Chipset Family CHAP Counters
        8c24  8 Series Chipset Family Thermal Management Controller
        8c26  8 Series/C220 Series Chipset Family USB EHCI #1
+               1028 05d7  Alienware X51 R2
                103c 1909  ZBook 15
                103c 1998  EliteDesk 800 G1
                17aa 220e  ThinkPad T440p
                17aa 309f  ThinkCentre M83
                2210 17aa  ThinkPad T540p
        8c2d  8 Series/C220 Series Chipset Family USB EHCI #2
+               1028 05d7  Alienware X51 R2
                103c 1909  ZBook 15
                103c 1998  EliteDesk 800 G1
                17aa 220e  ThinkPad T440p
                17aa 3098  ThinkCentre E73
                17aa 309f  ThinkCentre M83
        8c31  8 Series/C220 Series Chipset Family USB xHCI
+               1028 05d7  Alienware X51 R2
                103c 1909  ZBook 15
                103c 1998  EliteDesk 800 G1
                17aa 220e  ThinkPad T440p
        8c33  8 Series/C220 Series Chipset Family LAN Controller
        8c34  8 Series/C220 Series Chipset Family NAND Controller
        8c3a  8 Series/C220 Series Chipset Family MEI Controller #1
+               1028 05d7  Alienware X51 R2
                103c 1909  ZBook 15
                103c 1998  EliteDesk 800 G1
                17aa 220e  ThinkPad T440p
        8c48  8 Series/C220 Series Chipset Family LPC Controller
        8c49  HM86 Express LPC Controller
        8c4a  H87 Express LPC Controller
+               1028 05d7  Alienware X51 R2
        8c4b  HM87 Express LPC Controller
        8c4c  Q85 Express LPC Controller
                17aa 309f  ThinkCentre M83
        9622  Integrated RAID
        9641  Integrated RAID
        96a1  Integrated RAID
+       9a01  11th Gen Core Processor PCIe Controller #1
        9a03  TigerLake-LP Dynamic Tuning Processor Participant
        9a09  11th Gen Core Processor PCIe Controller
        9a0b  Volume Management Device NVMe RAID Controller
        9a0d  Tiger Lake-LP Telemetry Aggregator
+       9a0f  11th Gen Core Processor PCIe Controller #0
+       9a11  GNA Scoring Accelerator module
        9a13  Tiger Lake-LP Thunderbolt 4 USB Controller
        9a14  11th Gen Core Processor Host Bridge/DRAM Registers
        9a17  Tiger Lake-H Thunderbolt 4 USB Controller
        9a21  Tiger Lake-H Thunderbolt 4 NHI #1
        9a23  Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #0
        9a25  Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #1
+       9a26  11th Gen Core Processor Host Bridge/DRAM Registers
        9a27  Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #2
        9a29  Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #3
        9a2b  Tiger Lake-H Thunderbolt 4 PCI Express Root Port #0
        9a2f  Tiger Lake-H Thunderbolt 4 PCI Express Root Port #2
        9a31  Tiger Lake-H Thunderbolt 4 PCI Express Root Port #3
        9a33  Tiger Lake Trace Hub
+       9a36  11th Gen Core Processor Host Bridge/DRAM Registers
        9a49  TigerLake GT2 [Iris Xe Graphics]
+       9a60  TigerLake GT2 [Iris Xe Graphics]
+       9a68  Tiger Lake-H UHD Graphics
        9b41  CometLake-U GT2 [UHD Graphics]
        9b44  10th Gen Core Processor Host Bridge/DRAM Registers
        9b53  Comet Lake-S 6c Host Bridge/DRAM Controller
        a252  Lewisburg SSATA Controller [AHCI mode]
        a256  Lewisburg SSATA Controller [RAID mode]
        a282  200 Series PCH SATA controller [AHCI mode]
+               1462 7a72  H270 PC MATE
        a286  200 Series PCH SATA controller [RAID mode]
        a290  200 Series PCH PCI Express Root Port #1
        a291  200 Series PCH PCI Express Root Port #2
        a292  200 Series PCH PCI Express Root Port #3
        a293  200 Series PCH PCI Express Root Port #4
        a294  200 Series PCH PCI Express Root Port #5
+               1462 7a72  H270 PC MATE
        a295  200 Series PCH PCI Express Root Port #6
        a296  200 Series PCH PCI Express Root Port #7
+               1462 7a72  H270 PC MATE
        a297  200 Series PCH PCI Express Root Port #8
        a298  200 Series PCH PCI Express Root Port #9
+               1462 7a72  H270 PC MATE
        a299  200 Series PCH PCI Express Root Port #10
        a29a  200 Series PCH PCI Express Root Port #11
        a29b  200 Series PCH PCI Express Root Port #12
        a29f  200 Series PCH PCI Express Root Port #16
        a2a0  200 Series/Z370 Chipset Family P2SB
        a2a1  200 Series/Z370 Chipset Family Power Management Controller
+               1462 7a72  H270 PC MATE
        a2a3  200 Series/Z370 Chipset Family SMBus Controller
+               1462 7a72  H270 PC MATE
        a2a4  200 Series/Z370 Chipset Family SPI Controller
        a2a5  200 Series/Z370 Chipset Family Gigabit Ethernet Controller
        a2a6  200 Series/Z370 Chipset Family Trace Hub
        a2a9  200 Series/Z370 Chipset Family Serial IO SPI Controller #0
        a2aa  200 Series/Z370 Chipset Family Serial IO SPI Controller #1
        a2af  200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
+               1462 7a72  H270 PC MATE
        a2b1  200 Series PCH Thermal Subsystem
+               1462 7a72  H270 PC MATE
        a2ba  200 Series PCH CSME HECI #1
+               1462 7a72  H270 PC MATE
        a2bb  200 Series PCH CSME HECI #2
        a2c4  200 Series PCH LPC Controller (H270)
+               1462 7a72  H270 PC MATE
        a2c5  200 Series PCH LPC Controller (Z270)
        a2c6  200 Series PCH LPC Controller (Q270)
        a2c7  200 Series PCH LPC Controller (Q250)
        a2ed  200 Series PCH PCI Express Root Port #23
        a2ee  200 Series PCH PCI Express Root Port #24
        a2f0  200 Series PCH HD Audio
+               1462 7a72  H270 PC MATE
+               1462 fa72  H270 PC MATE
        a304  H370 Chipset LPC/eSPI Controller
                1028 0869  Vostro 3470
        a305  Z390 Chipset LPC/eSPI Controller
        a324  Cannon Lake PCH SPI Controller
                1028 0869  Vostro 3470
        a328  Cannon Lake PCH Serial IO UART Host Controller
+       a32b  Cannon Lake PCH SPI Host Controller
        a32c  Cannon Lake PCH PCI Express Root Port #21
        a32d  Cannon Lake PCH PCI Express Root Port #22
        a32e  Cannon Lake PCH PCI Express Root Port #23
        d157  Core Processor System Control and Status Registers
        d158  Core Processor Miscellaneous Registers
        f1a5  SSD 600P Series
+# M.2 22 x 80mm, NVMe
+               8086 390a  SSDPEKKW256G7 256GB
        f1a6  SSD Pro 7600p/760p/E 6100p Series
                8086 390b  SSD Pro 7600p/760p/E 6100p Series [NVM Express]
        f1a8  SSD 660P Series
        0001  SG2010 PCI over Starfabric Bridge
        0002  SG2010 PCI to Starfabric Gateway
        0003  SG1010 Starfabric Switch and PCI Bridge
+9a11  Tiger Lake-H Gaussian & Neural Accelerator
 9d32  Beijing Starblaze Technology Co. Ltd.
        0000  STAR1000 PCIe NVMe SSD Controller
        1001  STAR1000P PCIe NVMe SSD Controller
@@ -33476,6 +33656,7 @@ f1d0  AJA Video
        eb23  Kona 1
        eb24  Kona HDMI
        eb25  Corvid 44 12g
+       eb26  T-Tap Pro
        efac  Xena SD-MM/SD-22-MM
        facd  Xena HD-MM
 f5f5  F5 Networks, Inc.
index 57e6ce27ed519114d017c0e80df2af2bc0556bdf..607efd8e05f05b2d7303a20bdc255bc01a860663 100644 (file)
  <tr class="even"><td>Alpha Telecom Inc</td><td>ATD</td><td>09/26/1997</td> </tr>
  <tr class="odd"><td>Alpha-Top Corporation</td><td>ATP</td><td>12/04/1996</td> </tr>
  <tr class="even"><td>AlphaView LCD</td><td>ALV</td><td>11/01/2008</td> </tr>
- <tr class="odd"><td>Alpine Electronics, Inc.</td><td>APE</td><td>01/22/2013</td> </tr>
- <tr class="even"><td>Alps Electric Company Ltd</td><td>ALP</td><td>11/29/1996</td> </tr>
- <tr class="odd"><td>Alps Electric Inc</td><td>AUI</td><td>11/29/1996</td> </tr>
+ <tr class="odd"><td>ALPS ALPINE CO., LTD.</td><td>APE</td><td>01/22/2013</td> </tr>
+ <tr class="even"><td>ALPS ALPINE CO., LTD.</td><td>ALP</td><td>11/29/1996</td> </tr>
+ <tr class="odd"><td>ALPS ALPINE CO., LTD.</td><td>AUI</td><td>11/29/1996</td> </tr>
  <tr class="even"><td>Alta Research Corporation</td><td>ARC</td><td>11/29/1996</td> </tr>
  <tr class="odd"><td>Altec Corporation</td><td>ALC</td><td>08/04/1998</td> </tr>
  <tr class="even"><td>Altec Lansing</td><td>ALJ</td><td>01/13/2000</td> </tr>
  <tr class="even"><td>NZXT (PNP same EDID)_</td><td>NXT</td><td>07/15/2020</td> </tr>
  <tr class="odd"><td>Unicompute Technology Co., Ltd.</td><td>UTC</td><td>10/19/2020</td> </tr>
  <tr class="even"><td>TECHNOGYM S.p.A.</td><td>TGW</td><td>01/08/2021</td> </tr>
+ <tr class="odd"><td>Clover Electronics</td><td>CLR</td><td>02/02/2021</td> </tr>
+ <tr class="even"><td>Kyokko Communication System Co., Ltd.</td><td>KTS</td><td>02/18/2021</td> </tr>
+ <tr class="odd"><td>Terumo Corporation</td><td>TMO</td><td>02/02/2021</td> </tr>
+ <tr class="even"><td>Micro-Star Int&#039;l Co., Ltd.</td><td>CND</td><td>02/17/2021</td> </tr>
+ <tr class="odd"><td>Newline Interactive Inc.</td><td>NWL</td><td>12/03/2020</td> </tr>
+ <tr class="even"><td>CORSAIR MEMORY Inc.</td><td>CRM</td><td>02/05/2021</td> </tr>
       </tbody>
     </table>
   </body>
index 5e28693d311d847040d32d2cccdc83b8fd77c7a2..d1661880852f3baab1bd072a306f8c3003f1c5d0 100644 (file)
@@ -9,8 +9,8 @@
 #      The latest version can be obtained from
 #              http://www.linux-usb.org/usb.ids
 #
-# Version: 2021.01.29
-# Date:    2021-01-29 20:34:11
+# Version: 2021.02.19
+# Date:    2021-02-19 20:34:10
 #
 
 # Vendors, devices and interfaces. Please keep sorted.
        ffff  Mio DigiWalker Sync
 3344  Leaguer Microelectronics (LME)
        3744  OEM PC Remote
+3384  System76
+       0000  Thelio Io (thelio-io)
+       0001  Launch Configurable Keyboard (launch_1)
 348f  ISY
        2322  Wireless Presenter
 3504  Micro Star
index 959815a8f183c38d6db4fbba06a19dded3fbccb7..86137a951de82bfe6f668629e0a4663b519ab51a 100644 (file)
@@ -28,6 +28,9 @@
     <para><filename>/run/systemd/journald.conf.d/*.conf</filename></para>
     <para><filename>/usr/lib/systemd/journald.conf.d/*.conf</filename></para>
     <para><filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename></para>
+    <para><filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
+    <para><filename>/run/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
+    <para><filename>/usr/lib/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
   </refsynopsisdiv>
 
   <refsect1>
@@ -41,8 +44,9 @@
 
     <para>The <command>systemd-journald</command> instance managing the default namespace is configured by
     <filename>/etc/systemd/journald.conf</filename> and associated drop-ins. Instances managing other
-    namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename> with
-    the namespace identifier filled in. This allows each namespace to carry a distinct configuration. See
+    namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename>
+    and associated drop-ins with the namespace identifier filled in. This allows each namespace to carry
+    a distinct configuration. See
     <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     for details about journal namespaces.</para>
   </refsect1>
index 21630478962c6ae35b1ebc9dd986a310d85210f8..614871bce206ec72004e6973fa8e3e3fb57fca66 100644 (file)
@@ -2250,6 +2250,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s Type = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly s ExitType = '...';
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s Restart = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s PIDFile = '...';
@@ -2693,6 +2695,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PrivateMounts = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly b PrivateIPC = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectHome = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectSystem = '...';
@@ -2777,6 +2781,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s NetworkNamespacePath = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly s IPCNamespacePath = '...';
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s KillMode = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly i KillSignal = ...;
@@ -2804,6 +2810,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <!--property Type is not documented!-->
 
+    <!--property ExitType is not documented!-->
+
     <!--property Restart is not documented!-->
 
     <!--property PIDFile is not documented!-->
@@ -3194,6 +3202,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <!--property PrivateMounts is not documented!-->
 
+    <!--property PrivateIPC is not documented!-->
+
     <!--property ProtectHome is not documented!-->
 
     <!--property ProtectSystem is not documented!-->
@@ -3278,6 +3288,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <!--property NetworkNamespacePath is not documented!-->
 
+    <!--property IPCNamespacePath is not documented!-->
+
     <!--property KillMode is not documented!-->
 
     <!--property KillSignal is not documented!-->
@@ -3312,6 +3324,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <variablelist class="dbus-property" generated="True" extra-ref="Type"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="ExitType"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="Restart"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="PIDFile"/>
@@ -3772,6 +3786,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
@@ -3856,6 +3872,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
@@ -4454,6 +4472,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PrivateMounts = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly b PrivateIPC = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectHome = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectSystem = '...';
@@ -4538,6 +4558,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s NetworkNamespacePath = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly s IPCNamespacePath = '...';
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s KillMode = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly i KillSignal = ...;
@@ -4983,6 +5005,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <!--property PrivateMounts is not documented!-->
 
+    <!--property PrivateIPC is not documented!-->
+
     <!--property ProtectHome is not documented!-->
 
     <!--property ProtectSystem is not documented!-->
@@ -5067,6 +5091,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <!--property NetworkNamespacePath is not documented!-->
 
+    <!--property IPCNamespacePath is not documented!-->
+
     <!--property KillMode is not documented!-->
 
     <!--property KillSignal is not documented!-->
@@ -5559,6 +5585,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
@@ -5643,6 +5671,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
@@ -6143,6 +6173,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PrivateMounts = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly b PrivateIPC = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectHome = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectSystem = '...';
@@ -6227,6 +6259,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s NetworkNamespacePath = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly s IPCNamespacePath = '...';
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s KillMode = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly i KillSignal = ...;
@@ -6600,6 +6634,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
 
     <!--property PrivateMounts is not documented!-->
 
+    <!--property PrivateIPC is not documented!-->
+
     <!--property ProtectHome is not documented!-->
 
     <!--property ProtectSystem is not documented!-->
@@ -6684,6 +6720,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
 
     <!--property NetworkNamespacePath is not documented!-->
 
+    <!--property IPCNamespacePath is not documented!-->
+
     <!--property KillMode is not documented!-->
 
     <!--property KillSignal is not documented!-->
@@ -7094,6 +7132,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
 
     <variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
@@ -7178,6 +7218,8 @@ node /org/freedesktop/systemd1/unit/home_2emount {
 
     <variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
@@ -7799,6 +7841,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b PrivateMounts = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly b PrivateIPC = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectHome = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s ProtectSystem = '...';
@@ -7883,6 +7927,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s NetworkNamespacePath = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly s IPCNamespacePath = '...';
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s KillMode = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly i KillSignal = ...;
@@ -8242,6 +8288,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
     <!--property PrivateMounts is not documented!-->
 
+    <!--property PrivateIPC is not documented!-->
+
     <!--property ProtectHome is not documented!-->
 
     <!--property ProtectSystem is not documented!-->
@@ -8326,6 +8374,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
     <!--property NetworkNamespacePath is not documented!-->
 
+    <!--property IPCNamespacePath is not documented!-->
+
     <!--property KillMode is not documented!-->
 
     <!--property KillSignal is not documented!-->
@@ -8722,6 +8772,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
     <variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
@@ -8806,6 +8858,8 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
     <variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
index a2f26ec5ab86c4428647800363362413afa9aae8..6dd467445638287721c6a98bd62e2614925243c2 100644 (file)
         <listitem><para>Specifies the network interface to execute the query on. This may either be specified as numeric
         interface index or as network interface string (e.g. <literal>en0</literal>). Note that this option has no
         effect if system-wide DNS configuration (as configured in <filename>/etc/resolv.conf</filename> or
-        <filename>/etc/systemd/resolve.conf</filename>) in place of per-link configuration is used.</para></listitem>
+        <filename>/etc/systemd/resolved.conf</filename>) in place of per-link configuration is used.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index a48158f5624ee38a35eda2df299d2f6b4cb6a143..7ef26cb2c62a2d8e8ef87f91460456bc33af99fc 100644 (file)
@@ -931,7 +931,7 @@ manpages = [
   '8',
   ['systemd-random-seed'],
   'ENABLE_RANDOMSEED'],
- ['systemd-rc-local-generator', '8', [], 'HAVE_SYSV_COMPAT'],
+ ['systemd-rc-local-generator', '8', ['rc-local.service'], 'HAVE_SYSV_COMPAT'],
  ['systemd-remount-fs.service', '8', ['systemd-remount-fs'], ''],
  ['systemd-repart', '8', ['systemd-repart.service'], 'ENABLE_REPART'],
  ['systemd-resolved.service', '8', ['systemd-resolved'], 'ENABLE_RESOLVE'],
index 9224f28129b9e6b0027f264e6a999b7b6b7dfdcc..f43af897893ef0ecd65b19575c40f6227fd6ff9a 100644 (file)
 <citerefentry><refentrytitle>sd_bus_message_read_array</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_read_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_read_strv</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-<citerefentry><refentrytitle>sd_bus_message_reply</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_rewind</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_seal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+<citerefentry><refentrytitle>sd_bus_message_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_set_allow_interactive_authorization</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_set_destination</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
 <citerefentry><refentrytitle>sd_bus_message_set_expect_reply</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
index 1ce1c1367482cc635d0bad57decc3e6198abca0f..3de7a6a53ebad9a18cc3c62a540f3d824475ac03 100644 (file)
     connection object <parameter>bus</parameter>. The syntax of the match rule expression passed in
     <parameter>match</parameter> is described in the <ulink
     url="https://dbus.freedesktop.org/doc/dbus-specification.html">D-Bus Specification</ulink>. The specified handler
-    function <parameter>callback</parameter> is called for eaching incoming message matching the specified expression,
+    function <parameter>callback</parameter> is called for each incoming message matching the specified expression,
     the <parameter>userdata</parameter> parameter is passed as-is to the callback function. The match is installed
     synchronously when connected to a bus broker, i.e. the call sends a control message requested the match to be added
     to the broker and waits until the broker confirms the match has been installed successfully.</para>
 
     <para><function>sd_bus_add_match_async()</function> operates very similar to
-    <function>sd_bus_match_signal()</function>, however it installs the match asynchronously, in a non-blocking
+    <function>sd_bus_add_match()</function>, however it installs the match asynchronously, in a non-blocking
     fashion: a request is sent to the broker, but the call does not wait for a response. The
     <parameter>install_callback</parameter> function is called when the response is later received, with the response
     message from the broker as parameter. If this function is specified as <constant>NULL</constant> a default
index 00e4110739df3b44301a9a9da2ec3fe1a3286b0b..31a3344bbd7629315c37323a0e15c7d716dd8ff5 100644 (file)
     returns zero, an error reply is sent back to the caller indicating no matching object for the
     request was found.</para>
 
-    <para>Note that you can return a positive integer from a callback without
+    <para>Note that you can return a positive integer from a <parameter>method</parameter> callback without
     immediately sending a reply. This informs sd-bus this callback will take responsibility for
     replying to the request without forcing the callback to produce a reply immediately. This allows
     a callback to perform any number of asynchronous operations required to construct a reply.
-    However, if producing a reply takes too long, the method call will time out at the caller.</para>
+    However, if producing a reply takes too long, the method call will time out at the caller. This is
+    only available to methods and not properties.</para>
 
     <para>If a callback was invoked to handle a request that expects a reply and the callback
     returns a negative value, the value is interpreted as a negative errno-style error code and sent
index ea4ea2279d98855fc987f2a54cf94acff1d76f1b..28fda406a57b9dd9a7a7f335532c5360cf4adb74 100644 (file)
     is sent to the bus broker, and the call waits until the broker responds.</para>
 
     <para><function>sd_bus_request_name_async()</function> is an asynchronous version of
-    <function>sd_bus_release_name()</function>. Instead of waiting for the request to complete, the request message is
+    <function>sd_bus_request_name()</function>. Instead of waiting for the request to complete, the request message is
     enqueued. The specified <parameter>callback</parameter> will be called when the broker's response is received. If
     the parameter is specified as <constant>NULL</constant> a default implementation is used instead which will
     terminate the connection when the name cannot be acquired. The function returns a slot object in its
index 187baceec2196f0d2342b360730384abae0ae016..6a27bab1e30639c793644dfb150d40fe5ac8265e 100644 (file)
       <varlistentry>
         <term><option>--network-interface=</option></term>
 
-        <listitem><para>Assign the specified network interface to the
-        container. This will remove the specified interface from the
-        calling namespace and place it in the container. When the
-        container terminates, it is moved back to the host namespace.
-        Note that <option>--network-interface=</option> implies
-        <option>--private-network</option>. This option may be used
-        more than once to add multiple network interfaces to the
-        container.</para></listitem>
+        <listitem><para>Assign the specified network interface to the container. This will remove the
+        specified interface from the calling namespace and place it in the container. When the container
+        terminates, it is moved back to the calling namespace.  Note that
+        <option>--network-interface=</option> implies <option>--private-network</option>. This option may be
+        used more than once to add multiple network interfaces to the container.</para>
+
+        <para>Note that any network interface specified this way must already exist at the time the container
+        is started. If the container shall be started automatically at boot via a
+        <filename>systemd-nspawn@.service</filename> unit file instance, it might hence make sense to add a
+        unit file drop-in to the service instance
+        (e.g. <filename>/etc/systemd/system/systemd-nspawn@foobar.service.d/50-network.conf</filename>) with
+        contents like the following:</para>
+
+        <programlisting>[Unit]
+Wants=sys-subsystem-net-devices-ens1.device
+After=sys-subsystem-net-devices-ens1.device</programlisting>
+
+        <para>This will make sure that activation of the container service will be delayed until the
+        <literal>ens1</literal> network interface has shown up. This is required since hardware probing is
+        fully asynchronous, and network interfaces might be discovered only later during the boot process,
+        after the container would normally be started without these explicit dependencies.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--network-macvlan=</option></term>
 
-        <listitem><para>Create a <literal>macvlan</literal> interface
-        of the specified Ethernet network interface and add it to the
-        container. A <literal>macvlan</literal> interface is a virtual
-        interface that adds a second MAC address to an existing
-        physical Ethernet link. The interface in the container will be
-        named after the interface on the host, prefixed with
-        <literal>mv-</literal>. Note that
-        <option>--network-macvlan=</option> implies
-        <option>--private-network</option>. This option may be used
-        more than once to add multiple network interfaces to the
-        container.</para></listitem>
+        <listitem><para>Create a <literal>macvlan</literal> interface of the specified Ethernet network
+        interface and add it to the container. A <literal>macvlan</literal> interface is a virtual interface
+        that adds a second MAC address to an existing physical Ethernet link. The interface in the container
+        will be named after the interface on the host, prefixed with <literal>mv-</literal>. Note that
+        <option>--network-macvlan=</option> implies <option>--private-network</option>. This option may be
+        used more than once to add multiple network interfaces to the container.</para>
+
+        <para>As with <option>--network-interface=</option>, the underlying Ethernet network interface must
+        already exist at the time the container is started, and thus similar unit file drop-ins as described
+        above might be useful.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--network-ipvlan=</option></term>
 
-        <listitem><para>Create an <literal>ipvlan</literal> interface
-        of the specified Ethernet network interface and add it to the
-        container. An <literal>ipvlan</literal> interface is a virtual
-        interface, similar to a <literal>macvlan</literal> interface,
-        which uses the same MAC address as the underlying interface.
-        The interface in the container will be named after the
-        interface on the host, prefixed with <literal>iv-</literal>.
-        Note that <option>--network-ipvlan=</option> implies
-        <option>--private-network</option>. This option may be used
-        more than once to add multiple network interfaces to the
-        container.</para></listitem>
+        <listitem><para>Create an <literal>ipvlan</literal> interface of the specified Ethernet network
+        interface and add it to the container. An <literal>ipvlan</literal> interface is a virtual interface,
+        similar to a <literal>macvlan</literal> interface, which uses the same MAC address as the underlying
+        interface.  The interface in the container will be named after the interface on the host, prefixed
+        with <literal>iv-</literal>.  Note that <option>--network-ipvlan=</option> implies
+        <option>--private-network</option>. This option may be used more than once to add multiple network
+        interfaces to the container.</para>
+
+        <para>As with <option>--network-interface=</option>, the underlying Ethernet network interface must
+        already exist at the time the container is started, and thus similar unit file drop-ins as described
+        above might be useful.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         this option is used, the host side of the Ethernet link will use the <literal>vb-</literal> prefix
         instead of <literal>ve-</literal>. Regardless of the used naming prefix the same network interface
         name length limits imposed by Linux apply, along with the complications this creates (for details see
-        above).</para></listitem>
+        above).</para>
+
+        <para>As with <option>--network-interface=</option>, the underlying bridge network interface must
+        already exist at the time the container is started, and thus similar unit file drop-ins as described
+        above might be useful.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 9e175247fd3468cb62e3c1f24d64ce55fed1bbf0..f0e38ead47d99be7ec898fa9bc301b834ba5aa38 100644 (file)
 
   <refnamediv>
     <refname>systemd-rc-local-generator</refname>
-    <refpurpose>Compatibility generator for starting <filename>&RC_LOCAL_PATH;</filename> during boot</refpurpose>
+    <refname>rc-local.service</refname>
+    <refpurpose>Compatibility generator and service to start <filename>&RC_LOCAL_PATH;</filename> during boot</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
     <para><filename>/usr/lib/systemd/system-generators/systemd-rc-local-generator</filename></para>
+    <para><filename>rc-local.service</filename></para>
   </refsynopsisdiv>
 
   <refsect1>
     <title>Description</title>
 
-    <para><filename>systemd-rc-local-generator</filename> is a generator that checks whether
-    <filename>&RC_LOCAL_PATH;</filename> exists and is executable, and if it is pulls the
+    <para><command>systemd-rc-local-generator</command> is a generator that checks whether
+    <filename>&RC_LOCAL_PATH;</filename> exists and is executable, and if it is, pulls the
     <filename>rc-local.service</filename> unit into the boot process. This unit is responsible for running
-    this script during late boot. Note that the script will be run with slightly different semantics than the
-    original System V version, which was run "last" in the boot process, which is a concept that does not
-    translate to systemd. The script is run after <filename>network.target</filename>, but in parallel with
-    most other regular system services.</para>
+    this script during late boot. The script is run after <filename>network.target</filename>, but in
+    parallel with most other regular system services.</para>
+
+    <para>Note that <filename>rc-local.service</filename> runs with slightly different semantics than the
+    original System V version, which was executed "last" in the boot process, which is a concept that does
+    not translate to systemd.</para>
+
+    <para>Also note that <filename>rc-local.service</filename> is ordered after
+    <filename>network.target</filename>, which does not mean that the network is functional, see
+    <citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
+    If the script requires a configured network connection, it may be desirable to pull in and order it after
+    <filename>network-online.target</filename> with a drop-in:</para>
+
+    <programlisting># /etc/systemd/system/rc-local.service.d/network.conf
+[Unit]
+Wants=network-online.target
+After=network-online.target
+</programlisting>
 
     <para>Support for <filename>&RC_LOCAL_PATH;</filename> is provided for compatibility with specific System
     V systems only. However, it is strongly recommended to avoid making use of this script today, and instead
     provide proper unit files with appropriate dependencies for any scripts to run during the boot process.
-    Note that the path to the script is set a compile time and varies between distributions.</para>
+    Note that the path to the script is set at compile time and varies between distributions.</para>
 
     <para><filename>systemd-rc-local-generator</filename> implements
     <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
index 255ca3373bbcb354856066011f361f13c29a16f5..596d334d5df575a7a601d839159d4fb140ce433f 100644 (file)
   <refsect1>
     <title>Description</title>
 
-    <para>A unit configuration file whose name ends in
-    <literal>.device</literal> encodes information about a device unit
-    as exposed in the
-    sysfs/<citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-    device tree.</para>
+    <para>A unit configuration file whose name ends in <literal>.device</literal> encodes information about a
+    device unit as exposed in the
+    sysfs/<citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry> device
+    tree. This may be used to define dependencies between devices and other units.</para>
 
     <para>This unit type has no specific options. See
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     sections. A separate [Device] section does not
     exist, since no device-specific options may be configured.</para>
 
-    <para>systemd will dynamically create device units for all kernel
-    devices that are marked with the "systemd" udev tag (by default
-    all block and network devices, and a few others). This may be used
-    to define dependencies between devices and other units. To tag a
-    udev device, use <literal>TAG+="systemd"</literal> in the udev
-    rules file, see
-    <citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-    for details.</para>
+    <para>systemd will dynamically create device units for all kernel devices that are marked with the
+    <literal>systemd</literal> udev tag (by default all block and network devices, and a few others). Note
+    that <emphasis>if <filename>systemd-udev.service</filename> is not running, no device units will be
+    available (for example in a typical container)</emphasis>.</para>
 
     <para>Device units are named after the <filename>/sys/</filename>
     and <filename>/dev/</filename> paths they control. Example: the
     name see
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
 
+    <para>To tag a udev device, use <literal>TAG+="systemd"</literal> in the udev rules file, see
+    <citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details.
+    </para>
+
     <para>Device units will be reloaded by systemd whenever the
     corresponding device generates a <literal>changed</literal> event.
     Other units can use <varname>ReloadPropagatedFrom=</varname> to react
index 30e64224c3e74ac6d0d8ebe257219aa5e684efbd..5bb9af3e7da63682a8dd0affde0b04590d7fb6ea 100644 (file)
         <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
         </para>
 
-        <para>Valid partition names follow the <ulink url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable
-        Partitions Specification</ulink>.</para>
-
-        <table>
-          <title>Accepted partition names</title>
-
-          <tgroup cols='1'>
-            <colspec colname='partition' />
-            <thead>
-              <row>
-                <entry>Partition Name</entry>
-              </row>
-            </thead>
-            <tbody>
-              <row>
-                <entry>root</entry>
-              </row>
-              <row>
-                <entry>root-secondary</entry>
-              </row>
-              <row>
-                <entry>home</entry>
-              </row>
-              <row>
-                <entry>srv</entry>
-              </row>
-              <row>
-                <entry>esp</entry>
-              </row>
-              <row>
-                <entry>xbootldr</entry>
-              </row>
-              <row>
-                <entry>tmp</entry>
-              </row>
-              <row>
-                <entry>var</entry>
-              </row>
-              <row>
-                <entry>usr</entry>
-              </row>
-            </tbody>
-          </tgroup>
-        </table>
+        <para>Valid partition names follow the <ulink
+        url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partitions Specification</ulink>:
+        <constant>root</constant>, <constant>usr</constant>, <constant>home</constant>, <constant>srv</constant>,
+        <constant>esp</constant>, <constant>xbootldr</constant>, <constant>tmp</constant>,
+        <constant>var</constant>.</para>
 
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
         Filesystem</ulink>. It is generally recommended to run most system services with this option set to
         <literal>invisible</literal>. This option is implemented via file system namespacing, and thus cannot
         be used with services that shall be able to install mount points in the host file system
-        hierarchy. It also cannot be used for services that need to access metainformation about other users'
-        processes. This option implies <varname>MountAPIVFS=</varname>.</para>
+        hierarchy. Note that the root user is unaffected by this option, so to be effective it has to be used
+        together with <varname>User=</varname> or <varname>DynamicUser=yes</varname>, and also without the
+        <literal>CAP_SYS_PTRACE</literal> capability, which also allows a process to bypass this feature. It
+        cannot be used for services that need to access metainformation about other users' processes. This
+        option implies <varname>MountAPIVFS=</varname>.</para>
 
         <para>If the kernel doesn't support per-mount point <option>hidepid=</option> mount options this
         setting remains without effect, and the unit's processes will be able to access and see other process
@@ -695,16 +659,25 @@ CapabilityBoundingSet=~CAP_B CAP_C</programlisting>
         setgid bits, or filesystem capabilities). This is the simplest and most effective way to ensure that
         a process and its children can never elevate privileges again. Defaults to false, but certain
         settings override this and ignore the value of this setting.  This is the case when
-        <varname>SystemCallFilter=</varname>, <varname>SystemCallArchitectures=</varname>,
-        <varname>RestrictAddressFamilies=</varname>, <varname>RestrictNamespaces=</varname>,
-        <varname>PrivateDevices=</varname>, <varname>ProtectKernelTunables=</varname>,
-        <varname>ProtectKernelModules=</varname>, <varname>ProtectKernelLogs=</varname>,
-        <varname>ProtectClock=</varname>, <varname>MemoryDenyWriteExecute=</varname>,
-        <varname>RestrictRealtime=</varname>, <varname>RestrictSUIDSGID=</varname>, <varname>DynamicUser=</varname>
-        or <varname>LockPersonality=</varname> are specified. Note that even if this setting is overridden by them,
-        <command>systemctl show</command> shows the original value of this setting.
-        Also see <ulink url="https://www.kernel.org/doc/html/latest/userspace-api/no_new_privs.html">No New Privileges
-        Flag</ulink>.</para></listitem>
+        <varname>DynamicUser=</varname>,
+        <varname>LockPersonality=</varname>,
+        <varname>MemoryDenyWriteExecute=</varname>,
+        <varname>PrivateDevices=</varname>,
+        <varname>ProtectClock=</varname>,
+        <varname>ProtectHostname=</varname>,
+        <varname>ProtectKernelLogs=</varname>,
+        <varname>ProtectKernelModules=</varname>,
+        <varname>ProtectKernelTunables=</varname>,
+        <varname>RestrictAddressFamilies=</varname>,
+        <varname>RestrictNamespaces=</varname>,
+        <varname>RestrictRealtime=</varname>,
+        <varname>RestrictSUIDSGID=</varname>,
+        <varname>SystemCallArchitectures=</varname>,
+        <varname>SystemCallFilter=</varname>, or
+        <varname>SystemCallLog=</varname> are specified. Note that even if this setting is overridden
+        by them, <command>systemctl show</command> shows the original value of this setting. Also see
+        <ulink url="https://www.kernel.org/doc/html/latest/userspace-api/no_new_privs.html">No New
+        Privileges Flag</ulink>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
@@ -1537,14 +1510,14 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         unit (see above), and set <varname>DevicePolicy=closed</varname> (see
         <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
         for details). Note that using this setting will disconnect propagation of mounts from the service to the host
-        (propagation in the opposite direction continues to work).  This means that this setting may not be used for
+        (propagation in the opposite direction continues to work). This means that this setting may not be used for
         services which shall be able to install mount points in the main mount namespace. The new
         <filename>/dev/</filename> will be mounted read-only and 'noexec'. The latter may break old programs which try
         to set up executable memory by using
         <citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry> of
         <filename>/dev/zero</filename> instead of using <constant>MAP_ANON</constant>. For this setting the same
         restrictions regarding mount propagation and privileges apply as for <varname>ReadOnlyPaths=</varname> and
-        related calls, see above.  If turned on and if running in user mode, or in system mode, but without the
+        related calls, see above. If turned on and if running in user mode, or in system mode, but without the
         <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=</varname>),
         <varname>NoNewPrivileges=yes</varname> is implied.</para>
 
@@ -1603,6 +1576,53 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>PrivateIPC=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, sets up a new IPC namespace for the executed processes.
+        Each IPC namespace has its own set of System V IPC identifiers and its own POSIX message queue file system.
+        This is useful to avoid name clash of IPC identifiers. Defaults to false. It is possible to run two or
+        more units within the same private IPC namespace by using the <varname>JoinsNamespaceOf=</varname> directive,
+        see <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+        details.</para>
+
+        <para>Note that IPC namespacing does not have an effect on
+        <constant>AF_UNIX</constant> sockets, which are the most common
+        form of IPC used on Linux. Instead, <constant>AF_UNIX</constant>
+        sockets in the file system are subject to mount namespacing, and
+        those in the abstract namespace are subject to network namespacing.
+        IPC namespacing only has an effect on SysV IPC (which is mostly
+        legacy) as well as POSIX message queues (for which
+        <constant>AF_UNIX</constant>/<constant>SOCK_SEQPACKET</constant>
+        sockets are typically a better replacement). IPC namespacing also
+        has no effect on POSIX shared memory (which is subject to mount
+        namespacing) either. See
+        <citerefentry project='man-pages'><refentrytitle>ipc_namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        the details.</para>
+
+        <para>Note that the implementation of this setting might be impossible (for example if IPC namespaces are
+        not available), and the unit should be written in a way that does not solely rely on this setting for
+        security.</para>
+
+        <xi:include href="system-only.xml" xpointer="singular"/></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>IPCNamespacePath=</varname></term>
+
+        <listitem><para>Takes an absolute file system path refererring to a Linux IPC namespace
+        pseudo-file (i.e. a file like <filename>/proc/$PID/ns/ipc</filename> or a bind mount or symlink to
+        one). When set the invoked processes are added to the network namespace referenced by that path. The
+        path has to point to a valid namespace file at the moment the processes are forked off. If this
+        option is used <varname>PrivateIPC=</varname> has no effect. If this option is used together with
+        <varname>JoinsNamespaceOf=</varname> then it only has an effect if this unit is started before any of
+        the listed units that have <varname>PrivateIPC=</varname> or
+        <varname>IPCNamespacePath=</varname> configured, as otherwise the network namespace of those
+        units is reused.</para>
+
+        <xi:include href="system-only.xml" xpointer="singular"/></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>PrivateUsers=</varname></term>
 
@@ -1650,6 +1670,10 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         the system into the service, it is hence not suitable for services that need to take notice of system
         hostname changes dynamically.</para>
 
+        <para>If this setting is on, but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant>
+        capability (e.g. services for which <varname>User=</varname> is set),
+        <varname>NoNewPrivileges=yes</varname> is implied.</para>
+
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
 
@@ -1663,7 +1687,9 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         clock, and <varname>DeviceAllow=char-rtc r</varname> is implied. This ensures <filename>/dev/rtc0</filename>,
         <filename>/dev/rtc1</filename>, etc. are made read-only to the service. See
         <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for the details about <varname>DeviceAllow=</varname>.</para>
+        for the details about <varname>DeviceAllow=</varname>. If this setting is on, but the unit
+        doesn't have the <constant>CAP_SYS_ADMIN</constant> capability (e.g. services for which
+        <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied.</para>
 
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
@@ -1680,13 +1706,14 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> mechanism. Few
         services need to write to these at runtime; it is hence recommended to turn this on for most services. For this
         setting the same restrictions regarding mount propagation and privileges apply as for
-        <varname>ReadOnlyPaths=</varname> and related calls, see above. Defaults to off.  If turned on and if running
-        in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g.  services
-        for which <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied. Note that this
-        option does not prevent indirect changes to kernel tunables effected by IPC calls to other processes. However,
-        <varname>InaccessiblePaths=</varname> may be used to make relevant IPC file system objects inaccessible. If
-        <varname>ProtectKernelTunables=</varname> is set, <varname>MountAPIVFS=yes</varname> is
-        implied.</para>
+        <varname>ReadOnlyPaths=</varname> and related calls, see above. Defaults to off. If this
+        setting is on, but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant> capability
+        (e.g. services for which <varname>User=</varname> is set),
+        <varname>NoNewPrivileges=yes</varname> is implied. Note that this option does not prevent
+        indirect changes to kernel tunables effected by IPC calls to other processes. However,
+        <varname>InaccessiblePaths=</varname> may be used to make relevant IPC file system objects
+        inaccessible. If <varname>ProtectKernelTunables=</varname> is set,
+        <varname>MountAPIVFS=yes</varname> is implied.</para>
 
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
@@ -1705,9 +1732,9 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         both privileged and unprivileged. To disable module auto-load feature please see
         <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
         <constant>kernel.modules_disabled</constant> mechanism and
-        <filename>/proc/sys/kernel/modules_disabled</filename> documentation.  If turned on and if running in user
-        mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
-        <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied.</para>
+        <filename>/proc/sys/kernel/modules_disabled</filename> documentation. If this setting is on,
+        but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant> capability (e.g. services for
+        which <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied.</para>
 
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
@@ -1723,7 +1750,10 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         system call (not to be confused with the libc API
         <citerefentry project='man-pages'><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>
         for userspace logging). The kernel exposes its log buffer to userspace via <filename>/dev/kmsg</filename> and
-        <filename>/proc/kmsg</filename>. If enabled, these are made inaccessible to all the processes in the unit.</para>
+        <filename>/proc/kmsg</filename>. If enabled, these are made inaccessible to all the processes in the unit.
+        If this setting is on, but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant>
+        capability (e.g. services for which <varname>User=</varname> is set),
+        <varname>NoNewPrivileges=yes</varname> is implied.</para>
 
         <xi:include href="system-only.xml" xpointer="singular"/></listitem>
       </varlistentry>
@@ -1763,7 +1793,7 @@ BindReadOnlyPaths=/var/lib/systemd</programlisting>
         restrictions of this option. Specifically, it is recommended to combine this option with
         <varname>SystemCallArchitectures=native</varname> or similar. If running in user mode, or in system
         mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
-        <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default, no
+        <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default, no
         restrictions apply, all address families are accessible to processes. If assigned the empty string,
         any previous address family restriction changes are undone. This setting does not affect commands
         prefixed with <literal>+</literal>.</para>
@@ -1993,7 +2023,7 @@ RestrictNamespaces=~cgroup net</programlisting>
         explicitly specify killing. This value takes precedence over the one given in
         <varname>SystemCallErrorNumber=</varname>, see below.  If running in user mode, or in system mode,
         but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
-        <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. This feature
+        <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied. This feature
         makes use of the Secure Computing Mode 2 interfaces of the kernel ('seccomp filtering') and is useful
         for enforcing a minimal sandboxing environment. Note that the <function>execve()</function>,
         <function>exit()</function>, <function>exit_group()</function>, <function>getrlimit()</function>,
@@ -2215,7 +2245,7 @@ SystemCallErrorNumber=EPERM</programlisting>
         the special identifier <constant>native</constant>.  The special identifier <constant>native</constant>
         implicitly maps to the native architecture of the system (or more precisely: to the architecture the system
         manager is compiled for). If running in user mode, or in system mode, but without the
-        <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=nobody</varname>),
+        <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=</varname>),
         <varname>NoNewPrivileges=yes</varname> is implied. By default, this option is set to the empty list, i.e. no
         filtering is applied.</para>
 
@@ -2244,7 +2274,7 @@ SystemCallErrorNumber=EPERM</programlisting>
         system calls executed by the unit processes for the listed ones will be logged. If the first
         character of the list is <literal>~</literal>, the effect is inverted: all system calls except the
         listed system calls will be logged. If running in user mode, or in system mode, but without the
-        <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=nobody</varname>),
+        <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=</varname>),
         <varname>NoNewPrivileges=yes</varname> is implied. This feature makes use of the Secure Computing
         Mode 2 interfaces of the kernel ('seccomp filtering') and is useful for auditing or setting up a
         minimal sandboxing environment. This option may be specified more than once, in which case the filter
@@ -3585,7 +3615,7 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
           <row>
             <entry>226</entry>
             <entry><constant>EXIT_NAMESPACE</constant></entry>
-            <entry>Failed to set up mount namespacing. See <varname>ReadOnlyPaths=</varname> and related settings above.</entry>
+            <entry>Failed to set up mount, UTS, or IPC namespacing. See <varname>ReadOnlyPaths=</varname>, <varname>ProtectHostname=</varname>, <varname>PrivateIPC=</varname>, and related settings above.</entry>
           </row>
           <row>
             <entry>227</entry>
index 93f7191b3321109aad8f875d0280e3fb9d8abce9..5918a32189810c54190d92e19aa6343ce3ad519a 100644 (file)
     <citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry> for a
     general description of the syntax.</para>
 
-    <para>The link files are read from the files located in the system
-    network directory <filename>/usr/lib/systemd/network</filename>,
-    the volatile runtime network directory
-    <filename>/run/systemd/network</filename>, and the local
-    administration network directory
-    <filename>/etc/systemd/network</filename>. Link files must have
-    the extension <filename>.link</filename>; other extensions are
-    ignored. All link files are collectively sorted and processed in
-    lexical order, regardless of the directories in which they live.
-    However, files with identical filenames replace each other. Files
-    in <filename>/etc/</filename> have the highest priority, files in
-    <filename>/run/</filename> take precedence over files with the same
-    name in <filename>/usr/lib/</filename>. This can be used to
-    override a system-supplied link file with a local file if needed.
-    As a special case, an empty file (file size 0) or symlink with the
-    same name pointing to <filename>/dev/null</filename> disables the
-    configuration file entirely (it is "masked").</para>
+    <para>The link files are read from the files located in the system network directory
+    <filename>/usr/lib/systemd/network</filename>, the volatile runtime network directory
+    <filename>/run/systemd/network</filename>, and the local administration network directory
+    <filename>/etc/systemd/network</filename>. Link files must have the extension
+    <filename>.link</filename>; other extensions are ignored. All link files are collectively sorted
+    and processed in lexical order, regardless of the directories in which they live. However, files
+    with identical filenames replace each other. Files in <filename>/etc/</filename> have the highest
+    priority, files in <filename>/run/</filename> take precedence over files with the same name in
+    <filename>/usr/lib/</filename>. This can be used to override a system-supplied link file with a
+    local file if needed. As a special case, an empty file (file size 0) or symlink with the same name
+    pointing to <filename>/dev/null</filename> disables the configuration file entirely (it is
+    "masked").</para>
+
+    <para>Along with the link file <filename>foo.link</filename>, a "drop-in" directory
+    <filename>foo.link.d/</filename> may exist. All files with the suffix <literal>.conf</literal>
+    from this directory will be parsed after the file itself is parsed. This is useful to alter or add
+    configuration settings, without having to modify the main configuration file. Each drop-in file
+    must have appropriate section headers.</para>
+
+    <para>In addition to <filename>/etc/systemd/network</filename>, drop-in <literal>.d</literal>
+    directories can be placed in <filename>/usr/lib/systemd/network</filename> or
+    <filename>/run/systemd/network</filename> directories. Drop-in files in <filename>/etc/</filename>
+    take precedence over those in <filename>/run/</filename> which in turn take precedence over those
+    in <filename>/usr/lib/</filename>. Drop-in files under any of these directories take precedence
+    over the main link file wherever located.</para>
 
     <para>The link file contains a [Match] section, which determines if a given link file may be applied to a
     given device, as well as a [Link] section specifying how the device should be configured. The first (in
index 9ab88554bc0efea42ee25b7ce9d795a4eebe8dcb..c1b1980bac50f9124f35e119f0bb4c2bc719c222 100644 (file)
         <term><varname>HopPenalty=</varname></term>
         <listitem>
           <para>The hop penalty setting allows to modify
-          <citerefentry><refentrytitle>batctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+          <citerefentry project='mankier'><refentrytitle>batctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
           preference for multihop routes vs. short routes. This integer value is applied to the
           TQ (Transmit Quality) of each forwarded OGM (Originator Message), thereby propagating the
           cost of an extra hop (the packet has to be received and retransmitted which costs airtime).
index abf8ea0a6f2dedb7cc73088ad4d8f9188152b505..cec2f96f26c8196862be0b4b33b349f1cd7741d3 100644 (file)
@@ -1597,9 +1597,7 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
         <varlistentry>
           <term><varname>UseDNS=</varname></term>
           <listitem>
-            <para>When true (the default), the DNS servers received
-            from the DHCP server will be used and take precedence over
-            any statically configured ones.</para>
+            <para>When true (the default), the DNS servers received from the DHCP server will be used.</para>
 
             <para>This corresponds to the <option>nameserver</option>
             option in <citerefentry
@@ -1618,8 +1616,7 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
           <term><varname>UseNTP=</varname></term>
           <listitem>
             <para>When true (the default), the NTP servers received from the DHCP server will be used by
-            <filename>systemd-timesyncd.service</filename> and take precedence over any statically configured
-            ones.</para>
+            <filename>systemd-timesyncd.service</filename>.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
@@ -1739,13 +1736,12 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
           <term><varname>UseGateway=</varname></term>
           <listitem>
             <para>When true, the gateway will be requested from the DHCP server and added to the routing table with a
-            metric of 1024, and a scope of "link".  When unset, the value specified with <option>UseRoutes=</option>
+            metric of 1024, and a scope of "link". When unset, the value specified with <option>UseRoutes=</option>
             is used.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>UseTimezone=</varname></term>
-
           <listitem><para>When true, the timezone received from the
           DHCP server will be set as timezone of the local
           system. Defaults to <literal>no</literal>.</para></listitem>
@@ -2163,8 +2159,7 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
         <varlistentry>
           <term><varname>UseDNS=</varname></term>
           <listitem>
-            <para>When true (the default), the DNS servers received in the Router Advertisement will be used and take
-            precedence over any statically configured ones.</para>
+            <para>When true (the default), the DNS servers received in the Router Advertisement will be used.</para>
 
             <para>This corresponds to the <option>nameserver</option> option in <citerefentry
             project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
index 501da54b8aa54e36fc9ba5c1f39272c69bd74662..50d1a1d85d638f2404c2b943df6226bb48924a76 100644 (file)
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>ExitType=</varname></term>
+
+        <listitem>
+          <para>Configures the process exit type for this service unit. One of <option>main</option> or
+          <option>cgroup</option>:</para>
+
+          <itemizedlist>
+            <listitem><para>If set to <option>main</option> (the default), the service manager
+            will consider the unit stopped when the main process, which is determined according to the `Type`, exits.
+            </para></listitem>
+
+            <listitem><para>The <option>cgroup</option> exit type is meant for applications whose forking model is not
+            known ahead of time and which might not have a specific main process. The service will stay running as long
+            as at least one process in the cgroup is running. The exit status of the service is that of the last
+            process in the cgroup to exit.</para></listitem>
+          </itemizedlist>
+
+          <para>It is generally recommended to use <varname>ExitType=</varname><option>main</option> when a service has
+          a known forking model and a main process can reliably be determined. <varname>ExitType=</varname>
+          <option>cgroup</option> is well suited for transient or automatically generated services, such as graphical
+          applications inside of a desktop environment.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>RemainAfterExit=</varname></term>
 
         If set to <option>no</option> (the default), the service will
         not be restarted. If set to <option>on-success</option>, it
         will be restarted only when the service process exits cleanly.
-        In this context, a clean exit means an exit code of 0, or one
-        of the signals
-        <constant>SIGHUP</constant>,
-        <constant>SIGINT</constant>,
-        <constant>SIGTERM</constant> or
-        <constant>SIGPIPE</constant>, and
-        additionally, exit statuses and signals specified in
-        <varname>SuccessExitStatus=</varname>. If set to
+        In this context, a clean exit means any of the following:
+        <itemizedlist>
+            <listitem><simpara>exit code of 0;</simpara></listitem>
+            <listitem><simpara>for types other than
+            <varname>Type=oneshot</varname>, one of the signals
+                <constant>SIGHUP</constant>,
+                <constant>SIGINT</constant>,
+                <constant>SIGTERM</constant>, or
+                <constant>SIGPIPE</constant>;</simpara></listitem>
+            <listitem><simpara>exit statuses and signals specified in
+                <varname>SuccessExitStatus=</varname>.</simpara></listitem>
+        </itemizedlist>
+        If set to
         <option>on-failure</option>, the service will be restarted
         when the process exits with a non-zero exit code, is
         terminated by a signal (including on core dump, but excluding
 
         <listitem><para>Takes a list of exit status definitions that, when returned by the main service
         process, will be considered successful termination, in addition to the normal successful exit status
-        0 and the signals <constant>SIGHUP</constant>, <constant>SIGINT</constant>,
+        0 and, except for <varname>Type=oneshot</varname>, the signals <constant>SIGHUP</constant>, <constant>SIGINT</constant>,
         <constant>SIGTERM</constant>, and <constant>SIGPIPE</constant>. Exit status definitions can be
         numeric termination statuses, termination status names, or termination signal names, separated by
         spaces. See the Process Exit Codes section in
index 6a9d4dc486d51ef3007567525911338b2ae6eb7c..42dcbac72ca3e19a4cb71ed9583158c18d0f6383 100644 (file)
 
         <listitem><para>For units that start processes (such as service units), lists one or more other units
         whose network and/or temporary file namespace to join. This only applies to unit types which support
-        the <varname>PrivateNetwork=</varname>, <varname>NetworkNamespacePath=</varname> and
+        the <varname>PrivateNetwork=</varname>, <varname>NetworkNamespacePath=</varname>,
+        <varname>PrivateIPC=</varname>, <varname>IPCNamespacePath=</varname>, and
         <varname>PrivateTmp=</varname> directives (see
         <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
         details). If a unit that has this setting set is started, its processes will see the same
-        <filename>/tmp/</filename>, <filename>/var/tmp/</filename> and network namespace as one listed unit
-        that is started. If multiple listed units are already started, it is not defined which namespace is
-        joined. Note that this setting only has an effect if
-        <varname>PrivateNetwork=</varname>/<varname>NetworkNamespacePath=</varname> and/or
+        <filename>/tmp/</filename>, <filename>/var/tmp/</filename>, IPC namespace and network namespace as
+        one listed unit that is started. If multiple listed units are already started, it is not defined
+        which namespace is joined. Note that this setting only has an effect if
+        <varname>PrivateNetwork=</varname>/<varname>NetworkNamespacePath=</varname>,
+        <varname>PrivateIPC=</varname>/<varname>IPCNamespacePath=</varname> and/or
         <varname>PrivateTmp=</varname> is enabled for both the unit that joins the namespace and the unit
         whose namespace is joined.</para></listitem>
       </varlistentry>
         <varname>Restart=</varname> logic.</para>
 
         <para>Note that units which are configured for <varname>Restart=</varname>, and which reach the start
-        limit are not attempted to be restarted anymore; however, they may still be restarted manually at a
-        later point, after the <replaceable>interval</replaceable> has passed. From that point on, the
-        restart logic is activated again. <command>systemctl reset-failed</command> will cause the restart
-        rate counter for a service to be flushed, which is useful if the administrator wants to manually
-        start a unit and the start limit interferes with that. Rate-limiting is enforced after any unit
-        condition checks are executed, and hence unit activations with failing conditions do not count
-        towards the rate limit.</para>
+        limit are not attempted to be restarted anymore; however, they may still be restarted manually or
+        from a timer or socket at a later point, after the <replaceable>interval</replaceable> has passed.
+        From that point on, the restart logic is activated again. <command>systemctl reset-failed</command>
+        will cause the restart rate counter for a service to be flushed, which is useful if the administrator
+        wants to manually start a unit and the start limit interferes with that. Rate-limiting is enforced
+        after any unit condition checks are executed, and hence unit activations with failing conditions do
+        not count towards the rate limit.</para>
 
         <para>When a unit is unloaded due to the garbage collection logic (see above) its rate limit counters
         are flushed out too. This means that configuring start rate limiting for a unit that is not
index 8fbfd5fc494a8c3852c1045397f6eb4080e802da..6a474afdac33a284350f96f48bb7526e4bb49d9b 100644 (file)
@@ -14,7 +14,7 @@ project('systemd', 'c',
        )
 
 libsystemd_version = '0.31.0'
-libudev_version = '1.7.0'
+libudev_version = '1.7.1'
 
 # We need the same data in two different formats, ugh!
 # Also, for hysterical reasons, we use different variable
@@ -144,7 +144,7 @@ pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgc
 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
-xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
+xinitrcdir = get_option('xinitrcdir') == '' ? join_paths(sysconfdir, 'X11/xinit/xinitrc.d') : get_option('xinitrcdir')
 rpmmacrosdir = get_option('rpmmacrosdir')
 if rpmmacrosdir != 'no'
         rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
@@ -857,10 +857,13 @@ conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
 
 localegen_path = get_option('localegen-path')
 have = false
+writable = ''
 if localegen_path != ''
         conf.set_quoted('LOCALEGEN_PATH', localegen_path)
         have = true
+        writable = ' /usr/lib/locale'
 endif
+substs.set('SERVICE_LOCALEGEN_WRITABLE', writable)
 conf.set10('HAVE_LOCALEGEN', have)
 
 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
@@ -3472,7 +3475,8 @@ if install_sysconfdir
         install_data('xorg/50-systemd-user.sh',
                      install_dir : xinitrcdir)
 endif
-install_data('modprobe.d/systemd.conf',
+install_data('README',
+             'modprobe.d/systemd.conf',
              install_dir : modprobedir)
 install_data('LICENSE.GPL2',
              'LICENSE.LGPL2.1',
index 425e958ba20af3f6d783fd64752a7e87ff91350e..d96d4e3f047c859832ea384d75f054d4d1feccc6 100644 (file)
@@ -178,6 +178,8 @@ option('pkgconfigdatadir', type : 'string', value : '',
        description : 'directory for arch-independent pkg-config files')
 option('pkgconfiglibdir', type : 'string', value : '',
        description : 'directory for standard pkg-config files')
+option('xinitrcdir', type : 'string', value : '',
+       description : 'directory for xinitrc files')
 option('rpmmacrosdir', type : 'string', value : 'lib/rpm/macros.d',
        description : 'directory for rpm macros ["no" disables]')
 option('pamlibdir', type : 'string',
@@ -360,7 +362,7 @@ option('gnu-efi', type : 'combo', choices : ['auto', 'true', 'false'],
        description : 'gnu-efi support for sd-boot')
 option('efi-cc', type : 'array',
        description : 'the compiler to use for EFI modules')
-option('efi-ld', type : 'string',
+option('efi-ld', type : 'string', value : 'ld',
        description : 'the linker to use for EFI modules')
 option('efi-libdir', type : 'string',
        description : 'path to the EFI lib directory')
diff --git a/modprobe.d/README b/modprobe.d/README
new file mode 100644 (file)
index 0000000..4c11e46
--- /dev/null
@@ -0,0 +1,7 @@
+Files in this directory contain configuration for modprobe, a program to load
+kernel modules.
+
+See man:modprobe.d(5) for explanation of the configuration file format, and
+man:modprobe(8) for a description of the program itself.
+
+Use 'systemd-analyze cat-config modprobe.d' to display the effective config.
index 5cccb9ea47ad4a4d00c505b7acc9671dc03458c0..b5b60ef985c36f0f5433d8c4b59f82694b169171 100644 (file)
@@ -29,3 +29,5 @@ zh_CN
 zh_TW
 pa
 kab
+si
+nl
index 23a7ced1b20621f98d376173f52e46fc10e39331..3713b161ecfe9865ca03528279969ce1ff0bde84 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -3,21 +3,22 @@
 # Korean translation for the systemd.
 # Seong-ho Cho <shcho@gnome.org>, 2015.
 # Dongsu Park <dongsu@endocode.com>, 2015.
-#
+# simmon <simmon@nplob.com>, 2021.
 msgid ""
 msgstr ""
 "Project-Id-Version: systemd\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2021-01-08 17:48+0100\n"
-"PO-Revision-Date: 2015-11-03 13:19+0100\n"
-"Last-Translator: Dongsu Park <dongsu@endocode.com>\n"
-"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
+"PO-Revision-Date: 2021-03-25 03:01+0000\n"
+"Last-Translator: simmon <simmon@nplob.com>\n"
+"Language-Team: Korean <https://translate.fedoraproject.org/projects/systemd/"
+"master/ko/>\n"
 "Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Gtranslator 2.91.7\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.5.1\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
 #: src/core/org.freedesktop.systemd1.policy.in:22
@@ -67,67 +68,53 @@ msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
 
 #: src/home/org.freedesktop.home1.policy:13
 msgid "Create a home area"
-msgstr ""
+msgstr "홈 영역 생성"
 
 #: src/home/org.freedesktop.home1.policy:14
-#, fuzzy
-#| msgid "Authentication is required to reload the systemd state."
 msgid "Authentication is required to create a user's home area."
-msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
+msgstr "사용자 홈 영역을 생성하기 위해서는 인증이 필요합니다."
 
 #: src/home/org.freedesktop.home1.policy:23
 msgid "Remove a home area"
-msgstr ""
+msgstr "홈 영역 제거"
 
 #: src/home/org.freedesktop.home1.policy:24
-#, fuzzy
-#| msgid "Authentication is required to reload the systemd state."
 msgid "Authentication is required to remove a user's home area."
-msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
+msgstr "사용자 홈 영역을 제거하기 위해서는 인증이 필요합니다."
 
 #: src/home/org.freedesktop.home1.policy:33
 msgid "Check credentials of a home area"
-msgstr ""
+msgstr "홈영역 자격증명 확인"
 
 #: src/home/org.freedesktop.home1.policy:34
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to manage active sessions, users and seats."
 msgid ""
 "Authentication is required to check credentials against a user's home area."
-msgstr "활성 세션, 사용자 시트를 관리하려면 인증이 필요합니다."
+msgstr "사용자 홈 영역의 자격증명 확인하려면 인증이 필요합니다."
 
 #: src/home/org.freedesktop.home1.policy:43
 msgid "Update a home area"
-msgstr ""
+msgstr "홈 영역을 최신화"
 
 #: src/home/org.freedesktop.home1.policy:44
-#, fuzzy
-#| msgid "Authentication is required to attach a device to a seat."
 msgid "Authentication is required to update a user's home area."
-msgstr "ì\8b\9cí\8a¸ì\97\90 ì\9e¥ì¹\98 ë¶\80ì°©ì\9d\84 í\97\88ì\9a©하려면 인증이 필요합니다."
+msgstr "ì\82¬ì\9a©ì\9e\90 í\99\88 ì\98\81ì\97­ì\9d\84 ìµ\9cì\8b í\99\94 하려면 인증이 필요합니다."
 
 #: src/home/org.freedesktop.home1.policy:53
 msgid "Resize a home area"
-msgstr ""
+msgstr "홈 영역을 조절"
 
 #: src/home/org.freedesktop.home1.policy:54
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
 msgid "Authentication is required to resize a user's home area."
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "사용자 홈 영역의 크기를 조절하려면 인증이 필요합니다."
 
 #: src/home/org.freedesktop.home1.policy:63
 msgid "Change password of a home area"
-msgstr ""
+msgstr "홈 영역의 비밀번호를 변경"
 
 #: src/home/org.freedesktop.home1.policy:64
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to manage active sessions, users and seats."
 msgid ""
 "Authentication is required to change the password of a user's home area."
-msgstr "활성 세션, 사용자 시트를 관리하려면 인증이 필요합니다."
+msgstr "사용자 홈 영역의 비밀번호를 변경하려면 비밀번호가 필요합니다."
 
 #: src/hostname/org.freedesktop.hostname1.policy:20
 msgid "Set hostname"
@@ -145,9 +132,7 @@ msgstr "정적 호스트 이름 설정"
 msgid ""
 "Authentication is required to set the statically configured local hostname, "
 "as well as the pretty hostname."
-msgstr ""
-"로컬 호스트 이름을 모양새를 갖춘 호스트 이름 처럼  정적으로 설정하려면 인증"
-"이 필요합니다."
+msgstr "로컬호스트 이름을 모양새를 갖춘 호스트이름 처럼 정적으로 설정하려면 인증이 필요합니다."
 
 #: src/hostname/org.freedesktop.hostname1.policy:41
 msgid "Set machine information"
@@ -159,13 +144,11 @@ msgstr "로컬 머신 정보를 설정하려면 인증이 필요합니다."
 
 #: src/hostname/org.freedesktop.hostname1.policy:51
 msgid "Get product UUID"
-msgstr ""
+msgstr "제품 UUID를 획득"
 
 #: src/hostname/org.freedesktop.hostname1.policy:52
-#, fuzzy
-#| msgid "Authentication is required to reload '$(unit)'."
 msgid "Authentication is required to get product UUID."
-msgstr "'$(unit)' 서비스 유닛을 다시 불러오려면 인증이 필요합니다."
+msgstr "제품 UUID를 얻기 위해서는 인증이 필요합니다."
 
 #: src/import/org.freedesktop.import1.policy:22
 msgid "Import a VM or container image"
@@ -185,11 +168,11 @@ msgstr "가상 머신 또는 컨테이너의 이미지를 내보내려면 인증
 
 #: src/import/org.freedesktop.import1.policy:42
 msgid "Download a VM or container image"
-msgstr "ê°\80ì\83\81머ì\8b  ë\98\90ë\8a\94 ì»¨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80 ë\8b¤ì\9a´ë¡\9cë\93\9c"
+msgstr "ê°\80ì\83\81머ì\8b  ë\98\90ë\8a\94 ì»¨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80 ë\82´ë ¤ë°\9b기"
 
 #: src/import/org.freedesktop.import1.policy:43
 msgid "Authentication is required to download a VM or container image"
-msgstr "ê°\80ì\83\81머ì\8b  ë\98\90ë\8a\94 ì»¨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80를 ë\8b¤ì\9a´ë¡\9cë\93\9c하려면 인증이 필요합니다"
+msgstr "ê°\80ì\83\81머ì\8b  ë\98\90ë\8a\94 ì»¨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80를 ë\82´ë ¤ë°\9b기하려면 인증이 필요합니다"
 
 #: src/locale/org.freedesktop.locale1.policy:22
 msgid "Set system locale"
@@ -300,33 +283,22 @@ msgstr ""
 "니다."
 
 #: src/login/org.freedesktop.login1.policy:117
-#, fuzzy
-#| msgid "Allow applications to inhibit system handling of the power key"
 msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "프로그램의 시스템 전원 키 처리 방지 요청 허용"
+msgstr "응용프로그램이 리부트 키 처리하는 시스템 방지 허용"
 
 #: src/login/org.freedesktop.login1.policy:118
-#, fuzzy
-#| msgid ""
-#| "Authentication is required for an application to inhibit system handling "
-#| "of the power key."
 msgid ""
 "Authentication is required for an application to inhibit system handling of "
 "the reboot key."
-msgstr ""
-"프로그램의 시스템 전원 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
+msgstr "응용프로그램이 시스템 리부트 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:128
-#, fuzzy
-#| msgid "Allow non-logged-in users to run programs"
 msgid "Allow non-logged-in user to run programs"
 msgstr "비 로그인 사용자 프로그램 실행 허용"
 
 #: src/login/org.freedesktop.login1.policy:129
-#, fuzzy
-#| msgid "Authentication is required to run programs as a non-logged-in user."
 msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "비 로그인 사용자에게 프로그램 실행을 허용하려면 인증이 필요합니다."
+msgstr "비 로그인 사용자에게 프로그램 실행하려면 명시적 요청이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:138
 msgid "Allow non-logged-in users to run programs"
@@ -414,53 +386,32 @@ msgstr ""
 "인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:235
-#, fuzzy
-#| msgid "Hibernate the system"
 msgid "Halt the system"
-msgstr "ì\8b\9cì\8a¤í\85\9c ìµ\9cë\8c\80 ì \88ì \84 ì\83\81í\83\9c 진입"
+msgstr "ì\8b\9cì\8a¤í\85\9c ì \95ì§\80 진입"
 
 #: src/login/org.freedesktop.login1.policy:236
-#, fuzzy
-#| msgid "Authentication is required to hibernate the system."
 msgid "Authentication is required to halt the system."
-msgstr "ì\8b\9cì\8a¤í\85\9cì\9d\84 ìµ\9cë\8c\80 ì \88ì \84 상태로 놓으려면 인증이 필요합니다."
+msgstr "ì\8b\9cì\8a¤í\85\9cì\9d\84 ì \95ì§\80 상태로 놓으려면 인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:246
-#, fuzzy
-#| msgid "Hibernate the system while other users are logged in"
 msgid "Halt the system while other users are logged in"
-msgstr "다른 사용자가 로그인 했을 때 시스템 최대 절전 상태 진입"
+msgstr "다른 사용자가 로그인 했을 때 시스템이 정지 상태진입"
 
 #: src/login/org.freedesktop.login1.policy:247
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to hibernate the system while other users are "
-#| "logged in."
 msgid ""
 "Authentication is required to halt the system while other users are logged "
 "in."
-msgstr ""
-"다른 사용자가 로그인 했을 때 시스템을 최대 절전 상태로 놓으려면 인증이 필요합"
-"니다."
+msgstr "다른 사용자가 로그인 했을 때 시스템을 정지 상태로 놓으려면 인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:257
-#, fuzzy
-#| msgid "Hibernate the system while an application is inhibiting this"
 msgid "Halt the system while an application is inhibiting this"
-msgstr ""
-"프로그램이 최대 절전 상태 진입을 못하게 요청할 때 시스템 최대 절전 상태 진입"
+msgstr "응용프로그램이 이와 같이 금지 상태일 때에 시스템 정지 상태 진입"
 
 #: src/login/org.freedesktop.login1.policy:258
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to hibernate the system while an application "
-#| "is inhibiting this."
 msgid ""
 "Authentication is required to halt the system while an application is "
 "inhibiting this."
-msgstr ""
-"프로그램이 최대 절전 상태 진입을 못하게 요청할 때 시스템을 최대 절전 상태로 "
-"놓으려면 인증이 필요합니다."
+msgstr "응용프로그램이 이와 같이 금지 할 때에는 시스템을 정지 할 때에는인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:268
 msgid "Suspend the system"
@@ -544,19 +495,15 @@ msgstr "활성화 세션을 잠금 또는 잠금 해제하려면 인증이 필
 
 #: src/login/org.freedesktop.login1.policy:352
 msgid "Set the reboot \"reason\" in the kernel"
-msgstr ""
+msgstr "커널이 재시작 \"원인\"을 설정합니다"
 
 #: src/login/org.freedesktop.login1.policy:353
-#, fuzzy
-#| msgid "Authentication is required to set the system timezone."
 msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "ì\8b\9cì\8a¤í\85\9c ì\8b\9cê°\84ë\8c\80를 설정하려면 인증이 필요합니다."
+msgstr "커ë\84\90ì\97\90ì\84\9c \"reason\"ì\9c¼ë¡\9c ì\9e¬ë\8f\99ì\9e\91 설정하려면 인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:363
-#, fuzzy
-#| msgid "Allow indication to the firmware to boot to setup interface"
 msgid "Indicate to the firmware to boot to setup interface"
-msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시 허용"
+msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시"
 
 #: src/login/org.freedesktop.login1.policy:364
 msgid ""
@@ -566,31 +513,23 @@ msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인
 
 #: src/login/org.freedesktop.login1.policy:374
 msgid "Indicate to the boot loader to boot to the boot loader menu"
-msgstr ""
+msgstr "부트로더 메뉴에 부팅하기 위해 부트로더에 표시하기"
 
 #: src/login/org.freedesktop.login1.policy:375
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to indicate to the firmware to boot to setup "
-#| "interface."
 msgid ""
 "Authentication is required to indicate to the boot loader to boot to the "
 "boot loader menu."
-msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인증이 필요합니다."
+msgstr "부트로더에 부팅하려면 부트로더 메뉴에 표시하려면 인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:385
 msgid "Indicate to the boot loader to boot a specific entry"
-msgstr ""
+msgstr "특정 항목으로 재시작 하기 위해 부트로더 표시"
 
 #: src/login/org.freedesktop.login1.policy:386
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to indicate to the firmware to boot to setup "
-#| "interface."
 msgid ""
 "Authentication is required to indicate to the boot loader to boot into a "
 "specific boot loader entry."
-msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인증이 필요합니다."
+msgstr "부트로더에 지정한 부트로더 에서 부트하거나 지정한 부트로더 진입을 표시하려면 인증이 필요합니다."
 
 #: src/login/org.freedesktop.login1.policy:396
 msgid "Set a wall message"
@@ -602,13 +541,11 @@ msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
 
 #: src/login/org.freedesktop.login1.policy:406
 msgid "Change Session"
-msgstr ""
+msgstr "세션 변경"
 
 #: src/login/org.freedesktop.login1.policy:407
-#, fuzzy
-#| msgid "Authentication is required to set the local hostname."
 msgid "Authentication is required to change the virtual terminal."
-msgstr "로컬 호스트 이름을 설정하려면 인증이 필요합니다."
+msgstr "가상 터미널을 변경하려면 인증이 필요합니다."
 
 #: src/machine/org.freedesktop.machine1.policy:22
 msgid "Log into a local container"
@@ -680,231 +617,189 @@ msgstr "로컬 가상 머신 및 컨테이너 이미지를 관리하려면 인
 
 #: src/network/org.freedesktop.network1.policy:22
 msgid "Set NTP servers"
-msgstr ""
+msgstr "NTP 서버 설정"
 
 #: src/network/org.freedesktop.network1.policy:23
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
 msgid "Authentication is required to set NTP servers."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "NTP 서버 설정에 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:33
 #: src/resolve/org.freedesktop.resolve1.policy:44
 msgid "Set DNS servers"
-msgstr ""
+msgstr "DNS 서버 설정"
 
 #: src/network/org.freedesktop.network1.policy:34
 #: src/resolve/org.freedesktop.resolve1.policy:45
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
 msgid "Authentication is required to set DNS servers."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "DNS 서버를 설정하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:44
 #: src/resolve/org.freedesktop.resolve1.policy:55
 msgid "Set domains"
-msgstr ""
+msgstr "도메인 설정"
 
 #: src/network/org.freedesktop.network1.policy:45
 #: src/resolve/org.freedesktop.resolve1.policy:56
-#, fuzzy
-#| msgid "Authentication is required to stop '$(unit)'."
 msgid "Authentication is required to set domains."
-msgstr "'$(unit)' 서비스 유닛을 멈추려면 인증이 필요합니다."
+msgstr "도메인을 설정하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:55
 #: src/resolve/org.freedesktop.resolve1.policy:66
 msgid "Set default route"
-msgstr ""
+msgstr "기본 라우트 설정"
 
 #: src/network/org.freedesktop.network1.policy:56
 #: src/resolve/org.freedesktop.resolve1.policy:67
-#, fuzzy
-#| msgid "Authentication is required to set the local hostname."
 msgid "Authentication is required to set default route."
-msgstr "로컬 호스트 이름을 설정하려면 인증이 필요합니다."
+msgstr "기본 라우트 설정하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:66
 #: src/resolve/org.freedesktop.resolve1.policy:77
 msgid "Enable/disable LLMNR"
-msgstr ""
+msgstr "LLMNR 활성화/비활성화"
 
 #: src/network/org.freedesktop.network1.policy:67
 #: src/resolve/org.freedesktop.resolve1.policy:78
-#, fuzzy
-#| msgid "Authentication is required to hibernate the system."
 msgid "Authentication is required to enable or disable LLMNR."
-msgstr "시스템을 최대 절전 상태로 놓으려면 인증이 필요합니다."
+msgstr "LLMNR을 활성화 또는 비활성화 하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:77
 #: src/resolve/org.freedesktop.resolve1.policy:88
 msgid "Enable/disable multicast DNS"
-msgstr ""
+msgstr "멀티캐스트 DNS 활성화/비활성화"
 
 #: src/network/org.freedesktop.network1.policy:78
 #: src/resolve/org.freedesktop.resolve1.policy:89
-#, fuzzy
-#| msgid "Authentication is required to log into the local host."
 msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "ë¡\9c컬 í\98¸ì\8a¤í\8a¸ë¡\9c ë¡\9cê·¸ì\9d¸하려면 인증이 필요합니다."
+msgstr "ë©\80í\8b°ìº\90ì\8a¤í\8a¸ DNS í\99\9cì\84±í\99\94 ë\98\90ë\8a\94 ë¹\84í\99\9cì\84±í\99\94하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:88
 #: src/resolve/org.freedesktop.resolve1.policy:99
 msgid "Enable/disable DNS over TLS"
-msgstr ""
+msgstr "TLS를 통한 DNS 활성화/비활성화"
 
 #: src/network/org.freedesktop.network1.policy:89
 #: src/resolve/org.freedesktop.resolve1.policy:100
-#, fuzzy
-#| msgid "Authentication is required to set the local hostname."
 msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "로컬 호스트 이름을 설정하려면 인증이 필요합니다."
+msgstr "TLS를 통 DNS를 활성화 또는 비활성화하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:99
 #: src/resolve/org.freedesktop.resolve1.policy:110
 msgid "Enable/disable DNSSEC"
-msgstr ""
+msgstr "DNSSEC 활성화/비활성화"
 
 #: src/network/org.freedesktop.network1.policy:100
 #: src/resolve/org.freedesktop.resolve1.policy:111
-#, fuzzy
-#| msgid "Authentication is required to hibernate the system."
 msgid "Authentication is required to enable or disable DNSSEC."
-msgstr "시스템을 최대 절전 상태로 놓으려면 인증이 필요합니다."
+msgstr "DNSSEC를 활성화 또는 비활성화 하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:110
 #: src/resolve/org.freedesktop.resolve1.policy:121
 msgid "Set DNSSEC Negative Trust Anchors"
-msgstr ""
+msgstr "DNSSEC 부정적인 신뢰 고정 설정"
 
 #: src/network/org.freedesktop.network1.policy:111
 #: src/resolve/org.freedesktop.resolve1.policy:122
-#, fuzzy
-#| msgid "Authentication is required to set the system locale."
 msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "시스템 로캘을 설정하려면 인증이 필요합니다."
+msgstr "DNSSEC 부정적인 신뢰 고정을 설정하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:121
 msgid "Revert NTP settings"
-msgstr ""
+msgstr "NTP 설정 되돌리기"
 
 #: src/network/org.freedesktop.network1.policy:122
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
 msgid "Authentication is required to reset NTP settings."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "NTP 설정을 재시작하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:132
 msgid "Revert DNS settings"
-msgstr ""
+msgstr "DNS 설정 되돌리기"
 
 #: src/network/org.freedesktop.network1.policy:133
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
 msgid "Authentication is required to reset DNS settings."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "DNS 설정을 재시작하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:143
 msgid "DHCP server sends force renew message"
-msgstr ""
+msgstr "DHCP 서버는 새로운 메시지를 강제로 보냅니다"
 
 #: src/network/org.freedesktop.network1.policy:144
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
 msgid "Authentication is required to send force renew message."
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "새로운 메시지를 보내려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:154
 msgid "Renew dynamic addresses"
-msgstr ""
+msgstr "동적 주소 갱신"
 
 #: src/network/org.freedesktop.network1.policy:155
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
 msgid "Authentication is required to renew dynamic addresses."
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "동적주소를 새로 변경하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:165
 msgid "Reload network settings"
-msgstr ""
+msgstr "네트웍설정 다시 적재함"
 
 #: src/network/org.freedesktop.network1.policy:166
-#, fuzzy
-#| msgid "Authentication is required to reload the systemd state."
 msgid "Authentication is required to reload network settings."
-msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
+msgstr "네트웍 설정을 재적재하려면 인증이 필요합니다."
 
 #: src/network/org.freedesktop.network1.policy:176
 msgid "Reconfigure network interface"
-msgstr ""
+msgstr "네트워크 인터페이스 재설정"
 
 #: src/network/org.freedesktop.network1.policy:177
-#, fuzzy
-#| msgid "Authentication is required to reboot the system."
 msgid "Authentication is required to reconfigure network interface."
-msgstr "시스템을 다시 시작하려면 인증이 필요합니다."
+msgstr "네트웍 연결장치를 재설정하려면 인증이 필요합니다."
 
 #: src/portable/org.freedesktop.portable1.policy:13
 msgid "Inspect a portable service image"
-msgstr ""
+msgstr "이동 서비스 이미지 검사"
 
 #: src/portable/org.freedesktop.portable1.policy:14
-#, fuzzy
-#| msgid "Authentication is required to import a VM or container image"
 msgid "Authentication is required to inspect a portable service image."
-msgstr "VM 또는 컨테이너의 이미지를 가져오려면 인증이 필요합니다"
+msgstr "이동형 서비스 이미지를 검사하려면 인증이 필요합니다."
 
 #: src/portable/org.freedesktop.portable1.policy:23
 msgid "Attach or detach a portable service image"
-msgstr ""
+msgstr "이동 서비스 첨부 또는 분리"
 
 #: src/portable/org.freedesktop.portable1.policy:24
-#, fuzzy
-#| msgid "Authentication is required to attach a device to a seat."
 msgid ""
 "Authentication is required to attach or detach a portable service image."
-msgstr "ì\8b\9cí\8a¸ì\97\90 ì\9e¥ì¹\98 ë¶\80ì°©ì\9d\84 í\97\88ì\9a©í\95\98려면 인증이 필요합니다."
+msgstr "ì\9d´ë\8f\99 ì\84\9cë¹\84ì\8a¤ ì\9e¥ì°© ë\98\90ë\8a\94 ë¶\84리ì\97\90ë\8a\94 인증이 필요합니다."
 
 #: src/portable/org.freedesktop.portable1.policy:34
 msgid "Delete or modify portable service image"
-msgstr ""
+msgstr "이동 서비스 이미지 삭제 또는 변경"
 
 #: src/portable/org.freedesktop.portable1.policy:35
-#, fuzzy
-#| msgid "Authentication is required to download a VM or container image"
 msgid ""
 "Authentication is required to delete or modify a portable service image."
-msgstr "가상머신 또는 컨테이너 이미지를 다운로드하려면 인증이 필요합니다"
+msgstr "이동형 서비스 이미지를 지우거나 변경하려면 인증이 필요합니다."
 
 #: src/resolve/org.freedesktop.resolve1.policy:22
 msgid "Register a DNS-SD service"
-msgstr ""
+msgstr "DNS-SD 서비스 등록"
 
 #: src/resolve/org.freedesktop.resolve1.policy:23
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
 msgid "Authentication is required to register a DNS-SD service"
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "DNS-SD 서비스 등록에는 인증이 필요합니다"
 
 #: src/resolve/org.freedesktop.resolve1.policy:33
 msgid "Unregister a DNS-SD service"
-msgstr ""
+msgstr "DNS-SD 서비스 해제"
 
 #: src/resolve/org.freedesktop.resolve1.policy:34
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
 msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "DNS-SD 서비스 등록해제에는 인증이 필요합니다"
 
 #: src/resolve/org.freedesktop.resolve1.policy:132
 msgid "Revert name resolution settings"
-msgstr ""
+msgstr "이름 확인 설정 되돌리기"
 
 #: src/resolve/org.freedesktop.resolve1.policy:133
-#, fuzzy
-#| msgid "Authentication is required to set the system keyboard settings."
 msgid "Authentication is required to reset name resolution settings."
-msgstr "ì\8b\9cì\8a¤í\85\9c í\82¤ë³´ë\93\9c를 ì\84¤ì \95하려면 인증이 필요합니다."
+msgstr "ì\9d´ë¦\84 í\95´ê²° ì\84¤ì \95ì\9d\84 ì\9e¬ì\8b\9cì\9e\91하려면 인증이 필요합니다."
 
 #: src/timedate/org.freedesktop.timedate1.policy:22
 msgid "Set system time"
@@ -961,12 +856,10 @@ msgid "Authentication is required to restart '$(unit)'."
 msgstr "'$(unit)' 서비스 유닛을 다시 시작하려면 인증이 필요합니다."
 
 #: src/core/dbus-unit.c:535
-#, fuzzy
-#| msgid "Authentication is required to set properties on '$(unit)'."
 msgid ""
 "Authentication is required to send a UNIX signal to the processes of "
 "'$(unit)'."
-msgstr "'$(unit)' 서비스 유닛 속성을 설정하려면 인증이 필요합니다."
+msgstr "'$(unit)'의 처리에 유닉스 신호를 전송하려면 인증이 필요합니다."
 
 #: src/core/dbus-unit.c:566
 msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
@@ -977,21 +870,15 @@ msgid "Authentication is required to set properties on '$(unit)'."
 msgstr "'$(unit)' 서비스 유닛 속성을 설정하려면 인증이 필요합니다."
 
 #: src/core/dbus-unit.c:708
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to reset the \"failed\" state of '$(unit)'."
 msgid ""
 "Authentication is required to delete files and directories associated with "
 "'$(unit)'."
-msgstr "'$(unit)' 서비스 유닛의 \"실패\" 상태를 되돌리려면 인증이 필요합니다."
+msgstr "'$(unit)' 과 함께 지정된 파일 또는 디렉토리 삭제에는 인증이 필요합니다."
 
 #: src/core/dbus-unit.c:757
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to reset the \"failed\" state of '$(unit)'."
 msgid ""
 "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "'$(unit)' 서비스 유닛의 \"실패\" 상태를 되돌리려면 인증이 필요합니다."
+msgstr "'$(unit)'단위의 처리를 동결 또는 해제하기 위해서는 인증이 필요합니다."
 
 #~ msgid "Authentication is required to kill '$(unit)'."
 #~ msgstr "'$(unit)' 서비스 유닛을 강제로 끝내려면 인증이 필요합니다."
diff --git a/po/nl.po b/po/nl.po
new file mode 100644 (file)
index 0000000..efd7f24
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,1015 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the systemd package.
+# Pjotr Vertaalt <pjotrvertaalt@gmail.com>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-01-08 17:48+0100\n"
+"PO-Revision-Date: 2021-03-24 09:16+0000\n"
+"Last-Translator: Pjotr Vertaalt <pjotrvertaalt@gmail.com>\n"
+"Language-Team: Dutch <https://translate.fedoraproject.org/projects/systemd/"
+"master/nl/>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.5.1\n"
+
+#: src/core/org.freedesktop.systemd1.policy.in:22
+msgid "Send passphrase back to system"
+msgstr "Stuur wachtwoordzin terug naar systeem"
+
+#: src/core/org.freedesktop.systemd1.policy.in:23
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Authenticatie is vereist voor het terugsturen van de ingevulde wachtwoordzin "
+"naar het systeem."
+
+#: src/core/org.freedesktop.systemd1.policy.in:33
+msgid "Manage system services or other units"
+msgstr "Beheer systeemdiensten of andere eenheden"
+
+#: src/core/org.freedesktop.systemd1.policy.in:34
+msgid "Authentication is required to manage system services or other units."
+msgstr ""
+"Authenticatie is vereist voor het beheren van systeemdiensten of andere "
+"eenheden."
+
+#: src/core/org.freedesktop.systemd1.policy.in:43
+msgid "Manage system service or unit files"
+msgstr "Beheer systeemdienst of eenheidbestanden"
+
+#: src/core/org.freedesktop.systemd1.policy.in:44
+msgid "Authentication is required to manage system service or unit files."
+msgstr ""
+"Authenticatie is vereist voor het beheren van systeemdienst of "
+"eenheidbestanden."
+
+#: src/core/org.freedesktop.systemd1.policy.in:54
+msgid "Set or unset system and service manager environment variables"
+msgstr "Stel omgevingsvariabelen in voor systeem en dienstenbeheerder"
+
+#: src/core/org.freedesktop.systemd1.policy.in:55
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Authenticatie is vereist voor het instellen van omgevingsvariabelen voor "
+"systeem en dienstenbeheerder."
+
+#: src/core/org.freedesktop.systemd1.policy.in:64
+msgid "Reload the systemd state"
+msgstr "Herlaad de status van systemd"
+
+#: src/core/org.freedesktop.systemd1.policy.in:65
+msgid "Authentication is required to reload the systemd state."
+msgstr "Authenticatie is vereist voor het herladen van de status van systemd."
+
+#: src/home/org.freedesktop.home1.policy:13
+msgid "Create a home area"
+msgstr "Maak een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:14
+msgid "Authentication is required to create a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het maken van een persoonlijke gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:23
+msgid "Remove a home area"
+msgstr "Verwijder een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:24
+msgid "Authentication is required to remove a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van een persoonlijke "
+"gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:33
+msgid "Check credentials of a home area"
+msgstr "Controleer de verificatiegegevens van een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:34
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het controleren van verificatiegegevens voor "
+"een persoonlijke gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:43
+msgid "Update a home area"
+msgstr "Werk een persoonlijke gebruikersmap bij"
+
+#: src/home/org.freedesktop.home1.policy:44
+msgid "Authentication is required to update a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het bijwerken van een persoonlijke "
+"gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:53
+msgid "Resize a home area"
+msgstr "Verander de grootte van een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:54
+msgid "Authentication is required to resize a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het veranderen van de grootte van een "
+"persoonlijke gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:63
+msgid "Change password of a home area"
+msgstr "Verander het wachtwoord van een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:64
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het wijzigen van het wachtwoord van een "
+"persoonlijke gebruikersmap."
+
+#: src/hostname/org.freedesktop.hostname1.policy:20
+msgid "Set hostname"
+msgstr "Stel computernaam in"
+
+#: src/hostname/org.freedesktop.hostname1.policy:21
+msgid "Authentication is required to set the local hostname."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de plaatselijke computernaam."
+
+#: src/hostname/org.freedesktop.hostname1.policy:30
+msgid "Set static hostname"
+msgstr "Stel statische computernaam in"
+
+#: src/hostname/org.freedesktop.hostname1.policy:31
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de statische plaatselijke "
+"computernaam en voor de 'mooie' computernaam."
+
+#: src/hostname/org.freedesktop.hostname1.policy:41
+msgid "Set machine information"
+msgstr "Stel machine-informatie in"
+
+#: src/hostname/org.freedesktop.hostname1.policy:42
+msgid "Authentication is required to set local machine information."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de plaatselijke machine-"
+"informatie."
+
+#: src/hostname/org.freedesktop.hostname1.policy:51
+msgid "Get product UUID"
+msgstr "Verkrijg de UUID van het product"
+
+#: src/hostname/org.freedesktop.hostname1.policy:52
+msgid "Authentication is required to get product UUID."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van de UUID van het product."
+
+#: src/import/org.freedesktop.import1.policy:22
+msgid "Import a VM or container image"
+msgstr "Importeer een VM of een container-schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:23
+msgid "Authentication is required to import a VM or container image"
+msgstr ""
+"Authenticatie is vereist voor het importeren van een VM of een container-"
+"schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:32
+msgid "Export a VM or container image"
+msgstr "Exporteer een VM of een container-schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:33
+msgid "Authentication is required to export a VM or container image"
+msgstr ""
+"Authenticatie is vereist voor het exporteren van een VM of container-"
+"schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:42
+msgid "Download a VM or container image"
+msgstr "Haal een VM of container-schijfkopie binnen"
+
+#: src/import/org.freedesktop.import1.policy:43
+msgid "Authentication is required to download a VM or container image"
+msgstr ""
+"Authenticatie is vereist voor het binnenhalen van een VM of container-"
+"schijfkopie"
+
+#: src/locale/org.freedesktop.locale1.policy:22
+msgid "Set system locale"
+msgstr "Stel de systeemtaal in"
+
+#: src/locale/org.freedesktop.locale1.policy:23
+msgid "Authentication is required to set the system locale."
+msgstr "Authenticatie is vereist voor het instellen van de systeemtaal."
+
+#: src/locale/org.freedesktop.locale1.policy:33
+msgid "Set system keyboard settings"
+msgstr "Stel de instellingen in van het systeemtoetsenbord"
+
+#: src/locale/org.freedesktop.locale1.policy:34
+msgid "Authentication is required to set the system keyboard settings."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de configuratie van het "
+"systeemtoetsenbord."
+
+#: src/login/org.freedesktop.login1.policy:22
+msgid "Allow applications to inhibit system shutdown"
+msgstr "Sta toepassingen toe om afsluiten van het systeem te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:23
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing afsluiten van het systeem "
+"kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:33
+msgid "Allow applications to delay system shutdown"
+msgstr "Sta toepassingen toe om afsluiten van het systeem uit te stellen"
+
+#: src/login/org.freedesktop.login1.policy:34
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing het afsluiten van het "
+"systeem kan uitstellen."
+
+#: src/login/org.freedesktop.login1.policy:44
+msgid "Allow applications to inhibit system sleep"
+msgstr "Sta toepassingen toe om slaapstand van het systeem te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:45
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing slaapstand van het systeem "
+"kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:55
+msgid "Allow applications to delay system sleep"
+msgstr "Sta toepassingen toe om slaapstand van het systeem uit te stellen"
+
+#: src/login/org.freedesktop.login1.policy:56
+msgid "Authentication is required for an application to delay system sleep."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing slaapstand van het systeem "
+"kan uitstellen."
+
+#: src/login/org.freedesktop.login1.policy:65
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr ""
+"Sta toepassingen toe om automatische pauzestand van het systeem te "
+"verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:66
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing automatische pauzestand van "
+"het systeem kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:75
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr ""
+"Sta toepassingen toe om het bedienen van de aan/uit-toets door het systeem "
+"te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:76
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing het bedienen van de aan/uit-"
+"toets door het systeem kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:86
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr ""
+"Sta toepassingen toe om bediening door het systeem van de pauzestandtoets te "
+"verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:87
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de bediening door het "
+"systeem van de pauzestandtoets kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:97
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr ""
+"Sta toepassingen toe om behandeling door het systeem van de slaapstandtoets "
+"te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:98
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de behandeling door het "
+"systeem van de slaapstandtoets kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:107
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr ""
+"Sta toepassingen toe om de behandeling door het systeem van de "
+"klepschakelaar te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:108
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de behandeling door het "
+"systeem van de klepschakelaar kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:117
+msgid "Allow applications to inhibit system handling of the reboot key"
+msgstr ""
+"Sta toepassingen toe om de behandeling door het systeem van de herstarttoets "
+"te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:118
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de behandeling door het "
+"systeem van de herstarttoets kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:128
+msgid "Allow non-logged-in user to run programs"
+msgstr "Sta niet-aangemelde gebruiker toe om programma's te draaien"
+
+#: src/login/org.freedesktop.login1.policy:129
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"Expliciet verzoek is vereist om programma's te draaien als een niet-"
+"aangemelde gebruiker."
+
+#: src/login/org.freedesktop.login1.policy:138
+msgid "Allow non-logged-in users to run programs"
+msgstr "Sta niet-aangemelde gebruikers toe om programma's te draaien"
+
+#: src/login/org.freedesktop.login1.policy:139
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr ""
+"Authenticatie is vereist alvorens een niet-aangemelde gebruiker programma's "
+"kan draaien."
+
+#: src/login/org.freedesktop.login1.policy:148
+msgid "Allow attaching devices to seats"
+msgstr "Sta het verbinden van apparaten aan zittingen toe"
+
+#: src/login/org.freedesktop.login1.policy:149
+msgid "Authentication is required to attach a device to a seat."
+msgstr ""
+"Authenticatie is vereist voor het verbinden van een apparaat aan een zitting."
+
+#: src/login/org.freedesktop.login1.policy:159
+msgid "Flush device to seat attachments"
+msgstr "Verwijder alle apparaat-zitting-koppelingen"
+
+#: src/login/org.freedesktop.login1.policy:160
+msgid "Authentication is required to reset how devices are attached to seats."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de wijze waarop apparaten "
+"zijn verbonden aan zittingen."
+
+#: src/login/org.freedesktop.login1.policy:169
+msgid "Power off the system"
+msgstr "Sluit het systeem af"
+
+#: src/login/org.freedesktop.login1.policy:170
+msgid "Authentication is required to power off the system."
+msgstr "Authenticatie is vereist voor het afsluiten van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:180
+msgid "Power off the system while other users are logged in"
+msgstr "Sluit het systeem af terwijl er nog andere gebruikers zijn aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:181
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het afsluiten van het systeem terwijl er nog "
+"andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:191
+msgid "Power off the system while an application is inhibiting this"
+msgstr "Sluit het systeem af terwijl er een toepassing is die dit verhindert"
+
+#: src/login/org.freedesktop.login1.policy:192
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het afsluiten van het systeem terwijl er een "
+"toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:202
+msgid "Reboot the system"
+msgstr "Herstart het systeem"
+
+#: src/login/org.freedesktop.login1.policy:203
+msgid "Authentication is required to reboot the system."
+msgstr "Authenticatie is vereist voor het herstarten van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:213
+msgid "Reboot the system while other users are logged in"
+msgstr "Herstart het systeem terwijl er nog andere gebruikers zijn aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:214
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Authenticatie is vereist voor het herstarten van het systeem terwijl er nog "
+"andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:224
+msgid "Reboot the system while an application is inhibiting this"
+msgstr "Herstart het systeem terwijl er een toepassing is die dit verhindert"
+
+#: src/login/org.freedesktop.login1.policy:225
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het herstarten van het systeem terwijl er een "
+"toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:235
+msgid "Halt the system"
+msgstr "Zet het systeem stil"
+
+#: src/login/org.freedesktop.login1.policy:236
+msgid "Authentication is required to halt the system."
+msgstr "Authenticatie is vereist voor het stilzetten van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:246
+msgid "Halt the system while other users are logged in"
+msgstr "Zet het systeem stil terwijl er nog andere gebruikers zijn aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:247
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Authenticatie is vereist voor het stilzetten van het systeem terwijl er nog "
+"andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:257
+msgid "Halt the system while an application is inhibiting this"
+msgstr "Zet het systeem stil terwijl er een toepassing is die dit verhindert"
+
+#: src/login/org.freedesktop.login1.policy:258
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het stilzetten van het systeem terwijl er een "
+"toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:268
+msgid "Suspend the system"
+msgstr "Breng het systeem in pauzestand"
+
+#: src/login/org.freedesktop.login1.policy:269
+msgid "Authentication is required to suspend the system."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand brengen van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:278
+msgid "Suspend the system while other users are logged in"
+msgstr ""
+"Breng het systeem in pauzestand terwijl er nog andere gebruikers zijn "
+"aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:279
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand brengen van het systeem "
+"terwijl er nog andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:289
+msgid "Suspend the system while an application is inhibiting this"
+msgstr ""
+"Breng het systeem in pauzestand terwijl er een toepassing is die dit "
+"verhindert"
+
+#: src/login/org.freedesktop.login1.policy:290
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand brengen van het systeem "
+"terwijl er een toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:300
+msgid "Hibernate the system"
+msgstr "Breng het systeem in slaapstand"
+
+#: src/login/org.freedesktop.login1.policy:301
+msgid "Authentication is required to hibernate the system."
+msgstr ""
+"Authenticatie is vereist voor het in slaapstand brengen van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:310
+msgid "Hibernate the system while other users are logged in"
+msgstr ""
+"Breng het systeem in slaapstand terwijl er nog andere gebruikers zijn "
+"aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:311
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het in slaapstand brengen van het systeem "
+"terwijl er nog andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:321
+msgid "Hibernate the system while an application is inhibiting this"
+msgstr ""
+"Breng het systeem in slaapstand terwijl er een toepassing is die dit "
+"verhindert"
+
+#: src/login/org.freedesktop.login1.policy:322
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het in slaapstand brengen van het systeem "
+"terwijl er een toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:332
+msgid "Manage active sessions, users and seats"
+msgstr "Beheer actieve sessies, gebruikers en zittingen"
+
+#: src/login/org.freedesktop.login1.policy:333
+msgid "Authentication is required to manage active sessions, users and seats."
+msgstr ""
+"Authenticatie is vereist voor het beheren van actieve sessies, gebruikers en "
+"zittingen."
+
+#: src/login/org.freedesktop.login1.policy:342
+msgid "Lock or unlock active sessions"
+msgstr "Vergrendel of ontgrendel actieve sessies"
+
+#: src/login/org.freedesktop.login1.policy:343
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr ""
+"Authenticatie is vereist voor het vergrendelen of ontgrendelen van actieve "
+"sessies."
+
+#: src/login/org.freedesktop.login1.policy:352
+msgid "Set the reboot \"reason\" in the kernel"
+msgstr "Stel de herstart-'reden' in de systeemkern in"
+
+#: src/login/org.freedesktop.login1.policy:353
+msgid "Authentication is required to set the reboot \"reason\" in the kernel."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de herstart-'reden' in de "
+"systeemkern."
+
+#: src/login/org.freedesktop.login1.policy:363
+msgid "Indicate to the firmware to boot to setup interface"
+msgstr ""
+"Geef aan de firmware aan om op te starten ten einde een apparaat in te "
+"stellen"
+
+#: src/login/org.freedesktop.login1.policy:364
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Authenticatie is vereist voor het aangeven aan de firmware dat die moet "
+"opstarten om een apparaat in te stellen."
+
+#: src/login/org.freedesktop.login1.policy:374
+msgid "Indicate to the boot loader to boot to the boot loader menu"
+msgstr ""
+"Geef aan de opstartlader aan dat die moet opstarten naar het opstartmenu"
+
+#: src/login/org.freedesktop.login1.policy:375
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Authenticatie is vereist voor het aangeven aan de opstartlader dat die moet "
+"opstarten naar het opstartmenu."
+
+#: src/login/org.freedesktop.login1.policy:385
+msgid "Indicate to the boot loader to boot a specific entry"
+msgstr ""
+"Geef aan de opstartlader aan dat die een bepaalde vermelding moet opstarten"
+
+#: src/login/org.freedesktop.login1.policy:386
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Authenticatie is vereist voor het aangeven aan de opstartlader dat die een "
+"bepaalde opstartvermelding moet opstarten."
+
+#: src/login/org.freedesktop.login1.policy:396
+msgid "Set a wall message"
+msgstr "Stel een gebruikersmuurboodschap in"
+
+#: src/login/org.freedesktop.login1.policy:397
+msgid "Authentication is required to set a wall message"
+msgstr ""
+"Authenticatie is vereist voor het instellen van een gebruikersmuurboodschap"
+
+#: src/login/org.freedesktop.login1.policy:406
+msgid "Change Session"
+msgstr "Verander van sessie"
+
+#: src/login/org.freedesktop.login1.policy:407
+msgid "Authentication is required to change the virtual terminal."
+msgstr "Authenticatie is vereist voor het wijzigen van de virtuele terminal."
+
+#: src/machine/org.freedesktop.machine1.policy:22
+msgid "Log into a local container"
+msgstr "Meld aan bij een plaatselijke container"
+
+#: src/machine/org.freedesktop.machine1.policy:23
+msgid "Authentication is required to log into a local container."
+msgstr ""
+"Authenticatie is vereist voor het aanmelden bij een plaatselijke container."
+
+#: src/machine/org.freedesktop.machine1.policy:32
+msgid "Log into the local host"
+msgstr "Meld aan bij de plaatselijke computer"
+
+#: src/machine/org.freedesktop.machine1.policy:33
+msgid "Authentication is required to log into the local host."
+msgstr ""
+"Authenticatie is vereist voor het aanmelden bij de plaatselijke computer."
+
+#: src/machine/org.freedesktop.machine1.policy:42
+msgid "Acquire a shell in a local container"
+msgstr "Verkrijg een bedieningsvenster in een plaatselijke container"
+
+#: src/machine/org.freedesktop.machine1.policy:43
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een bedieningsvenster in "
+"een plaatselijke container."
+
+#: src/machine/org.freedesktop.machine1.policy:53
+msgid "Acquire a shell on the local host"
+msgstr "Verkrijg een bedieningsvenster op de plaatselijke computer"
+
+#: src/machine/org.freedesktop.machine1.policy:54
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een bedieningsvenster op de "
+"plaatselijke computer."
+
+#: src/machine/org.freedesktop.machine1.policy:64
+msgid "Acquire a pseudo TTY in a local container"
+msgstr "Verkrijg een pseudo-TTY in een plaatselijke container"
+
+#: src/machine/org.freedesktop.machine1.policy:65
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een pseudo-TTY in een "
+"plaatselijke container."
+
+#: src/machine/org.freedesktop.machine1.policy:74
+msgid "Acquire a pseudo TTY on the local host"
+msgstr "Verkrijg een pseudo-TTY op de plaatselijke computer"
+
+#: src/machine/org.freedesktop.machine1.policy:75
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een pseudo-TTY op de "
+"plaatselijke computer."
+
+#: src/machine/org.freedesktop.machine1.policy:84
+msgid "Manage local virtual machines and containers"
+msgstr "Beheer lokale virtuele machines en containers"
+
+#: src/machine/org.freedesktop.machine1.policy:85
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Authenticatie is vereist voor het beheren van lokale virtuele machines en "
+"containers."
+
+#: src/machine/org.freedesktop.machine1.policy:95
+msgid "Manage local virtual machine and container images"
+msgstr "Beheer plaatselijke virtuele machine en container-schijfkopieën"
+
+#: src/machine/org.freedesktop.machine1.policy:96
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Authenticatie is vereist voor het beheren van plaatselijke virtuele machine "
+"en container-schijfkopieën."
+
+#: src/network/org.freedesktop.network1.policy:22
+msgid "Set NTP servers"
+msgstr "Stel NTP-servers in"
+
+#: src/network/org.freedesktop.network1.policy:23
+msgid "Authentication is required to set NTP servers."
+msgstr "Authenticatie is vereist voor het instellen van NTP-servers."
+
+#: src/network/org.freedesktop.network1.policy:33
+#: src/resolve/org.freedesktop.resolve1.policy:44
+msgid "Set DNS servers"
+msgstr "Stel DNS-servers in"
+
+#: src/network/org.freedesktop.network1.policy:34
+#: src/resolve/org.freedesktop.resolve1.policy:45
+msgid "Authentication is required to set DNS servers."
+msgstr "Authenticatie is vereist voor het instellen van DNS-servers."
+
+#: src/network/org.freedesktop.network1.policy:44
+#: src/resolve/org.freedesktop.resolve1.policy:55
+msgid "Set domains"
+msgstr "Stel domeinen in"
+
+#: src/network/org.freedesktop.network1.policy:45
+#: src/resolve/org.freedesktop.resolve1.policy:56
+msgid "Authentication is required to set domains."
+msgstr "Authenticatie is vereist voor het instellen van domeinen."
+
+#: src/network/org.freedesktop.network1.policy:55
+#: src/resolve/org.freedesktop.resolve1.policy:66
+msgid "Set default route"
+msgstr "Stel standaardroute in"
+
+#: src/network/org.freedesktop.network1.policy:56
+#: src/resolve/org.freedesktop.resolve1.policy:67
+msgid "Authentication is required to set default route."
+msgstr "Authenticatie is vereist voor het instellen van een standaardroute."
+
+#: src/network/org.freedesktop.network1.policy:66
+#: src/resolve/org.freedesktop.resolve1.policy:77
+msgid "Enable/disable LLMNR"
+msgstr "Schakel LLMNR in of uit"
+
+#: src/network/org.freedesktop.network1.policy:67
+#: src/resolve/org.freedesktop.resolve1.policy:78
+msgid "Authentication is required to enable or disable LLMNR."
+msgstr "Authenticatie is vereist voor het in- of uitschakelen van LLMNR."
+
+#: src/network/org.freedesktop.network1.policy:77
+#: src/resolve/org.freedesktop.resolve1.policy:88
+msgid "Enable/disable multicast DNS"
+msgstr "Schakel multicast-DNS in of uit"
+
+#: src/network/org.freedesktop.network1.policy:78
+#: src/resolve/org.freedesktop.resolve1.policy:89
+msgid "Authentication is required to enable or disable multicast DNS."
+msgstr ""
+"Authenticatie is vereist voor het in- of uitschakelen van multicast-DNS."
+
+#: src/network/org.freedesktop.network1.policy:88
+#: src/resolve/org.freedesktop.resolve1.policy:99
+msgid "Enable/disable DNS over TLS"
+msgstr "Schakel DNS over TLS in of uit"
+
+#: src/network/org.freedesktop.network1.policy:89
+#: src/resolve/org.freedesktop.resolve1.policy:100
+msgid "Authentication is required to enable or disable DNS over TLS."
+msgstr ""
+"Authenticatie is vereist voor het inschakelen of uitschakelen van DNS over "
+"TLS."
+
+#: src/network/org.freedesktop.network1.policy:99
+#: src/resolve/org.freedesktop.resolve1.policy:110
+msgid "Enable/disable DNSSEC"
+msgstr "Schakel DNSSEC in of uit"
+
+#: src/network/org.freedesktop.network1.policy:100
+#: src/resolve/org.freedesktop.resolve1.policy:111
+msgid "Authentication is required to enable or disable DNSSEC."
+msgstr "Authenticatie is vereist voor het in- of uitschakelen van DNSSEC."
+
+#: src/network/org.freedesktop.network1.policy:110
+#: src/resolve/org.freedesktop.resolve1.policy:121
+msgid "Set DNSSEC Negative Trust Anchors"
+msgstr "Stel DNSSEC Negative Trust Anchors in"
+
+#: src/network/org.freedesktop.network1.policy:111
+#: src/resolve/org.freedesktop.resolve1.policy:122
+msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
+msgstr ""
+"Authenticatie is vereist voor het instellen van DNSSEC Negative Trust "
+"Anchors."
+
+#: src/network/org.freedesktop.network1.policy:121
+msgid "Revert NTP settings"
+msgstr "Draai NTP-instellingen terug"
+
+#: src/network/org.freedesktop.network1.policy:122
+msgid "Authentication is required to reset NTP settings."
+msgstr "Authenticatie is vereist voor het terugzetten van NTP-instellingen."
+
+#: src/network/org.freedesktop.network1.policy:132
+msgid "Revert DNS settings"
+msgstr "Draai DNS-instellingen terug"
+
+#: src/network/org.freedesktop.network1.policy:133
+msgid "Authentication is required to reset DNS settings."
+msgstr "Authenticatie is vereist voor het terugzetten van DNS-instellingen."
+
+#: src/network/org.freedesktop.network1.policy:143
+msgid "DHCP server sends force renew message"
+msgstr "DHCP-server verstuurt 'gedwongen hernieuwing'-boodschap"
+
+#: src/network/org.freedesktop.network1.policy:144
+msgid "Authentication is required to send force renew message."
+msgstr ""
+"Authenticatie is vereist voor het verzenden van een 'gedwongen "
+"hernieuwing'-boodschap."
+
+#: src/network/org.freedesktop.network1.policy:154
+msgid "Renew dynamic addresses"
+msgstr "Hernieuw dynamische adressen"
+
+#: src/network/org.freedesktop.network1.policy:155
+msgid "Authentication is required to renew dynamic addresses."
+msgstr "Authenticatie is vereist voor het hernieuwen van dynamische adressen."
+
+#: src/network/org.freedesktop.network1.policy:165
+msgid "Reload network settings"
+msgstr "Herlaad netwerkinstellingen"
+
+#: src/network/org.freedesktop.network1.policy:166
+msgid "Authentication is required to reload network settings."
+msgstr "Authenticatie is vereist voor het herladen van netwerkinstellingen."
+
+#: src/network/org.freedesktop.network1.policy:176
+msgid "Reconfigure network interface"
+msgstr "Stel netwerkkaart opnieuw in"
+
+#: src/network/org.freedesktop.network1.policy:177
+msgid "Authentication is required to reconfigure network interface."
+msgstr ""
+"Authenticatie is vereist voor het opnieuw instellen van de netwerkkaart."
+
+#: src/portable/org.freedesktop.portable1.policy:13
+msgid "Inspect a portable service image"
+msgstr "Inspecteer een portable service schijfkopie"
+
+#: src/portable/org.freedesktop.portable1.policy:14
+msgid "Authentication is required to inspect a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het inspecteren van een portable service "
+"schijfkopie."
+
+#: src/portable/org.freedesktop.portable1.policy:23
+msgid "Attach or detach a portable service image"
+msgstr "Koppel een portable service schijfkopie aan of af"
+
+#: src/portable/org.freedesktop.portable1.policy:24
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het aan- of afkoppelen van een portable "
+"service schijfkopie."
+
+#: src/portable/org.freedesktop.portable1.policy:34
+msgid "Delete or modify portable service image"
+msgstr "Verwijder of wijzig een portable service schijfkopie"
+
+#: src/portable/org.freedesktop.portable1.policy:35
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen of aanpassen van een portable "
+"service schijfkopie."
+
+#: src/resolve/org.freedesktop.resolve1.policy:22
+msgid "Register a DNS-SD service"
+msgstr "Registreer een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:23
+msgid "Authentication is required to register a DNS-SD service"
+msgstr "Authenticatie is vereist voor het registreren van een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:33
+msgid "Unregister a DNS-SD service"
+msgstr "Ontregistreer een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:34
+msgid "Authentication is required to unregister a DNS-SD service"
+msgstr "Authenticatie is vereist voor het ontregistreren van een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:132
+msgid "Revert name resolution settings"
+msgstr "Draai instellingen voor naamoplossing terug"
+
+#: src/resolve/org.freedesktop.resolve1.policy:133
+msgid "Authentication is required to reset name resolution settings."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de instellingen voor "
+"naamoplossing."
+
+#: src/timedate/org.freedesktop.timedate1.policy:22
+msgid "Set system time"
+msgstr "Stel systeemtijd in"
+
+#: src/timedate/org.freedesktop.timedate1.policy:23
+msgid "Authentication is required to set the system time."
+msgstr "Authenticatie is vereist voor het instellen van de systeemtijd."
+
+#: src/timedate/org.freedesktop.timedate1.policy:33
+msgid "Set system timezone"
+msgstr "Stel de tijdzone van het systeem in"
+
+#: src/timedate/org.freedesktop.timedate1.policy:34
+msgid "Authentication is required to set the system timezone."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de tijdzone van het systeem."
+
+#: src/timedate/org.freedesktop.timedate1.policy:43
+msgid "Set RTC to local timezone or UTC"
+msgstr "Stel RTC in op plaatselijke tijdzone of UTC"
+
+#: src/timedate/org.freedesktop.timedate1.policy:44
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Authenticatie is vereist voor het bepalen of RTC de plaatselijke tijd of de "
+"UTC-tijd opslaat."
+
+#: src/timedate/org.freedesktop.timedate1.policy:53
+msgid "Turn network time synchronization on or off"
+msgstr "Schakel netwerktijdsynchronisatie in of uit"
+
+#: src/timedate/org.freedesktop.timedate1.policy:54
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Authenticatie is vereist voor het bepalen of netwerktijdsynchronisatie "
+"ingeschakeld zal zijn."
+
+#: src/core/dbus-unit.c:359
+msgid "Authentication is required to start '$(unit)'."
+msgstr "Authenticatie is vereist voor het starten van '$(unit)'."
+
+#: src/core/dbus-unit.c:360
+msgid "Authentication is required to stop '$(unit)'."
+msgstr "Authenticatie is vereist voor het stilzetten van '$(unit)'."
+
+#: src/core/dbus-unit.c:361
+msgid "Authentication is required to reload '$(unit)'."
+msgstr "Authenticatie is vereist voor het herladen van '$(unit)'."
+
+#: src/core/dbus-unit.c:362 src/core/dbus-unit.c:363
+msgid "Authentication is required to restart '$(unit)'."
+msgstr "Authenticatie is vereist voor het herstarten van '$(unit)'."
+
+#: src/core/dbus-unit.c:535
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het zenden van een UNIX-signaal naar de "
+"processen van '$(unit)'."
+
+#: src/core/dbus-unit.c:566
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de 'mislukt'-status van "
+"'$(unit)'."
+
+#: src/core/dbus-unit.c:599
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het instellen van eigenschappen op '$(unit)'."
+
+#: src/core/dbus-unit.c:708
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van bestanden en mappen die "
+"verbonden zijn aan '$(unit)'."
+
+#: src/core/dbus-unit.c:757
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Authenticatie is vereist voor het bevriezen of ontdooien van de processen "
+"van '$(unit)' unit."
diff --git a/po/si.po b/po/si.po
new file mode 100644 (file)
index 0000000..1d6b64e
--- /dev/null
+++ b/po/si.po
@@ -0,0 +1,849 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the systemd package.
+# Hela Basa <r45xveza@pm.me>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-01-08 17:48+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: si\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/core/org.freedesktop.systemd1.policy.in:22
+msgid "Send passphrase back to system"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:23
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:33
+msgid "Manage system services or other units"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:34
+msgid "Authentication is required to manage system services or other units."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:43
+msgid "Manage system service or unit files"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:44
+msgid "Authentication is required to manage system service or unit files."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:54
+msgid "Set or unset system and service manager environment variables"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:55
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:64
+msgid "Reload the systemd state"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:65
+msgid "Authentication is required to reload the systemd state."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:13
+msgid "Create a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:14
+msgid "Authentication is required to create a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:23
+msgid "Remove a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:24
+msgid "Authentication is required to remove a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:33
+msgid "Check credentials of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:34
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:43
+msgid "Update a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:44
+msgid "Authentication is required to update a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:53
+msgid "Resize a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:54
+msgid "Authentication is required to resize a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:63
+msgid "Change password of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:64
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:20
+msgid "Set hostname"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:21
+msgid "Authentication is required to set the local hostname."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:30
+msgid "Set static hostname"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:31
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:41
+msgid "Set machine information"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:42
+msgid "Authentication is required to set local machine information."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:51
+msgid "Get product UUID"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:52
+msgid "Authentication is required to get product UUID."
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:22
+msgid "Import a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:23
+msgid "Authentication is required to import a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:32
+msgid "Export a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:33
+msgid "Authentication is required to export a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:42
+msgid "Download a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:43
+msgid "Authentication is required to download a VM or container image"
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:22
+msgid "Set system locale"
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:23
+msgid "Authentication is required to set the system locale."
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:33
+msgid "Set system keyboard settings"
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:34
+msgid "Authentication is required to set the system keyboard settings."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:22
+msgid "Allow applications to inhibit system shutdown"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:23
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:33
+msgid "Allow applications to delay system shutdown"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:34
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:44
+msgid "Allow applications to inhibit system sleep"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:45
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:55
+msgid "Allow applications to delay system sleep"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:56
+msgid "Authentication is required for an application to delay system sleep."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:65
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:66
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:75
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:76
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:86
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:87
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:97
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:98
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:107
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:108
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:117
+msgid "Allow applications to inhibit system handling of the reboot key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:118
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:128
+msgid "Allow non-logged-in user to run programs"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:129
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:138
+msgid "Allow non-logged-in users to run programs"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:139
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:148
+msgid "Allow attaching devices to seats"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:149
+msgid "Authentication is required to attach a device to a seat."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:159
+msgid "Flush device to seat attachments"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:160
+msgid "Authentication is required to reset how devices are attached to seats."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:169
+msgid "Power off the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:170
+msgid "Authentication is required to power off the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:180
+msgid "Power off the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:181
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:191
+msgid "Power off the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:192
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:202
+msgid "Reboot the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:203
+msgid "Authentication is required to reboot the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:213
+msgid "Reboot the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:214
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:224
+msgid "Reboot the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:225
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:235
+msgid "Halt the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:236
+msgid "Authentication is required to halt the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:246
+msgid "Halt the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:247
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:257
+msgid "Halt the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:258
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:268
+msgid "Suspend the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:269
+msgid "Authentication is required to suspend the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:278
+msgid "Suspend the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:279
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:289
+msgid "Suspend the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:290
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:300
+msgid "Hibernate the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:301
+msgid "Authentication is required to hibernate the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:310
+msgid "Hibernate the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:311
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:321
+msgid "Hibernate the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:322
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:332
+msgid "Manage active sessions, users and seats"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:333
+msgid "Authentication is required to manage active sessions, users and seats."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:342
+msgid "Lock or unlock active sessions"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:343
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:352
+msgid "Set the reboot \"reason\" in the kernel"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:353
+msgid "Authentication is required to set the reboot \"reason\" in the kernel."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:363
+msgid "Indicate to the firmware to boot to setup interface"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:364
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:374
+msgid "Indicate to the boot loader to boot to the boot loader menu"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:375
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:385
+msgid "Indicate to the boot loader to boot a specific entry"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:386
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:396
+msgid "Set a wall message"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:397
+msgid "Authentication is required to set a wall message"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:406
+msgid "Change Session"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:407
+msgid "Authentication is required to change the virtual terminal."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:22
+msgid "Log into a local container"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:23
+msgid "Authentication is required to log into a local container."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:32
+msgid "Log into the local host"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:33
+msgid "Authentication is required to log into the local host."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:42
+msgid "Acquire a shell in a local container"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:43
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:53
+msgid "Acquire a shell on the local host"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:54
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:64
+msgid "Acquire a pseudo TTY in a local container"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:65
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:74
+msgid "Acquire a pseudo TTY on the local host"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:75
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:84
+msgid "Manage local virtual machines and containers"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:85
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:95
+msgid "Manage local virtual machine and container images"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:96
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:22
+msgid "Set NTP servers"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:23
+msgid "Authentication is required to set NTP servers."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:33
+#: src/resolve/org.freedesktop.resolve1.policy:44
+msgid "Set DNS servers"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:34
+#: src/resolve/org.freedesktop.resolve1.policy:45
+msgid "Authentication is required to set DNS servers."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:44
+#: src/resolve/org.freedesktop.resolve1.policy:55
+msgid "Set domains"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:45
+#: src/resolve/org.freedesktop.resolve1.policy:56
+msgid "Authentication is required to set domains."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:55
+#: src/resolve/org.freedesktop.resolve1.policy:66
+msgid "Set default route"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:56
+#: src/resolve/org.freedesktop.resolve1.policy:67
+msgid "Authentication is required to set default route."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:66
+#: src/resolve/org.freedesktop.resolve1.policy:77
+msgid "Enable/disable LLMNR"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:67
+#: src/resolve/org.freedesktop.resolve1.policy:78
+msgid "Authentication is required to enable or disable LLMNR."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:77
+#: src/resolve/org.freedesktop.resolve1.policy:88
+msgid "Enable/disable multicast DNS"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:78
+#: src/resolve/org.freedesktop.resolve1.policy:89
+msgid "Authentication is required to enable or disable multicast DNS."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:88
+#: src/resolve/org.freedesktop.resolve1.policy:99
+msgid "Enable/disable DNS over TLS"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:89
+#: src/resolve/org.freedesktop.resolve1.policy:100
+msgid "Authentication is required to enable or disable DNS over TLS."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:99
+#: src/resolve/org.freedesktop.resolve1.policy:110
+msgid "Enable/disable DNSSEC"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:100
+#: src/resolve/org.freedesktop.resolve1.policy:111
+msgid "Authentication is required to enable or disable DNSSEC."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:110
+#: src/resolve/org.freedesktop.resolve1.policy:121
+msgid "Set DNSSEC Negative Trust Anchors"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:111
+#: src/resolve/org.freedesktop.resolve1.policy:122
+msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:121
+msgid "Revert NTP settings"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:122
+msgid "Authentication is required to reset NTP settings."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:132
+msgid "Revert DNS settings"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:133
+msgid "Authentication is required to reset DNS settings."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:143
+msgid "DHCP server sends force renew message"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:144
+msgid "Authentication is required to send force renew message."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:154
+msgid "Renew dynamic addresses"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:155
+msgid "Authentication is required to renew dynamic addresses."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:165
+msgid "Reload network settings"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:166
+msgid "Authentication is required to reload network settings."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:176
+msgid "Reconfigure network interface"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:177
+msgid "Authentication is required to reconfigure network interface."
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:13
+msgid "Inspect a portable service image"
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:14
+msgid "Authentication is required to inspect a portable service image."
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:23
+msgid "Attach or detach a portable service image"
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:24
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:34
+msgid "Delete or modify portable service image"
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:35
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:22
+msgid "Register a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:23
+msgid "Authentication is required to register a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:33
+msgid "Unregister a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:34
+msgid "Authentication is required to unregister a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:132
+msgid "Revert name resolution settings"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:133
+msgid "Authentication is required to reset name resolution settings."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:22
+msgid "Set system time"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:23
+msgid "Authentication is required to set the system time."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:33
+msgid "Set system timezone"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:34
+msgid "Authentication is required to set the system timezone."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:43
+msgid "Set RTC to local timezone or UTC"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:44
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:53
+msgid "Turn network time synchronization on or off"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:54
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+
+#: src/core/dbus-unit.c:359
+msgid "Authentication is required to start '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:360
+msgid "Authentication is required to stop '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:361
+msgid "Authentication is required to reload '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:362 src/core/dbus-unit.c:363
+msgid "Authentication is required to restart '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:535
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:566
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:599
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:708
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:757
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
index c7079a05a25d99d361eb34bab9f00248615a17e1..edfa8bb107e5d5a3c5a75afd616f0eb56c3319e5 100644 (file)
@@ -10,9 +10,8 @@ SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-
 SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
 SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
 
-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb", GOTO="default_hwdb_imported"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
 ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"
-LABEL="default_hwdb_imported"
 
 ACTION!="add", GOTO="default_end"
 
@@ -40,6 +39,8 @@ SUBSYSTEM=="cec", GROUP="video"
 SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="render", MODE="@GROUP_RENDER_MODE@"
 SUBSYSTEM=="kfd", GROUP="render", MODE="@GROUP_RENDER_MODE@"
 
+SUBSYSTEM=="misc", KERNEL=="sgx_enclave", GROUP="sgx", MODE="0660"
+
 # When using static_node= with non-default permissions, also update
 # tmpfiles.d/static-nodes-permissions.conf.in to keep permissions synchronized.
 
index b1626650b7f2e4b0be4c1629958a95c83817a63a..f303e27fd54cfa4c82804cf2b3486202284548d0 100644 (file)
@@ -4,9 +4,8 @@ ACTION=="remove", GOTO="serial_end"
 SUBSYSTEM!="tty", GOTO="serial_end"
 
 SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
-# We already ran the hwdb builtin for devices with MODALIAS in 50-default.rules.
-# Let's cover the remaining case here, where we walk up the tree to find a node with $MODALIAS.
-ENV{MODALIAS}=="", SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci"
+SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci"
+SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
 
 # /dev/serial/by-path/, /dev/serial/by-id/ for USB devices
 KERNEL!="ttyUSB[0-9]*|ttyACM[0-9]*", GOTO="serial_end"
diff --git a/rules.d/README b/rules.d/README
new file mode 100644 (file)
index 0000000..294d6ee
--- /dev/null
@@ -0,0 +1,8 @@
+Files in this directory contain configuration for systemd-udev.service, a
+daemon that manages symlinks to device nodes, permissions of devices nodes,
+emits device events for userspace, and renames network interfaces.
+
+See man:udev(7) for an overview of the configuration file format, and
+man:systemd-udevd.service(8) for a description of service itself.
+
+Use 'systemd-analyze cat-config udev/rules.d' to display the effective config.
index d29564513da1567e6559b034622901d1430ae158..42fa451c6bac73102697dfb71e90dfa4fa6fb87b 100644 (file)
@@ -1,5 +1,9 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
+install_data(
+        'README',
+        install_dir : udevrulesdir)
+
 rules = files('''
         60-autosuspend.rules
         60-block.rules
index 884065187bbdc376f7e26b3b79006551ace05eca..c5db8b77bd8f3dbee88a07494fdd47a8360e2ff0 100644 (file)
@@ -31,20 +31,20 @@ __get_machines() {
 
 _systemd_run() {
     local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
-    local OPTS='-h --help --version --user --system --scope --unit --description --slice
-                -r --remain-after-exit --send-sighup -H --host -M --machine --service-type
-                --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive
-                --on-calendar --timer-property --path-property --socket-property -t --pty
-                -q --quiet --no-block --uid --gid --nice -E --setenv -p --property
-                --no-ask-password --wait -P --pipe -G --collect --working-directory
-                -d --same-dir -S --shell'
+    local OPTS='--no-ask-password --scope -u --unit -p --property --description --slice --slice-inherit
+                -r --remain-after-exit --send-sighup --service-type --uid --gid --nice
+                --working-directory -d --same-dir -E --setenv -t --pty -P --pipe -S --shell -q --quiet
+                --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive --on-calendar
+                --on-clock-change --on-timezone-change --path-property --socket-property
+                --timer-property --no-block --wait -G --collect --user --system -H --host -M --machine
+                -h --help --version'
 
     local mode=--system
     local i
     local opts_with_values=(
-        --unit --description --slice --service-type -H --host -M --machine -p --property --on-active
-        --on-boot --on-startup --on-unit-active --on-unit-inactive --on-calendar --timer-property
-        --path-property --socket-property --uid --gid --nice -E --setenv --working-directory
+        --unit -p --property --slice --description --service-type --uid --gid --nice --working-directory
+        -E --setenv --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive --on-calendar
+        --path-property --socket-property --timer-property -H --host -M --machine
     )
     for (( i=1; i <= COMP_CWORD; i++ )); do
         if [[ ${COMP_WORDS[i]} != -* ]]; then
@@ -78,7 +78,7 @@ _systemd_run() {
         -p|--property)
             local comps='CPUAccounting= MemoryAccounting= BlockIOAccounting= SendSIGHUP=
                          SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group=
-                         DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth=
+                         DevicePolicy= KillMode= ExitType= DeviceAllow= BlockIOReadBandwidth=
                          BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment=
                          KillSignal= RestartKillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA=
                          LimitSTACK= LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC=
index d9998e5dfb15ad9942177a277c68e76e841ce2a5..d7af226105e7ad86180ec4f4b179373e2923e7b2 100644 (file)
@@ -23,17 +23,29 @@ __systemctl() {
     }
 
 _arguments \
+    {-G,--collect}'[Unload the transient unit after it completed]' \
+    '--description=[Description for unit]:description' \
+    '--gid=[Run as system group]:group:_groups' \
     {-h,--help}'[Show help message]' \
-    '--version[Show package version]' \
-    '--user[Run as user unit]' \
     {-H+,--host=}'[Operate on remote host]:[user@]host:_sd_hosts_or_user_at_host' \
     {-M+,--machine=}'[Operate on local container]:machines:_sd_machines' \
-    '--scope[Run this as scope rather than service]' \
-    '--unit=[Run under the specified unit name]:unit name' \
+    '--nice=[Nice level]:nice level' \
+    '--no-ask-password[Do not query the user for authentication]' \
+    '--no-block[Do not synchronously wait for the unit start operation to finish]' \
+    '--on-active=[Run after SEC seconds]:SEC' \
+    '--on-boot=[Run SEC seconds after machine was booted up]:SEC' \
+    '--on-calendar=[Realtime timer]:SPEC' \
+    '--on-clock-change[Defines a trigger based on system clock jumps]' \
+    '--on-startup=[Run SEC seconds after systemd was first started]:SEC' \
+    '--on-timezone-change[Defines a trigger based on system timezone changes]' \
+    '--on-unit-active=[Run SEC seconds after the last activation]:SEC' \
+    '--on-unit-inactive=[Run SEC seconds after the last deactivation]:SEC' \
+    '--path-property=[Set path unit property]:NAME=VALUE' \
+    {-P,--pipe}'[Inherit standard input, output, and error]' \
     {-p+,--property=}'[Set unit property]:NAME=VALUE:(( \
                 CPUAccounting= MemoryAccounting= BlockIOAccounting= SendSIGHUP= \
                 SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group= \
-                DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth= \
+                DevicePolicy= KillMode= ExitType= DeviceAllow= BlockIOReadBandwidth= \
                 BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment= \
                 KillSignal= RestartKillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA= \
                 LimitSTACK= LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC= \
@@ -45,21 +57,24 @@ _arguments \
                 ReadOnlyPaths= InaccessiblePaths= EnvironmentFile= \
                 ProtectSystem= ProtectHome= RuntimeDirectory= PassEnvironment= \
                 ))' \
-    '--description=[Description for unit]:description' \
-    '--slice=[Run in the specified slice]:slices:__systemd-run_slices' \
+    {-t,--pty}'[The service connects to the terminal]' \
+    {-q,--quiet}'[Suppresses additional informational output]' \
     {-r,--remain-after-exit}'[Leave service around until explicitly stopped]' \
+    {-d,--same-dir}'[Run on the current working directory]' \
+    '--scope[Run this as scope rather than service]' \
     '--send-sighup[Send SIGHUP when terminating]' \
     '--service-type=[Service type]:type:(simple forking oneshot dbus notify idle)' \
-    '--uid=[Run as system user]:user:_users' \
-    '--gid=[Run as system group]:group:_groups' \
-    '--nice=[Nice level]:nice level' \
-    '--setenv=[Set environment]:NAME=VALUE' \
-    '--on-active=[Run after SEC seconds]:SEC' \
-    '--on-boot=[Run SEC seconds after machine was booted up]:SEC' \
-    '--on-startup=[Run SEC seconds after systemd was first started]:SEC' \
-    '--on-unit-active=[Run SEC seconds after the last activation]:SEC' \
-    '--on-unit-inactive=[Run SEC seconds after the last deactivation]:SEC' \
-    '--on-calendar=[Realtime timer]:SPEC' \
+    {-E+,--setenv=}'[Set environment]:NAME=VALUE' \
+    {-S,--shell}'[requests an interactive shell in the current working directory]' \
+    '--slice=[Run in the specified slice]:slices:__systemd-run_slices' \
+    '--slice-inherit[Run in the inherited slice]' \
+    '--socket-property=[Set socket unit property]:NAME=VALUE' \
+    '--system[Run as system unit]' \
     '--timer-property=[Set timer unit property]:NAME=VALUE' \
+    '--uid=[Run as system user]:user:_users' \
+    {-u+,--unit=}'[Run under the specified unit name]:unit name' \
+    '--user[Run as user unit]' \
+    '--version[Show package version]' \
     '--wait=[Wait until service stopped again]' \
+    '--working-directory=[Run with the specified working directory]' \
     '*::command:_command'
index 99ec7b5b65b499f0696a26d720d7aaea15bac80b..fc5af11f55705f3b04d7d96ed97f94e9318e1b09 100644 (file)
@@ -1528,11 +1528,11 @@ static int assess(const struct security_info *info, Table *overview_table, Analy
                 if (!details_table)
                         return log_oom();
 
-                (void) table_set_sort(details_table, (size_t) 3, (size_t) 1, (size_t) -1);
+                (void) table_set_sort(details_table, (size_t) 3, (size_t) 1);
                 (void) table_set_reverse(details_table, 3, true);
 
                 if (getenv_bool("SYSTEMD_ANALYZE_DEBUG") <= 0)
-                        (void) table_set_display(details_table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 6, (size_t) -1);
+                        (void) table_set_display(details_table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 6);
         }
 
         for (i = 0; i < ELEMENTSOF(security_assessor_table); i++) {
index ae2d9fc752ca17745229b63282d2c7f1e0f20fb6..1a38d878a36a0defc0cc2531905f56316a13f116 100644 (file)
@@ -1090,7 +1090,7 @@ static int analyze_blame(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
-        r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX);
+        r = table_set_sort(table, (size_t) 0);
         if (r < 0)
                 return r;
 
@@ -1357,7 +1357,7 @@ static int dump(int argc, char *argv[], void *userdata) {
                 return bus_log_parse_error(r);
 
         fflush(stdout);
-        return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, 0);
+        return copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0);
 }
 
 static int cat_config(int argc, char *argv[], void *userdata) {
@@ -1622,7 +1622,7 @@ static int dump_capabilities(int argc, char *argv[], void *userdata) {
                                 return table_log_add_error(r);
                 }
 
-                (void) table_set_sort(table, (size_t) 1, (size_t) -1);
+                (void) table_set_sort(table, (size_t) 1);
         }
 
         (void) pager_open(arg_pager_flags);
index 599ffcdf09caee3fde9ecb57ab4335459587788c..6b89f57e1b71a8ebc9b5a4d71b62a85a71f8e518 100644 (file)
@@ -166,7 +166,7 @@ static int run(int argc, char *argv[]) {
                 return r;
 
         if (arg_timeout > 0)
-                timeout = now(CLOCK_MONOTONIC) + arg_timeout;
+                timeout = usec_add(now(CLOCK_MONOTONIC), arg_timeout);
         else
                 timeout = 0;
 
index aa2177113b1abca2499585bd403d57ee7d6ae6b5..964082bac6640014981059316c47dae1bfc9323c 100644 (file)
@@ -5,7 +5,7 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-#define AUDIT_SESSION_INVALID ((uint32_t) -1)
+#define AUDIT_SESSION_INVALID UINT32_MAX
 
 int audit_session_from_pid(pid_t pid, uint32_t *id);
 int audit_loginuid_from_pid(pid_t pid, uid_t *uid);
index 0f1e30ccd971ce6a2880858cf79a5ce2874df334..676ad9351b25e7c2c7daa3d86a9eca4534bda379 100644 (file)
@@ -68,7 +68,7 @@ int get_block_device(const char *path, dev_t *ret) {
         /* Gets the block device directly backing a file system. If the block device is encrypted, returns
          * the device mapper block device. */
 
-        fd = open(path, O_NOFOLLOW|O_CLOEXEC);
+        fd = open(path, O_RDONLY|O_NOFOLLOW|O_CLOEXEC);
         if (fd < 0)
                 return -errno;
 
@@ -94,7 +94,8 @@ int block_get_originating(dev_t dt, dev_t *ret) {
         _cleanup_closedir_ DIR *d = NULL;
         _cleanup_free_ char *t = NULL;
         char p[SYS_BLOCK_PATH_MAX("/slaves")];
-        struct dirent *de, *found = NULL;
+        _cleanup_free_ char *first_found = NULL;
+        struct dirent *de;
         const char *q;
         dev_t devt;
         int r;
@@ -115,20 +116,22 @@ int block_get_originating(dev_t dt, dev_t *ret) {
                 if (!IN_SET(de->d_type, DT_LNK, DT_UNKNOWN))
                         continue;
 
-                if (found) {
+                if (first_found) {
                         _cleanup_free_ char *u = NULL, *v = NULL, *a = NULL, *b = NULL;
 
-                        /* We found a device backed by multiple other devices. We don't really support automatic
-                         * discovery on such setups, with the exception of dm-verity partitions. In this case there are
-                         * two backing devices: the data partition and the hash partition. We are fine with such
-                         * setups, however, only if both partitions are on the same physical device. Hence, let's
-                         * verify this. */
+                        /* We found a device backed by multiple other devices. We don't really support
+                         * automatic discovery on such setups, with the exception of dm-verity partitions. In
+                         * this case there are two backing devices: the data partition and the hash
+                         * partition. We are fine with such setups, however, only if both partitions are on
+                         * the same physical device.  Hence, let's verify this by iterating over every node
+                         * in the 'slaves/' directory and comparing them with the first that gets returned by
+                         * readdir(), to ensure they all point to the same device. */
 
                         u = path_join(p, de->d_name, "../dev");
                         if (!u)
                                 return -ENOMEM;
 
-                        v = path_join(p, found->d_name, "../dev");
+                        v = path_join(p, first_found, "../dev");
                         if (!v)
                                 return -ENOMEM;
 
@@ -144,15 +147,17 @@ int block_get_originating(dev_t dt, dev_t *ret) {
                          * different physical devices, and we don't support that. */
                         if (!streq(a, b))
                                 return -ENOTUNIQ;
+                } else {
+                        first_found = strdup(de->d_name);
+                        if (!first_found)
+                                return -ENOMEM;
                 }
-
-                found = de;
         }
 
-        if (!found)
+        if (!first_found)
                 return -ENOENT;
 
-        q = strjoina(p, "/", found->d_name, "/dev");
+        q = strjoina(p, "/", first_found, "/dev");
 
         r = read_one_line_file(q, &t);
         if (r < 0)
index 0fb8dfedebd878033fdc76630323f62a7ae71aa9..51aaee71fd7c10a57909902d79edd3915ef18706 100644 (file)
@@ -396,18 +396,18 @@ static bool btrfs_ioctl_search_args_inc(struct btrfs_ioctl_search_args *args) {
          * comparing. This call increases the counter by one, dealing
          * with the overflow between the overflows */
 
-        if (args->key.min_offset < (uint64_t) -1) {
+        if (args->key.min_offset < UINT64_MAX) {
                 args->key.min_offset++;
                 return true;
         }
 
-        if (args->key.min_type < (uint8_t) -1) {
+        if (args->key.min_type < UINT8_MAX) {
                 args->key.min_type++;
                 args->key.min_offset = 0;
                 return true;
         }
 
-        if (args->key.min_objectid < (uint64_t) -1) {
+        if (args->key.min_objectid < UINT64_MAX) {
                 args->key.min_objectid++;
                 args->key.min_offset = 0;
                 args->key.min_type = 0;
@@ -464,11 +464,11 @@ int btrfs_subvol_get_info_fd(int fd, uint64_t subvol_id, BtrfsSubvolInfo *ret) {
                 .key.max_type = BTRFS_ROOT_ITEM_KEY,
 
                 .key.min_offset = 0,
-                .key.max_offset = (uint64_t) -1,
+                .key.max_offset = UINT64_MAX,
 
                 /* No restrictions on the other components */
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
 
         bool found = false;
@@ -562,7 +562,7 @@ int btrfs_qgroup_get_quota_fd(int fd, uint64_t qgroupid, BtrfsQuotaInfo *ret) {
 
                 /* No restrictions on the other components */
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
 
         bool found_info = false, found_limit = false;
@@ -624,12 +624,12 @@ int btrfs_qgroup_get_quota_fd(int fd, uint64_t qgroupid, BtrfsQuotaInfo *ret) {
                                 if (le64toh(qli->flags) & BTRFS_QGROUP_LIMIT_MAX_RFER)
                                         ret->referenced_max = le64toh(qli->max_rfer);
                                 else
-                                        ret->referenced_max = (uint64_t) -1;
+                                        ret->referenced_max = UINT64_MAX;
 
                                 if (le64toh(qli->flags) & BTRFS_QGROUP_LIMIT_MAX_EXCL)
                                         ret->exclusive_max = le64toh(qli->max_excl);
                                 else
-                                        ret->exclusive_max = (uint64_t) -1;
+                                        ret->exclusive_max = UINT64_MAX;
 
                                 found_limit = true;
                         }
@@ -648,13 +648,13 @@ finish:
                 return -ENODATA;
 
         if (!found_info) {
-                ret->referenced = (uint64_t) -1;
-                ret->exclusive = (uint64_t) -1;
+                ret->referenced = UINT64_MAX;
+                ret->exclusive = UINT64_MAX;
         }
 
         if (!found_limit) {
-                ret->referenced_max = (uint64_t) -1;
-                ret->exclusive_max = (uint64_t) -1;
+                ret->referenced_max = UINT64_MAX;
+                ret->exclusive_max = UINT64_MAX;
         }
 
         return 0;
@@ -671,7 +671,7 @@ int btrfs_qgroup_get_quota(const char *path, uint64_t qgroupid, BtrfsQuotaInfo *
 }
 
 int btrfs_subvol_find_subtree_qgroup(int fd, uint64_t subvol_id, uint64_t *ret) {
-        uint64_t level, lowest = (uint64_t) -1, lowest_qgroupid = 0;
+        uint64_t level, lowest = UINT64_MAX, lowest_qgroupid = 0;
         _cleanup_free_ uint64_t *qgroups = NULL;
         int r, n;
 
@@ -713,13 +713,13 @@ int btrfs_subvol_find_subtree_qgroup(int fd, uint64_t subvol_id, uint64_t *ret)
                 if (id != subvol_id)
                         continue;
 
-                if (lowest == (uint64_t) -1 || level < lowest) {
+                if (lowest == UINT64_MAX || level < lowest) {
                         lowest_qgroupid = qgroups[i];
                         lowest = level;
                 }
         }
 
-        if (lowest == (uint64_t) -1) {
+        if (lowest == UINT64_MAX) {
                 /* No suitable higher-level qgroup found, let's return
                  * the leaf qgroup instead, and indicate that with the
                  * return value. */
@@ -1089,7 +1089,7 @@ static int subvol_remove_children(int fd, const char *subvolume, uint64_t subvol
                 .key.max_type = BTRFS_ROOT_BACKREF_KEY,
 
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
 
         struct btrfs_ioctl_vol_args vol_args = {};
@@ -1265,7 +1265,7 @@ int btrfs_qgroup_copy_limits(int fd, uint64_t old_qgroupid, uint64_t new_qgroupi
 
                 /* No restrictions on the other components */
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
 
         int r;
@@ -1451,7 +1451,7 @@ static int subvol_snapshot_children(
                 .key.max_type = BTRFS_ROOT_BACKREF_KEY,
 
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
 
         struct btrfs_ioctl_vol_args_v2 vol_args = {
@@ -1721,10 +1721,10 @@ int btrfs_qgroup_find_parents(int fd, uint64_t qgroupid, uint64_t **ret) {
 
                 /* No restrictions on the other components */
                 .key.min_offset = 0,
-                .key.max_offset = (uint64_t) -1,
+                .key.max_offset = UINT64_MAX,
 
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
 
         _cleanup_free_ uint64_t *items = NULL;
@@ -1965,10 +1965,10 @@ int btrfs_subvol_get_parent(int fd, uint64_t subvol_id, uint64_t *ret) {
 
                 /* No restrictions on the other components */
                 .key.min_offset = 0,
-                .key.max_offset = (uint64_t) -1,
+                .key.max_offset = UINT64_MAX,
 
                 .key.min_transid = 0,
-                .key.max_transid = (uint64_t) -1,
+                .key.max_transid = UINT64_MAX,
         };
         int r;
 
index 43eb23cb05c41a0733f3679d58b7305cf25a877d..b31a9cb2113c0ab9d2ba5eeccadabfda1728e164 100644 (file)
@@ -405,7 +405,7 @@ bool capability_quintet_mangle(CapabilityQuintet *q) {
 
         combined = q->effective | q->bounding | q->inheritable | q->permitted;
 
-        ambient_supported = q->ambient != (uint64_t) -1;
+        ambient_supported = q->ambient != UINT64_MAX;
         if (ambient_supported)
                 combined |= q->ambient;
 
@@ -437,7 +437,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
         _cleanup_cap_free_ cap_t c = NULL, modified = NULL;
         int r;
 
-        if (q->ambient != (uint64_t) -1) {
+        if (q->ambient != UINT64_MAX) {
                 bool changed = false;
 
                 c = cap_get_proc();
@@ -479,7 +479,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
                         return r;
         }
 
-        if (q->inheritable != (uint64_t) -1 || q->permitted != (uint64_t) -1 || q->effective != (uint64_t) -1) {
+        if (q->inheritable != UINT64_MAX || q->permitted != UINT64_MAX || q->effective != UINT64_MAX) {
                 bool changed = false;
 
                 if (!c) {
@@ -492,7 +492,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
                         uint64_t m = UINT64_C(1) << i;
                         cap_value_t cv = (cap_value_t) i;
 
-                        if (q->inheritable != (uint64_t) -1) {
+                        if (q->inheritable != UINT64_MAX) {
                                 cap_flag_value_t old_value, new_value;
 
                                 if (cap_get_flag(c, cv, CAP_INHERITABLE, &old_value) < 0) {
@@ -515,7 +515,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
                                 }
                         }
 
-                        if (q->permitted != (uint64_t) -1) {
+                        if (q->permitted != UINT64_MAX) {
                                 cap_flag_value_t old_value, new_value;
 
                                 if (cap_get_flag(c, cv, CAP_PERMITTED, &old_value) < 0) {
@@ -535,7 +535,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
                                 }
                         }
 
-                        if (q->effective != (uint64_t) -1) {
+                        if (q->effective != UINT64_MAX) {
                                 cap_flag_value_t old_value, new_value;
 
                                 if (cap_get_flag(c, cv, CAP_EFFECTIVE, &old_value) < 0) {
@@ -559,7 +559,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
                 if (changed) {
                         /* In order to change the bounding caps, we need to keep CAP_SETPCAP for a bit
                          * longer. Let's add it to our list hence for now. */
-                        if (q->bounding != (uint64_t) -1) {
+                        if (q->bounding != UINT64_MAX) {
                                 cap_value_t cv = CAP_SETPCAP;
 
                                 modified = cap_dup(c);
@@ -587,7 +587,7 @@ int capability_quintet_enforce(const CapabilityQuintet *q) {
                 }
         }
 
-        if (q->bounding != (uint64_t) -1) {
+        if (q->bounding != UINT64_MAX) {
                 r = capability_bounding_set_drop(q->bounding, false);
                 if (r < 0)
                         return r;
index d9489d7883cae7d5f5591d91cf2885d539c77953..dbce54531d1e2c120960a2d8a0edebcb2c96c8af 100644 (file)
@@ -10,7 +10,7 @@
 #include "missing_capability.h"
 #include "util.h"
 
-#define CAP_ALL (uint64_t) -1
+#define CAP_ALL UINT64_MAX
 
 unsigned cap_last_cap(void);
 int have_effective_cap(int value);
@@ -49,7 +49,7 @@ bool ambient_capabilities_supported(void);
 #define CAP_TO_MASK_CORRECTED(x) (1U << ((x) & 31U))
 
 typedef struct CapabilityQuintet {
-        /* Stores all five types of capabilities in one go. Note that we use (uint64_t) -1 for unset here. This hence
+        /* Stores all five types of capabilities in one go. Note that we use UINT64_MAX for unset here. This hence
          * needs to be updated as soon as Linux learns more than 63 caps. */
         uint64_t effective;
         uint64_t bounding;
@@ -60,14 +60,14 @@ typedef struct CapabilityQuintet {
 
 assert_cc(CAP_LAST_CAP < 64);
 
-#define CAPABILITY_QUINTET_NULL { (uint64_t) -1, (uint64_t) -1, (uint64_t) -1, (uint64_t) -1, (uint64_t) -1 }
+#define CAPABILITY_QUINTET_NULL { UINT64_MAX, UINT64_MAX, UINT64_MAX, UINT64_MAX, UINT64_MAX }
 
 static inline bool capability_quintet_is_set(const CapabilityQuintet *q) {
-        return q->effective != (uint64_t) -1 ||
-                q->bounding != (uint64_t) -1 ||
-                q->inheritable != (uint64_t) -1 ||
-                q->permitted != (uint64_t) -1 ||
-                q->ambient != (uint64_t) -1;
+        return q->effective != UINT64_MAX ||
+                q->bounding != UINT64_MAX ||
+                q->inheritable != UINT64_MAX ||
+                q->permitted != UINT64_MAX ||
+                q->ambient != UINT64_MAX;
 }
 
 /* Mangles the specified caps quintet taking the current bounding set into account:
index 3c59ca5e10607be3b0886cd247941dcab4b5d1ad..8dd3f8cd95018b46a9cef8800e3835e665b908da 100644 (file)
@@ -100,7 +100,7 @@ int cg_read_event(
         if (r < 0)
                 return r;
 
-        r = read_full_file(events, &content, NULL);
+        r = read_full_virtual_file(events, &content, NULL);
         if (r < 0)
                 return r;
 
@@ -527,41 +527,20 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
         return 0;
 }
 
-static int controller_is_accessible(const char *controller) {
-        int r;
+static int controller_is_v1_accessible(const char *root, const char *controller) {
+        const char *cpath, *dn;
 
         assert(controller);
 
-        /* Checks whether a specific controller is accessible,
-         * i.e. its hierarchy mounted. In the unified hierarchy all
-         * controllers are considered accessible, except for the named
-         * hierarchies */
-
-        if (!cg_controller_is_valid(controller))
-                return -EINVAL;
-
-        r = cg_all_unified();
-        if (r < 0)
-                return r;
-        if (r > 0) {
-                /* We don't support named hierarchies if we are using
-                 * the unified hierarchy. */
-
-                if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
-                        return 0;
-
-                if (startswith(controller, "name="))
-                        return -EOPNOTSUPP;
-
-        } else {
-                const char *cc, *dn;
+        dn = controller_to_dirname(controller);
 
-                dn = controller_to_dirname(controller);
-                cc = strjoina("/sys/fs/cgroup/", dn);
+        /* If root if specified, we check that:
+         * - possible subcgroup is created at root,
+         * - we can modify the hierarchy. */
 
-                if (laccess(cc, F_OK) < 0)
-                        return -errno;
-        }
+        cpath = strjoina("/sys/fs/cgroup/", dn, root, root ? "/cgroup.procs" : NULL);
+        if (laccess(cpath, root ? W_OK : F_OK) < 0)
+                return -errno;
 
         return 0;
 }
@@ -572,10 +551,23 @@ int cg_get_path_and_check(const char *controller, const char *path, const char *
         assert(controller);
         assert(fs);
 
-        /* Check if the specified controller is actually accessible */
-        r = controller_is_accessible(controller);
+        if (!cg_controller_is_valid(controller))
+                return -EINVAL;
+
+        r = cg_all_unified();
         if (r < 0)
                 return r;
+        if (r > 0) {
+                /* In the unified hierarchy all controllers are considered accessible,
+                 * except for the named hierarchies */
+                if (startswith(controller, "name="))
+                        return -EOPNOTSUPP;
+        } else {
+                /* Check if the specified controller is actually accessible */
+                r = controller_is_v1_accessible(NULL, controller);
+                if (r < 0)
+                        return r;
+        }
 
         return cg_get_path(controller, path, suffix, fs);
 }
@@ -1567,7 +1559,7 @@ bool cg_controller_is_valid(const char *p) {
                 if (!strchr(CONTROLLER_VALID, *t))
                         return false;
 
-        if (t - p > FILENAME_MAX)
+        if (t - p > NAME_MAX)
                 return false;
 
         return true;
@@ -1892,7 +1884,7 @@ int cg_mask_from_string(const char *value, CGroupMask *ret) {
         return 0;
 }
 
-int cg_mask_supported(CGroupMask *ret) {
+int cg_mask_supported_subtree(const char *root, CGroupMask *ret) {
         CGroupMask mask;
         int r;
 
@@ -1904,15 +1896,11 @@ int cg_mask_supported(CGroupMask *ret) {
         if (r < 0)
                 return r;
         if (r > 0) {
-                _cleanup_free_ char *root = NULL, *controllers = NULL, *path = NULL;
+                _cleanup_free_ char *controllers = NULL, *path = NULL;
 
                 /* In the unified hierarchy we can read the supported and accessible controllers from
                  * the top-level cgroup attribute */
 
-                r = cg_get_root_path(&root);
-                if (r < 0)
-                        return r;
-
                 r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, root, "cgroup.controllers", &path);
                 if (r < 0)
                         return r;
@@ -1931,7 +1919,7 @@ int cg_mask_supported(CGroupMask *ret) {
         } else {
                 CGroupController c;
 
-                /* In the legacy hierarchy, we check which hierarchies are mounted. */
+                /* In the legacy hierarchy, we check which hierarchies are accessible. */
 
                 mask = 0;
                 for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
@@ -1942,7 +1930,7 @@ int cg_mask_supported(CGroupMask *ret) {
                                 continue;
 
                         n = cgroup_controller_to_string(c);
-                        if (controller_is_accessible(n) >= 0)
+                        if (controller_is_v1_accessible(root, n) >= 0)
                                 mask |= bit;
                 }
         }
@@ -1951,6 +1939,17 @@ int cg_mask_supported(CGroupMask *ret) {
         return 0;
 }
 
+int cg_mask_supported(CGroupMask *ret) {
+        _cleanup_free_ char *root = NULL;
+        int r;
+
+        r = cg_get_root_path(&root);
+        if (r < 0)
+                return r;
+
+        return cg_mask_supported_subtree(root, ret);
+}
+
 int cg_kernel_controllers(Set **ret) {
         _cleanup_set_free_free_ Set *controllers = NULL;
         _cleanup_fclose_ FILE *f = NULL;
@@ -1975,7 +1974,7 @@ int cg_kernel_controllers(Set **ret) {
                 return r;
 
         /* Ignore the header line */
-        (void) read_line(f, (size_t) -1, NULL);
+        (void) read_line(f, SIZE_MAX, NULL);
 
         for (;;) {
                 char *controller;
@@ -2053,8 +2052,14 @@ int cg_unified_cached(bool flush) {
                         unified_cache = CGROUP_UNIFIED_SYSTEMD;
                         unified_systemd_v232 = false;
                 } else {
-                        if (statfs("/sys/fs/cgroup/systemd/", &fs) < 0)
+                        if (statfs("/sys/fs/cgroup/systemd/", &fs) < 0) {
+                                if (errno == ENOENT) {
+                                        /* Some other software may have set up /sys/fs/cgroup in a configuration we do not recognize. */
+                                        log_debug_errno(errno, "Unsupported cgroupsv1 setup detected: name=systemd hierarchy not found.");
+                                        return -ENOMEDIUM;
+                                }
                                 return log_debug_errno(errno, "statfs(\"/sys/fs/cgroup/systemd\" failed: %m");
+                        }
 
                         if (F_TYPE_EQUAL(fs.f_type, CGROUP2_SUPER_MAGIC)) {
                                 log_debug("Found cgroup2 on /sys/fs/cgroup/systemd, unified hierarchy for systemd controller (v232 variant)");
index 30b4819eb3d3658555c2d67ca49e0823010a1f9f..f79e384147d11712e229d0c6c0fd56e123b04865 100644 (file)
@@ -75,13 +75,13 @@ CGroupMask get_cpu_accounting_mask(void);
 bool cpu_accounting_is_cheap(void);
 
 /* Special values for all weight knobs on unified hierarchy */
-#define CGROUP_WEIGHT_INVALID ((uint64_t) -1)
+#define CGROUP_WEIGHT_INVALID UINT64_MAX
 #define CGROUP_WEIGHT_MIN UINT64_C(1)
 #define CGROUP_WEIGHT_MAX UINT64_C(10000)
 #define CGROUP_WEIGHT_DEFAULT UINT64_C(100)
 
 #define CGROUP_LIMIT_MIN UINT64_C(0)
-#define CGROUP_LIMIT_MAX ((uint64_t) -1)
+#define CGROUP_LIMIT_MAX UINT64_MAX
 
 static inline bool CGROUP_WEIGHT_IS_OK(uint64_t x) {
         return
@@ -106,7 +106,7 @@ const char* cgroup_io_limit_type_to_string(CGroupIOLimitType t) _const_;
 CGroupIOLimitType cgroup_io_limit_type_from_string(const char *s) _pure_;
 
 /* Special values for the cpu.shares attribute */
-#define CGROUP_CPU_SHARES_INVALID ((uint64_t) -1)
+#define CGROUP_CPU_SHARES_INVALID UINT64_MAX
 #define CGROUP_CPU_SHARES_MIN UINT64_C(2)
 #define CGROUP_CPU_SHARES_MAX UINT64_C(262144)
 #define CGROUP_CPU_SHARES_DEFAULT UINT64_C(1024)
@@ -118,7 +118,7 @@ static inline bool CGROUP_CPU_SHARES_IS_OK(uint64_t x) {
 }
 
 /* Special values for the blkio.weight attribute */
-#define CGROUP_BLKIO_WEIGHT_INVALID ((uint64_t) -1)
+#define CGROUP_BLKIO_WEIGHT_INVALID UINT64_MAX
 #define CGROUP_BLKIO_WEIGHT_MIN UINT64_C(10)
 #define CGROUP_BLKIO_WEIGHT_MAX UINT64_C(1000)
 #define CGROUP_BLKIO_WEIGHT_DEFAULT UINT64_C(500)
@@ -260,6 +260,7 @@ int cg_slice_to_path(const char *unit, char **ret);
 typedef const char* (*cg_migrate_callback_t)(CGroupMask mask, void *userdata);
 
 int cg_mask_supported(CGroupMask *ret);
+int cg_mask_supported_subtree(const char *root, CGroupMask *ret);
 int cg_mask_from_string(const char *s, CGroupMask *ret);
 int cg_mask_to_string(CGroupMask mask, char **ret);
 
index 6bb02c03a6638fad8fd13abbca593e35b8a3429e..d25777cc4b47a030b03014ab1b55aea20d323a43 100644 (file)
@@ -361,7 +361,7 @@ int copy_bytes_full(
                                 return r;
                 }
 
-                if (max_bytes != (uint64_t) -1) {
+                if (max_bytes != UINT64_MAX) {
                         assert(max_bytes >= (uint64_t) n);
                         max_bytes -= n;
                 }
@@ -642,7 +642,7 @@ static int fd_copy_regular(
         if (fdt < 0)
                 return -errno;
 
-        r = copy_bytes_full(fdf, fdt, (uint64_t) -1, copy_flags, NULL, NULL, progress, userdata);
+        r = copy_bytes_full(fdf, fdt, UINT64_MAX, copy_flags, NULL, NULL, progress, userdata);
         if (r < 0) {
                 (void) unlinkat(dt, to, 0);
                 return r;
@@ -1051,7 +1051,7 @@ int copy_file_fd_full(
         if (fdf < 0)
                 return -errno;
 
-        r = copy_bytes_full(fdf, fdt, (uint64_t) -1, copy_flags, NULL, NULL, progress_bytes, userdata);
+        r = copy_bytes_full(fdf, fdt, UINT64_MAX, copy_flags, NULL, NULL, progress_bytes, userdata);
 
         (void) copy_times(fdf, fdt, copy_flags);
         (void) copy_xattr(fdf, fdt);
@@ -1081,7 +1081,7 @@ int copy_file_full(
         if (fdf < 0)
                 return -errno;
 
-        if (mode == (mode_t) -1)
+        if (mode == MODE_INVALID)
                 if (fstat(fdf, &st) < 0)
                         return -errno;
 
@@ -1092,7 +1092,7 @@ int copy_file_full(
                                 return r;
                 }
                 fdt = open(to, flags|O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY,
-                           mode != (mode_t) -1 ? mode : st.st_mode);
+                           mode != MODE_INVALID ? mode : st.st_mode);
                 if (copy_flags & COPY_MAC_CREATE)
                         mac_selinux_create_file_clear();
                 if (fdt < 0)
@@ -1102,7 +1102,7 @@ int copy_file_full(
         if (chattr_mask != 0)
                 (void) chattr_fd(fdt, chattr_flags, chattr_mask & CHATTR_EARLY_FL, NULL);
 
-        r = copy_bytes_full(fdf, fdt, (uint64_t) -1, copy_flags, NULL, NULL, progress_bytes, userdata);
+        r = copy_bytes_full(fdf, fdt, UINT64_MAX, copy_flags, NULL, NULL, progress_bytes, userdata);
         if (r < 0) {
                 close(fdt);
                 (void) unlink(to);
@@ -1147,24 +1147,24 @@ int copy_file_atomic_full(
          * writing it. */
 
         if (copy_flags & COPY_REPLACE) {
-                r = tempfn_random(to, NULL, &t);
+                _cleanup_free_ char *f = NULL;
+
+                r = tempfn_random(to, NULL, &f);
                 if (r < 0)
                         return r;
 
                 if (copy_flags & COPY_MAC_CREATE) {
                         r = mac_selinux_create_file_prepare(to, S_IFREG);
-                        if (r < 0) {
-                                t = mfree(t);
+                        if (r < 0)
                                 return r;
-                        }
                 }
-                fdt = open(t, O_CREAT|O_EXCL|O_NOFOLLOW|O_NOCTTY|O_WRONLY|O_CLOEXEC, 0600);
+                fdt = open(f, O_CREAT|O_EXCL|O_NOFOLLOW|O_NOCTTY|O_WRONLY|O_CLOEXEC, 0600);
                 if (copy_flags & COPY_MAC_CREATE)
                         mac_selinux_create_file_clear();
-                if (fdt < 0) {
-                        t = mfree(t);
+                if (fdt < 0)
                         return -errno;
-                }
+
+                t = TAKE_PTR(f);
         } else {
                 if (copy_flags & COPY_MAC_CREATE) {
                         r = mac_selinux_create_file_prepare(to, S_IFREG);
@@ -1232,6 +1232,8 @@ int copy_access(int fdf, int fdt) {
         assert(fdf >= 0);
         assert(fdt >= 0);
 
+        /* Copies just the access mode (and not the ownership) from fdf to fdt */
+
         if (fstat(fdf, &st) < 0)
                 return -errno;
 
@@ -1241,6 +1243,20 @@ int copy_access(int fdf, int fdt) {
         return 0;
 }
 
+int copy_rights(int fdf, int fdt) {
+        struct stat st;
+
+        assert(fdf >= 0);
+        assert(fdt >= 0);
+
+        /* Copies both access mode and ownership from fdf to fdt */
+
+        if (fstat(fdf, &st) < 0)
+                return -errno;
+
+        return fchmod_and_chown(fdt, st.st_mode & 07777, st.st_uid, st.st_gid);
+}
+
 int copy_xattr(int fdf, int fdt) {
         _cleanup_free_ char *names = NULL;
         int ret = 0, r;
index b583dff2c09e966a1ce78956668f927247cc8707..da3ba07ad27868c27221756321cdad44a17d846d 100644 (file)
@@ -64,4 +64,5 @@ static inline int copy_bytes(int fdf, int fdt, uint64_t max_bytes, CopyFlags cop
 
 int copy_times(int fdf, int fdt, CopyFlags flags);
 int copy_access(int fdf, int fdt);
+int copy_rights(int fdf, int fdt);
 int copy_xattr(int fdf, int fdt);
index 7eb9c351b6d4b4d0692ea2be464a15917d0e6dd5..158ab738e839c0a14a0b0705c5f5f5866d9398cb 100644 (file)
@@ -28,7 +28,7 @@ int encode_devnode_name(const char *str, char *str_enc, size_t len) {
         for (i = 0, j = 0; str[i] != '\0'; i++) {
                 int seqlen;
 
-                seqlen = utf8_encoded_valid_unichar(str + i, (size_t) -1);
+                seqlen = utf8_encoded_valid_unichar(str + i, SIZE_MAX);
                 if (seqlen > 1) {
 
                         if (len-j < (size_t)seqlen)
index 11362d8556b88da20cc9718ce4844faf04043202..a3009093607523b9cd22a78c835d0efb9e677030 100644 (file)
@@ -20,7 +20,7 @@ static int parse_env_file_internal(
                 void *userdata,
                 int *n_pushed) {
 
-        size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = (size_t) -1, last_key_whitespace = (size_t) -1;
+        size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = SIZE_MAX, last_key_whitespace = SIZE_MAX;
         _cleanup_free_ char *contents = NULL, *key = NULL, *value = NULL;
         unsigned line = 1;
         char *p;
@@ -56,7 +56,7 @@ static int parse_env_file_internal(
                                 state = COMMENT;
                         else if (!strchr(WHITESPACE, c)) {
                                 state = KEY;
-                                last_key_whitespace = (size_t) -1;
+                                last_key_whitespace = SIZE_MAX;
 
                                 if (!GREEDY_REALLOC(key, key_alloc, n_key+2))
                                         return -ENOMEM;
@@ -72,11 +72,11 @@ static int parse_env_file_internal(
                                 n_key = 0;
                         } else if (c == '=') {
                                 state = PRE_VALUE;
-                                last_value_whitespace = (size_t) -1;
+                                last_value_whitespace = SIZE_MAX;
                         } else {
                                 if (!strchr(WHITESPACE, c))
-                                        last_key_whitespace = (size_t) -1;
-                                else if (last_key_whitespace == (size_t) -1)
+                                        last_key_whitespace = SIZE_MAX;
+                                else if (last_key_whitespace == SIZE_MAX)
                                          last_key_whitespace = n_key;
 
                                 if (!GREEDY_REALLOC(key, key_alloc, n_key+2))
@@ -97,7 +97,7 @@ static int parse_env_file_internal(
                                         value[n_value] = 0;
 
                                 /* strip trailing whitespace from key */
-                                if (last_key_whitespace != (size_t) -1)
+                                if (last_key_whitespace != SIZE_MAX)
                                         key[last_key_whitespace] = 0;
 
                                 r = push(fname, line, key, value, userdata, n_pushed);
@@ -136,11 +136,11 @@ static int parse_env_file_internal(
                                         value[n_value] = 0;
 
                                 /* Chomp off trailing whitespace from value */
-                                if (last_value_whitespace != (size_t) -1)
+                                if (last_value_whitespace != SIZE_MAX)
                                         value[last_value_whitespace] = 0;
 
                                 /* strip trailing whitespace from key */
-                                if (last_key_whitespace != (size_t) -1)
+                                if (last_key_whitespace != SIZE_MAX)
                                         key[last_key_whitespace] = 0;
 
                                 r = push(fname, line, key, value, userdata, n_pushed);
@@ -153,11 +153,11 @@ static int parse_env_file_internal(
 
                         } else if (c == '\\') {
                                 state = VALUE_ESCAPE;
-                                last_value_whitespace = (size_t) -1;
+                                last_value_whitespace = SIZE_MAX;
                         } else {
                                 if (!strchr(WHITESPACE, c))
-                                        last_value_whitespace = (size_t) -1;
-                                else if (last_value_whitespace == (size_t) -1)
+                                        last_value_whitespace = SIZE_MAX;
+                                else if (last_value_whitespace == SIZE_MAX)
                                         last_value_whitespace = n_value;
 
                                 if (!GREEDY_REALLOC(value, value_alloc, n_value+2))
@@ -255,11 +255,11 @@ static int parse_env_file_internal(
                         value[n_value] = 0;
 
                 if (state == VALUE)
-                        if (last_value_whitespace != (size_t) -1)
+                        if (last_value_whitespace != SIZE_MAX)
                                 value[last_value_whitespace] = 0;
 
                 /* strip trailing whitespace from key */
-                if (last_key_whitespace != (size_t) -1)
+                if (last_key_whitespace != SIZE_MAX)
                         key[last_key_whitespace] = 0;
 
                 r = push(fname, line, key, value, userdata, n_pushed);
index 31f3cda472e60668dfd1084d6198d6e4ec42a8bf..af785ecfa457752879845f65e7ae6fa2f8fc2029 100644 (file)
@@ -114,7 +114,7 @@ int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit,
          * instead be copied directly.
          */
 
-        if (length != (size_t) -1 && length < 1)
+        if (length != SIZE_MAX && length < 1)
                 return -EINVAL;
 
         switch (p[0]) {
@@ -159,7 +159,7 @@ int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit,
                 /* hexadecimal encoding */
                 int a, b;
 
-                if (length != (size_t) -1 && length < 3)
+                if (length != SIZE_MAX && length < 3)
                         return -EINVAL;
 
                 a = unhexchar(p[1]);
@@ -187,7 +187,7 @@ int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit,
                 size_t i;
                 uint32_t c;
 
-                if (length != (size_t) -1 && length < 5)
+                if (length != SIZE_MAX && length < 5)
                         return -EINVAL;
 
                 for (i = 0; i < 4; i++) {
@@ -214,7 +214,7 @@ int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit,
                 size_t i;
                 char32_t c;
 
-                if (length != (size_t) -1 && length < 9)
+                if (length != SIZE_MAX && length < 9)
                         return -EINVAL;
 
                 for (i = 0; i < 8; i++) {
@@ -251,7 +251,7 @@ int cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit,
                 int a, b, c;
                 char32_t m;
 
-                if (length != (size_t) -1 && length < 3)
+                if (length != SIZE_MAX && length < 3)
                         return -EINVAL;
 
                 a = unoctchar(p[0]);
index 4104dac9a74eba854c2c06abe9c3be3855157c11..d1af11318a8704c80036860637541d4302767f33 100644 (file)
@@ -69,14 +69,14 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
                                 return -ENOMEM;
 
                         if (c == 0) {
-                                if ((flags & EXTRACT_CUNESCAPE_RELAX) &&
+                                if ((flags & EXTRACT_UNESCAPE_RELAX) &&
                                     (quote == 0 || flags & EXTRACT_RELAX)) {
                                         /* If we find an unquoted trailing backslash and we're in
-                                         * EXTRACT_CUNESCAPE_RELAX mode, keep it verbatim in the
+                                         * EXTRACT_UNESCAPE_RELAX mode, keep it verbatim in the
                                          * output.
                                          *
                                          * Unbalanced quotes will only be allowed in EXTRACT_RELAX
-                                         * mode, EXTRACT_CUNESCAPE_RELAX mode does not allow them.
+                                         * mode, EXTRACT_UNESCAPE_RELAX mode does not allow them.
                                          */
                                         s[sz++] = '\\';
                                         goto finish_force_terminate;
@@ -91,7 +91,7 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
                                 char32_t u;
 
                                 if ((flags & EXTRACT_CUNESCAPE) &&
-                                    (r = cunescape_one(*p, (size_t) -1, &u, &eight_bit, false)) >= 0) {
+                                    (r = cunescape_one(*p, SIZE_MAX, &u, &eight_bit, false)) >= 0) {
                                         /* A valid escaped sequence */
                                         assert(r >= 1);
 
@@ -102,10 +102,10 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
                                         else
                                                 sz += utf8_encode_unichar(s + sz, u);
                                 } else if ((flags & EXTRACT_UNESCAPE_SEPARATORS) &&
-                                           strchr(separators, **p))
-                                        /* An escaped separator char */
+                                           (strchr(separators, **p) || **p == '\\'))
+                                        /* An escaped separator char or the escape char itself */
                                         s[sz++] = c;
-                                else if (flags & EXTRACT_CUNESCAPE_RELAX) {
+                                else if (flags & EXTRACT_UNESCAPE_RELAX) {
                                         s[sz++] = '\\';
                                         s[sz++] = c;
                                 } else
@@ -196,7 +196,7 @@ int extract_first_word_and_warn(
                 const char *rvalue) {
 
         /* Try to unquote it, if it fails, warn about it and try again
-         * but this time using EXTRACT_CUNESCAPE_RELAX to keep the
+         * but this time using EXTRACT_UNESCAPE_RELAX to keep the
          * backslashes verbatim in invalid escape sequences. */
 
         const char *save;
@@ -207,11 +207,11 @@ int extract_first_word_and_warn(
         if (r >= 0)
                 return r;
 
-        if (r == -EINVAL && !(flags & EXTRACT_CUNESCAPE_RELAX)) {
+        if (r == -EINVAL && !(flags & EXTRACT_UNESCAPE_RELAX)) {
 
-                /* Retry it with EXTRACT_CUNESCAPE_RELAX. */
+                /* Retry it with EXTRACT_UNESCAPE_RELAX. */
                 *p = save;
-                r = extract_first_word(p, ret, separators, flags|EXTRACT_CUNESCAPE_RELAX);
+                r = extract_first_word(p, ret, separators, flags|EXTRACT_UNESCAPE_RELAX);
                 if (r >= 0) {
                         /* It worked this time, hence it must have been an invalid escape sequence. */
                         log_syntax(unit, LOG_WARNING, filename, line, EINVAL, "Ignoring unknown escape sequences: \"%s\"", *ret);
index d1de32e5806d316f3e7cf50564a990089d951e8f..0e9e77e93d31bb97d47b36c903cab1f386a16c13 100644 (file)
@@ -4,13 +4,15 @@
 #include "macro.h"
 
 typedef enum ExtractFlags {
-        EXTRACT_RELAX                    = 1 << 0,
-        EXTRACT_CUNESCAPE                = 1 << 1,
-        EXTRACT_CUNESCAPE_RELAX          = 1 << 2,
-        EXTRACT_UNESCAPE_SEPARATORS      = 1 << 3,
-        EXTRACT_UNQUOTE                  = 1 << 4,
-        EXTRACT_DONT_COALESCE_SEPARATORS = 1 << 5,
-        EXTRACT_RETAIN_ESCAPE            = 1 << 6,
+        EXTRACT_RELAX                    = 1 << 0, /* Allow unbalanced quote and eat up trailing backslash. */
+        EXTRACT_CUNESCAPE                = 1 << 1, /* Unescape known escape sequences. */
+        EXTRACT_UNESCAPE_RELAX           = 1 << 2, /* Allow and keep unknown escape sequences, allow and keep trailing backslash. */
+        EXTRACT_UNESCAPE_SEPARATORS      = 1 << 3, /* Unescape separators (those specified, or whitespace by default). */
+        EXTRACT_UNQUOTE                  = 1 << 4, /* Remove quoting with "" and ''. */
+        EXTRACT_DONT_COALESCE_SEPARATORS = 1 << 5, /* Don't treat multiple adjacent separators as one */
+        EXTRACT_RETAIN_ESCAPE            = 1 << 6, /* Treat escape character '\' as any other character without special meaning */
+
+        /* Note that if no flags are specified, escaped escape characters will be silently stripped. */
 } ExtractFlags;
 
 int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags);
index 15f0ffbdfa7b34db418fa0483c3b991063ecc47e..df30870a1a25f90c76fb2d9d251891958349bc55 100644 (file)
@@ -27,7 +27,8 @@
 #include "string-util.h"
 #include "tmpfile-util.h"
 
-#define READ_FULL_BYTES_MAX (4U*1024U*1024U)
+/* The maximum size of the file we'll read in one go. */
+#define READ_FULL_BYTES_MAX (4U*1024U*1024U - 1)
 
 int fopen_unlocked(const char *path, const char *options, FILE **ret) {
         assert(ret);
@@ -368,7 +369,6 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
         struct stat st;
         size_t n, size;
         int n_retries;
-        char *p;
 
         assert(ret_contents);
 
@@ -385,18 +385,10 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
         if (fd < 0)
                 return -errno;
 
-        /* Start size for files in /proc/ which usually report a file size of 0. (Files in /sys/ report a
-         * file size of 4K, which is probably OK for sizing our initial buffer, and sysfs attributes can't be
-         * larger anyway.) */
-        size = LINE_MAX / 2;
-
         /* Limit the number of attempts to read the number of bytes returned by fstat(). */
         n_retries = 3;
 
         for (;;) {
-                if (n_retries <= 0)
-                        return -EIO;
-
                 if (fstat(fd, &st) < 0)
                         return -errno;
 
@@ -404,19 +396,23 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
                         return -EBADF;
 
                 /* Be prepared for files from /proc which generally report a file size of 0. */
+                assert_cc(READ_FULL_BYTES_MAX < SSIZE_MAX);
                 if (st.st_size > 0) {
+                        if (st.st_size > READ_FULL_BYTES_MAX)
+                                return -EFBIG;
+
                         size = st.st_size;
                         n_retries--;
-                } else
-                        size = size * 2;
-
-                if (size > READ_FULL_BYTES_MAX)
-                        return -E2BIG;
+                } else {
+                        size = READ_FULL_BYTES_MAX;
+                        n_retries = 0;
+                }
 
-                p = realloc(buf, size + 1);
-                if (!p)
+                buf = malloc(size + 1);
+                if (!buf)
                         return -ENOMEM;
-                buf = TAKE_PTR(p);
+                /* Use a bigger allocation if we got it anyway, but not more than the limit. */
+                size = MIN(malloc_usable_size(buf) - 1, READ_FULL_BYTES_MAX);
 
                 for (;;) {
                         ssize_t k;
@@ -443,27 +439,32 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
                  * processing, let's try again either with a bigger guessed size or the new
                  * file size. */
 
+                if (n_retries <= 0)
+                        return st.st_size > 0 ? -EIO : -EFBIG;
+
                 if (lseek(fd, 0, SEEK_SET) < 0)
                         return -errno;
+
+                buf = mfree(buf);
         }
 
         if (n < size) {
+                char *p;
+
+                /* Return rest of the buffer to libc */
                 p = realloc(buf, n + 1);
                 if (!p)
                         return -ENOMEM;
-                buf = TAKE_PTR(p);
+                buf = p;
         }
 
-        if (!ret_size) {
-                /* Safety check: if the caller doesn't want to know the size of what we
-                 * just read it will rely on the trailing NUL byte. But if there's an
-                 * embedded NUL byte, then we should refuse operation as otherwise
-                 * there'd be ambiguity about what we just read. */
-
-                if (memchr(buf, 0, n))
-                        return -EBADMSG;
-        } else
+        if (ret_size)
                 *ret_size = n;
+        else if (memchr(buf, 0, n))
+                /* Safety check: if the caller doesn't want to know the size of what we just read it will
+                 * rely on the trailing NUL byte. But if there's an embedded NUL byte, then we should refuse
+                 * operation as otherwise there'd be ambiguity about what we just read. */
+                return -EBADMSG;
 
         buf[n] = 0;
         *ret_contents = TAKE_PTR(buf);
@@ -548,7 +549,9 @@ int read_full_stream_full(
                 }
 
                 buf = t;
-                n = n_next;
+                /* Unless a size has been explicitly specified, try to read as much as fits into the memory
+                 * we allocated (minus 1, to leave one byte for the safety NUL byte) */
+                n = size == SIZE_MAX ? malloc_usable_size(buf) - 1 : n_next;
 
                 errno = 0;
                 k = fread(buf + l, 1, n - l, f);
@@ -1325,15 +1328,6 @@ int warn_file_is_world_accessible(const char *filename, struct stat *st, const c
         return 0;
 }
 
-int sync_rights(int from, int to) {
-        struct stat st;
-
-        if (fstat(from, &st) < 0)
-                return -errno;
-
-        return fchmod_and_chown(to, st.st_mode & 07777, st.st_uid, st.st_gid);
-}
-
 int rename_and_apply_smack_floor_label(const char *from, const char *to) {
         int r = 0;
         if (rename(from, to) < 0)
index 498e88035483cfa5716dcb8f521613bafb4a2f88..64a30ab7bb12df0236c776366a733c5670c7da71 100644 (file)
@@ -118,6 +118,4 @@ int safe_fgetc(FILE *f, char *ret);
 
 int warn_file_is_world_accessible(const char *filename, struct stat *st, const char *unit, unsigned line);
 
-int sync_rights(int from, int to);
-
 int rename_and_apply_smack_floor_label(const char *temp_path, const char *dest_path);
index 04ed4be9418b770b126eb8149beff5a22a2f8c47..9920604f3abe8b7c346289a4293f883958d97e56 100644 (file)
@@ -47,7 +47,7 @@ char *format_bytes_full(char *buf, size_t l, uint64_t t, FormatBytesFlag flag) {
 
         assert_cc(ELEMENTSOF(table_iec) == ELEMENTSOF(table_si));
 
-        if (t == (uint64_t) -1)
+        if (t == UINT64_MAX)
                 return NULL;
 
         table = flag & FORMAT_BYTES_USE_IEC ? table_iec : table_si;
index 3a3daa9a05d8288c829807b27c039b2d4643b65a..b2a4e8036f8d3653a7e69e61e769f5bfc36f5f35 100644 (file)
@@ -135,34 +135,34 @@ int rename_noreplace(int olddirfd, const char *oldpath, int newdirfd, const char
 }
 
 int readlinkat_malloc(int fd, const char *p, char **ret) {
-        size_t l = FILENAME_MAX+1;
-        int r;
+        size_t l = PATH_MAX;
 
         assert(p);
         assert(ret);
 
         for (;;) {
-                char *c;
+                _cleanup_free_ char *c = NULL;
                 ssize_t n;
 
-                c = new(char, l);
+                c = new(char, l+1);
                 if (!c)
                         return -ENOMEM;
 
-                n = readlinkat(fd, p, c, l-1);
-                if (n < 0) {
-                        r = -errno;
-                        free(c);
-                        return r;
-                }
+                n = readlinkat(fd, p, c, l);
+                if (n < 0)
+                        return -errno;
 
-                if ((size_t) n < l-1) {
+                if ((size_t) n < l) {
                         c[n] = 0;
-                        *ret = c;
+                        *ret = TAKE_PTR(c);
                         return 0;
                 }
 
-                free(c);
+                if (l > (SSIZE_MAX-1)/2) /* readlinkat() returns an ssize_t, and we want an extra byte for a
+                                          * trailing NUL, hence do an overflow check relative to SSIZE_MAX-1
+                                          * here */
+                        return -EFBIG;
+
                 l *= 2;
         }
 }
@@ -428,9 +428,9 @@ int symlink_idempotent(const char *from, const char *to, bool make_relative) {
         if (make_relative) {
                 _cleanup_free_ char *parent = NULL;
 
-                parent = dirname_malloc(to);
-                if (!parent)
-                        return -ENOMEM;
+                r = path_extract_directory(to, &parent);
+                if (r < 0)
+                        return r;
 
                 r = path_make_relative(parent, from, &relpath);
                 if (r < 0)
@@ -1413,33 +1413,45 @@ int unlinkat_deallocate(int fd, const char *name, UnlinkDeallocateFlags flags) {
 int fsync_directory_of_file(int fd) {
         _cleanup_free_ char *path = NULL;
         _cleanup_close_ int dfd = -1;
+        struct stat st;
         int r;
 
-        r = fd_verify_regular(fd);
-        if (r < 0)
-                return r;
+        assert(fd >= 0);
 
-        r = fd_get_path(fd, &path);
-        if (r < 0) {
-                log_debug_errno(r, "Failed to query /proc/self/fd/%d%s: %m",
-                                fd,
-                                r == -ENOSYS ? ", ignoring" : "");
+        /* We only reasonably can do this for regular files and directories, hence check for that */
+        if (fstat(fd, &st) < 0)
+                return -errno;
 
-                if (r == -ENOSYS)
-                        /* If /proc is not available, we're most likely running in some
-                         * chroot environment, and syncing the directory is not very
-                         * important in that case. Let's just silently do nothing. */
-                        return 0;
+        if (S_ISREG(st.st_mode)) {
 
-                return r;
-        }
+                r = fd_get_path(fd, &path);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to query /proc/self/fd/%d%s: %m",
+                                        fd,
+                                        r == -ENOSYS ? ", ignoring" : "");
 
-        if (!path_is_absolute(path))
-                return -EINVAL;
+                        if (r == -ENOSYS)
+                                /* If /proc is not available, we're most likely running in some
+                                 * chroot environment, and syncing the directory is not very
+                                 * important in that case. Let's just silently do nothing. */
+                                return 0;
 
-        dfd = open_parent(path, O_CLOEXEC, 0);
-        if (dfd < 0)
-                return dfd;
+                        return r;
+                }
+
+                if (!path_is_absolute(path))
+                        return -EINVAL;
+
+                dfd = open_parent(path, O_CLOEXEC|O_NOFOLLOW, 0);
+                if (dfd < 0)
+                        return dfd;
+
+        } else if (S_ISDIR(st.st_mode)) {
+                dfd = openat(fd, "..", O_RDONLY|O_DIRECTORY|O_CLOEXEC, 0);
+                if (dfd < 0)
+                        return -errno;
+        } else
+                return -ENOTTY;
 
         if (fsync(dfd) < 0)
                 return -errno;
@@ -1453,9 +1465,14 @@ int fsync_full(int fd) {
         /* Sync both the file and the directory */
 
         r = fsync(fd) < 0 ? -errno : 0;
-        q = fsync_directory_of_file(fd);
 
-        return r < 0 ? r : q;
+        q = fsync_directory_of_file(fd);
+        if (r < 0) /* Return earlier error */
+                return r;
+        if (q == -ENOTTY) /* Ignore if the 'fd' refers to a block device or so which doesn't really have a
+                           * parent dir */
+                return 0;
+        return q;
 }
 
 int fsync_path_at(int at_fd, const char *path) {
@@ -1472,8 +1489,7 @@ int fsync_path_at(int at_fd, const char *path) {
                 } else
                         fd = at_fd;
         } else {
-
-                opened_fd = openat(at_fd, path, O_RDONLY|O_CLOEXEC);
+                opened_fd = openat(at_fd, path, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
                 if (opened_fd < 0)
                         return -errno;
 
@@ -1503,16 +1519,11 @@ int syncfs_path(int atfd, const char *path) {
 
 int open_parent(const char *path, int flags, mode_t mode) {
         _cleanup_free_ char *parent = NULL;
-        int fd;
+        int fd, r;
 
-        if (isempty(path))
-                return -EINVAL;
-        if (path_equal(path, "/")) /* requesting the parent of the root dir is fishy, let's prohibit that */
-                return -EINVAL;
-
-        parent = dirname_malloc(path);
-        if (!parent)
-                return -ENOMEM;
+        r = path_extract_directory(path, &parent);
+        if (r < 0)
+                return r;
 
         /* Let's insist on O_DIRECTORY since the parent of a file or directory is a directory. Except if we open an
          * O_TMPFILE file, because in that case we are actually create a regular file below the parent directory. */
index f036a19eb5df7ca4b33b22a91debcef4306a86bd..45115fd3db18581fc2dbb6863ab7b7f452b91da2 100644 (file)
@@ -11,6 +11,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include "alloc-util.h"
 #include "errno-util.h"
 #include "time-util.h"
 
@@ -107,8 +108,7 @@ static inline char *rmdir_and_free(char *p) {
                 return NULL;
 
         (void) rmdir(p);
-        free(p);
-        return NULL;
+        return mfree(p);
 }
 DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rmdir_and_free);
 
@@ -117,8 +117,7 @@ static inline char* unlink_and_free(char *p) {
                 return NULL;
 
         (void) unlink_noerrno(p);
-        free(p);
-        return NULL;
+        return mfree(p);
 }
 DEFINE_TRIVIAL_CLEANUP_FUNC(char*, unlink_and_free);
 
index da60202e57c53cf7cfab94962836c3cb64a9c0af..cb0104670f0770344005309c422f19559d198257 100644 (file)
@@ -119,7 +119,7 @@ int unhexmem_full(const char *p, size_t l, bool secure, void **ret, size_t *ret_
         assert(ret_len);
         assert(p || l == 0);
 
-        if (l == (size_t) -1)
+        if (l == SIZE_MAX)
                 l = strlen(p);
 
         /* Note that the calculation of memory size is an upper boundary, as we ignore whitespace while decoding */
@@ -309,7 +309,7 @@ int unbase32hexmem(const char *p, size_t l, bool padding, void **mem, size_t *_l
         assert(mem);
         assert(_len);
 
-        if (l == (size_t) -1)
+        if (l == SIZE_MAX)
                 l = strlen(p);
 
         /* padding ensures any base32hex input has input divisible by 8 */
@@ -708,7 +708,7 @@ int unbase64mem_full(const char *p, size_t l, bool secure, void **ret, size_t *r
         assert(ret);
         assert(ret_size);
 
-        if (l == (size_t) -1)
+        if (l == SIZE_MAX)
                 l = strlen(p);
 
         /* A group of four input bytes needs three output bytes, in case of padding we need to add two or three extra
index 8ea350dcc396155f3960b8c04a1d066f00770b29..f0a66da9bfc983c24373a072157d8a64d2dbbc8f 100644 (file)
@@ -2,7 +2,6 @@
 
 #include <errno.h>
 #include <limits.h>
-#include <poll.h>
 #include <stdio.h>
 #include <unistd.h>
 
@@ -159,24 +158,42 @@ int pipe_eof(int fd) {
         return !!(r & POLLHUP);
 }
 
-int fd_wait_for_event(int fd, int event, usec_t t) {
-
-        struct pollfd pollfd = {
-                .fd = fd,
-                .events = event,
-        };
-
+int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout) {
         struct timespec ts;
         int r;
 
-        r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL);
+        assert(fds || nfds == 0);
+
+        if (nfds == 0)
+                return 0;
+
+        r = ppoll(fds, nfds, timeout == USEC_INFINITY ? NULL : timespec_store(&ts, timeout), NULL);
         if (r < 0)
                 return -errno;
         if (r == 0)
                 return 0;
 
-        if (pollfd.revents & POLLNVAL)
-                return -EBADF;
+        for (size_t i = 0, n = r; i < nfds && n > 0; i++) {
+                if (fds[i].revents == 0)
+                        continue;
+                if (fds[i].revents & POLLNVAL)
+                        return -EBADF;
+                n--;
+        }
+
+        return r;
+}
+
+int fd_wait_for_event(int fd, int event, usec_t timeout) {
+        struct pollfd pollfd = {
+                .fd = fd,
+                .events = event,
+        };
+        int r;
+
+        r = ppoll_usec(&pollfd, 1, timeout);
+        if (r <= 0)
+                return r;
 
         return pollfd.revents;
 }
index d817714b050741c3c23b26bc618beaba76024a4b..d98817f760955104a6b655a27d79de05d31b9051 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
+#include <poll.h>
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
@@ -18,6 +19,7 @@ int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
 
 int pipe_eof(int fd);
 
+int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout);
 int fd_wait_for_event(int fd, int event, usec_t timeout);
 
 ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
@@ -60,7 +62,7 @@ static inline bool FILE_SIZE_VALID_OR_INFINITY(uint64_t l) {
 
         /* Same as above, but allows one extra value: -1 as indication for infinity. */
 
-        if (l == (uint64_t) -1)
+        if (l == UINT64_MAX)
                 return true;
 
         return FILE_SIZE_VALID(l);
diff --git a/src/basic/kbd-util.c b/src/basic/kbd-util.c
deleted file mode 100644 (file)
index 267803e..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <ftw.h>
-
-#include "kbd-util.h"
-#include "log.h"
-#include "nulstr-util.h"
-#include "path-util.h"
-#include "set.h"
-#include "string-util.h"
-#include "strv.h"
-#include "utf8.h"
-
-static thread_local Set *keymaps = NULL;
-
-static int nftw_cb(
-                const char *fpath,
-                const struct stat *sb,
-                int tflag,
-                struct FTW *ftwbuf) {
-
-        _cleanup_free_ char *p = NULL;
-        char *e;
-        int r;
-
-        if (tflag != FTW_F)
-                return 0;
-
-        if (!endswith(fpath, ".map") &&
-            !endswith(fpath, ".map.gz"))
-                return 0;
-
-        p = strdup(basename(fpath));
-        if (!p)
-                return FTW_STOP;
-
-        e = endswith(p, ".map");
-        if (e)
-                *e = 0;
-
-        e = endswith(p, ".map.gz");
-        if (e)
-                *e = 0;
-
-        if (!keymap_is_valid(p))
-                return 0;
-
-        r = set_consume(keymaps, TAKE_PTR(p));
-        if (r < 0 && r != -EEXIST)
-                return r;
-
-        return 0;
-}
-
-int get_keymaps(char ***ret) {
-        _cleanup_strv_free_ char **l = NULL;
-        const char *dir;
-        int r;
-
-        keymaps = set_new(&string_hash_ops);
-        if (!keymaps)
-                return -ENOMEM;
-
-        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
-                r = nftw(dir, nftw_cb, 20, FTW_PHYS|FTW_ACTIONRETVAL);
-
-                if (r == FTW_STOP)
-                        log_debug("Directory not found %s", dir);
-                else if (r < 0)
-                        log_debug_errno(r, "Can't add keymap: %m");
-        }
-
-        l = set_get_strv(keymaps);
-        if (!l) {
-                set_free_free(keymaps);
-                return -ENOMEM;
-        }
-
-        set_free(keymaps);
-
-        if (strv_isempty(l))
-                return -ENOENT;
-
-        strv_sort(l);
-
-        *ret = TAKE_PTR(l);
-
-        return 0;
-}
-
-bool keymap_is_valid(const char *name) {
-
-        if (isempty(name))
-                return false;
-
-        if (strlen(name) >= 128)
-                return false;
-
-        if (!utf8_is_valid(name))
-                return false;
-
-        if (!filename_is_valid(name))
-                return false;
-
-        if (!string_is_safe(name))
-                return false;
-
-        return true;
-}
index c8cca96bca48615ab765143877180680b38dc265..595db0c395ac44ebc51bbdf4144741a7097df713 100644 (file)
@@ -252,11 +252,14 @@ int log_open(void) {
 
         /* Do not call from library code. */
 
-        /* If we don't use the console we close it here, to not get
-         * killed by SAK. If we don't use syslog we close it here so
-         * that we are not confused by somebody deleting the socket in
-         * the fs, and to make sure we don't use it if prohibit_ipc is
-         * set. If we don't use /dev/kmsg we still keep it open,
+        /* This function is often called in preparation for logging. Let's make sure we don't clobber errno,
+         * so that a call to a logging function immediately following a log_open() call can still easily
+         * reference an error that happened immediately before the log_open() call. */
+        PROTECT_ERRNO;
+
+        /* If we don't use the console, we close it here to not get killed by SAK. If we don't use syslog, we
+         * close it here too, so that we are not confused by somebody deleting the socket in the fs, and to
+         * make sure we don't use it if prohibit_ipc is set. If we don't use /dev/kmsg we still keep it open,
          * because there is no reason to close it. */
 
         if (log_target == LOG_TARGET_NULL) {
index 52fd58d5b48ee676db668c602facc0cdd38ac11b..b3d32abfc84f9b992b491ac4edbd7dbc8cb5d73a 100644 (file)
@@ -216,7 +216,7 @@ int log_emergency_level(void);
 #define log_error_errno(error, ...)     log_full_errno(LOG_ERR,     error, __VA_ARGS__)
 #define log_emergency_errno(error, ...) log_full_errno(log_emergency_level(), error, __VA_ARGS__)
 
-#ifdef LOG_TRACE
+#if LOG_TRACE
 #  define log_trace(...) log_debug(__VA_ARGS__)
 #else
 #  define log_trace(...) do {} while (0)
index 282118bb1ab9e9bf15882a4ca1cc19f1aa7bd55f..60ef801a253037097a03ef49bc784ef136f8f531 100644 (file)
@@ -83,8 +83,6 @@ basic_sources = files('''
         io-util.c
         io-util.h
         ioprio.h
-        kbd-util.c
-        kbd-util.h
         khash.c
         khash.h
         label.c
@@ -237,6 +235,8 @@ basic_sources = files('''
         strv.h
         strxcpyx.c
         strxcpyx.h
+        sysctl-util.c
+        sysctl-util.h
         syslog-util.c
         syslog-util.h
         terminal-util.c
index 650f62d1d4f7e33f96fc3383b92dcf45c640d4af..550be48cf4d0d0d918c7a0c9281c7e3d16f7bd03 100644 (file)
@@ -37,7 +37,7 @@ def parse_syscall_tables(filenames):
     return {filename.split('-')[-1][:-4]: parse_syscall_table(filename)
             for filename in filenames}
 
-DEF_TEMPLATE = '''\
+DEF_TEMPLATE = '''
 #ifndef __IGNORE_{syscall}
 #  if defined(__aarch64__)
 #    define systemd_NR_{syscall} {nr_arm64}
@@ -99,13 +99,13 @@ def print_syscall_def(syscall, tables, out):
     mappings = {f'nr_{arch}':t.get(syscall, -1)
                 for arch, t in tables.items()}
     print(DEF_TEMPLATE.format(syscall=syscall, **mappings),
-          file=out)
+          file=out, end='')
 
 def print_syscall_defs(syscalls, tables, out):
     print('''\
 /* SPDX-License-Identifier: LGPL-2.1-or-later
  * This file is generated. Do not edit! */
-''' , file=out)
+''' , file=out, end='')
     for syscall in syscalls:
         print_syscall_def(syscall, tables, out)
 
index ed7457f8b76aca89634b203c223696a070c88739..c8f6675eb8676b88855c70115f86ba52ffffcc0d 100644 (file)
@@ -114,7 +114,7 @@ static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *ret_mn
                 xsprintf(path, "/proc/self/fdinfo/%i", subfd);
         }
 
-        r = read_full_file(path, &fdinfo, NULL);
+        r = read_full_virtual_file(path, &fdinfo, NULL);
         if (r == -ENOENT) /* The fdinfo directory is a relatively new addition */
                 return -EOPNOTSUPP;
         if (r < 0)
@@ -148,7 +148,7 @@ static bool filename_possibly_with_slash_suffix(const char *s) {
         if (!slash)
                 return filename_is_valid(s);
 
-        if (slash - s > FILENAME_MAX) /* We want to allocate on the stack below, hence do a size check first */
+        if (slash - s > PATH_MAX) /* We want to allocate on the stack below, hence do a size check first */
                 return false;
 
         if (slash[strspn(slash, "/")] != 0) /* Check that the suffix consist only of one or more slashes */
index 833a18a20499d012a6c3f7c5b089bb86e6132925..a55b76df97b98c5f70f6e1c6f621773ff36a8a0d 100644 (file)
@@ -10,6 +10,7 @@
 #include "namespace-util.h"
 #include "process-util.h"
 #include "stat-util.h"
+#include "stdio-util.h"
 #include "user-util.h"
 
 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd) {
@@ -82,15 +83,14 @@ int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *
 }
 
 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd) {
+        int r;
+
         if (userns_fd >= 0) {
-                /* Can't setns to your own userns, since then you could
-                 * escalate from non-root to root in your own namespace, so
-                 * check if namespaces equal before attempting to enter. */
-                _cleanup_free_ char *userns_fd_path = NULL;
-                int r;
-                if (asprintf(&userns_fd_path, "/proc/self/fd/%d", userns_fd) < 0)
-                        return -ENOMEM;
+                /* Can't setns to your own userns, since then you could escalate from non-root to root in
+                 * your own namespace, so check if namespaces are equal before attempting to enter. */
 
+                char userns_fd_path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
+                xsprintf(userns_fd_path, "/proc/self/fd/%d", userns_fd);
                 r = files_same(userns_fd_path, "/proc/self/ns/user", 0);
                 if (r < 0)
                         return r;
@@ -125,13 +125,13 @@ int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int
         return reset_uid_gid();
 }
 
-int fd_is_network_ns(int fd) {
+int fd_is_ns(int fd, unsigned long nsflag) {
         struct statfs s;
         int r;
 
-        /* Checks whether the specified file descriptor refers to a network namespace. On old kernels there's no nice
-         * way to detect that, hence on those we'll return a recognizable error (EUCLEAN), so that callers can handle
-         * this somewhat nicely.
+        /* Checks whether the specified file descriptor refers to a namespace created by specifying nsflag in clone().
+         * On old kernels there's no nice way to detect that, hence on those we'll return a recognizable error (EUCLEAN),
+         * so that callers can handle this somewhat nicely.
          *
          * This function returns > 0 if the fd definitely refers to a network namespace, 0 if it definitely does not
          * refer to a network namespace, -EUCLEAN if we can't determine, and other negative error codes on error. */
@@ -168,7 +168,7 @@ int fd_is_network_ns(int fd) {
                 return -errno;
         }
 
-        return r == CLONE_NEWNET;
+        return (unsigned long) r == nsflag;
 }
 
 int detach_mount_namespace(void) {
index 7f7d06687307d6f747a31a21eb173ea25c03df3e..daa9accda378240ed6e66c419bc64916f7a1c3d3 100644 (file)
@@ -6,6 +6,6 @@
 int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd);
 int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd);
 
-int fd_is_network_ns(int fd);
+int fd_is_ns(int fd, unsigned long nsflag);
 
 int detach_mount_namespace(void);
index 3d199f028d6d8486446293fcd81a3a5b5145a78c..51c685bc6a87e2c85a6de76bb730471fac5507ab 100644 (file)
@@ -65,15 +65,15 @@ int open_extension_release(const char *root, const char *extension, char **ret_p
 
                 extension_full_path = strjoina("/usr/lib/extension-release.d/extension-release.", extension);
                 r = chase_symlinks(extension_full_path, root, CHASE_PREFIX_ROOT,
-                                  ret_path ? &q : NULL,
-                                  ret_fd ? &fd : NULL);
+                                   ret_path ? &q : NULL,
+                                   ret_fd ? &fd : NULL);
         } else {
                 const char *p;
 
                 FOREACH_STRING(p, "/etc/os-release", "/usr/lib/os-release") {
                         r = chase_symlinks(p, root, CHASE_PREFIX_ROOT,
-                                        ret_path ? &q : NULL,
-                                        ret_fd ? &fd : NULL);
+                                           ret_path ? &q : NULL,
+                                           ret_fd ? &fd : NULL);
                         if (r != -ENOENT)
                                 break;
                 }
@@ -116,10 +116,9 @@ int fopen_extension_release(const char *root, const char *extension, char **ret_
         if (!f)
                 return -errno;
 
-        *ret_file = f;
-
         if (ret_path)
                 *ret_path = TAKE_PTR(p);
+        *ret_file = f;
 
         return 0;
 }
index 951576c021773cadb6143e0beb9c59b6a050da51..7c7664761135a761e194458fe931433a63991d81 100644 (file)
@@ -8,7 +8,7 @@
 
 typedef struct Prioq Prioq;
 
-#define PRIOQ_IDX_NULL ((unsigned) -1)
+#define PRIOQ_IDX_NULL (UINT_MAX)
 
 Prioq *prioq_new(compare_func_t compare);
 Prioq *prioq_free(Prioq *q);
index 304b03960a527469985e9b302e40346e1ecebfbd..7d4301eadb8a3388689829a22fb23ce0660f6bd5 100644 (file)
@@ -124,14 +124,10 @@ int get_process_comm(pid_t pid, char **ret) {
 }
 
 int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags, char **line) {
-        _cleanup_fclose_ FILE *f = NULL;
         _cleanup_free_ char *t = NULL, *ans = NULL;
         const char *p;
-        int r;
         size_t k;
-
-        /* This is supposed to be a safety guard against runaway command lines. */
-        size_t max_length = sc_arg_max();
+        int r;
 
         assert(line);
         assert(pid >= 0);
@@ -147,36 +143,18 @@ int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags
          * comm_fallback is false). Returns 0 and sets *line otherwise. */
 
         p = procfs_file_alloca(pid, "cmdline");
-        r = fopen_unlocked(p, "re", &f);
+        r = read_full_virtual_file(p, &t, &k);
         if (r == -ENOENT)
                 return -ESRCH;
         if (r < 0)
                 return r;
 
-        /* We assume that each four-byte character uses one or two columns. If we ever check for combining
-         * characters, this assumption will need to be adjusted. */
-        if ((size_t) 4 * max_columns + 1 < max_columns)
-                max_length = MIN(max_length, (size_t) 4 * max_columns + 1);
-
-        t = new(char, max_length);
-        if (!t)
-                return -ENOMEM;
-
-        k = fread(t, 1, max_length, f);
         if (k > 0) {
                 /* Arguments are separated by NULs. Let's replace those with spaces. */
                 for (size_t i = 0; i < k - 1; i++)
                         if (t[i] == '\0')
                                 t[i] = ' ';
-
-                t[k] = '\0'; /* Normally, t[k] is already NUL, so this is just a guard in case of short read */
         } else {
-                /* We only treat getting nothing as an error. We *could* also get an error after reading some
-                 * data, but we ignore that case, as such an error is rather unlikely and we prefer to get
-                 * some data rather than none. */
-                if (ferror(f))
-                        return -errno;
-
                 if (!(flags & PROCESS_CMDLINE_COMM_FALLBACK))
                         return -ENOENT;
 
@@ -187,7 +165,7 @@ int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags
                 if (r < 0)
                         return r;
 
-                mfree(t);
+                free(t);
                 t = strjoin("[", t2, "]");
                 if (!t)
                         return -ENOMEM;
@@ -756,7 +734,7 @@ int wait_for_terminate_with_timeout(pid_t pid, usec_t timeout) {
 
         /* Drop into a sigtimewait-based timeout. Waiting for the
          * pid to exit. */
-        until = now(CLOCK_MONOTONIC) + timeout;
+        until = usec_add(now(CLOCK_MONOTONIC), timeout);
         for (;;) {
                 usec_t n;
                 siginfo_t status = {};
@@ -1230,6 +1208,11 @@ int safe_fork_full(
 
         original_pid = getpid_cached();
 
+        if (flags & FORK_FLUSH_STDIO) {
+                fflush(stdout);
+                fflush(stderr); /* This one shouldn't be necessary, stderr should be unbuffered anyway, but let's better be safe than sorry */
+        }
+
         if (flags & (FORK_RESET_SIGNALS|FORK_DEATHSIG)) {
                 /* We temporarily block all signals, so that the new child has them blocked initially. This way, we can
                  * be sure that SIGTERMs are not lost we might send to the child. */
@@ -1462,7 +1445,11 @@ int fork_agent(const char *name, const int except[], size_t n_except, pid_t *ret
 
         /* Spawns a temporary TTY agent, making sure it goes away when we go away */
 
-        r = safe_fork_full(name, except, n_except, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS, ret_pid);
+        r = safe_fork_full(name,
+                           except,
+                           n_except,
+                           FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_REOPEN_LOG,
+                           ret_pid);
         if (r < 0)
                 return r;
         if (r > 0)
@@ -1543,7 +1530,7 @@ int pidfd_get_pid(int fd, pid_t *ret) {
 
         xsprintf(path, "/proc/self/fdinfo/%i", fd);
 
-        r = read_full_file(path, &fdinfo, NULL);
+        r = read_full_virtual_file(path, &fdinfo, NULL);
         if (r == -ENOENT) /* if fdinfo doesn't exist we assume the process does not exist */
                 return -ESRCH;
         if (r < 0)
index bf709f6669a293c854a7f12586e283703e1cc8f0..ddce7bd2722b0b7155caa5f4e49295c5c8861788 100644 (file)
@@ -162,6 +162,7 @@ typedef enum ForkFlags {
         FORK_MOUNTNS_SLAVE      = 1 <<  9, /* Make child's mount namespace MS_SLAVE */
         FORK_RLIMIT_NOFILE_SAFE = 1 << 10, /* Set RLIMIT_NOFILE soft limit to 1K for select() compat */
         FORK_STDOUT_TO_STDERR   = 1 << 11, /* Make stdout a copy of stderr */
+        FORK_FLUSH_STDIO        = 1 << 12, /* fflush() stdout (and stderr) before forking */
 } ForkFlags;
 
 int safe_fork_full(const char *name, const int except_fds[], size_t n_except_fds, ForkFlags flags, pid_t *ret_pid);
index bae2ec3ffc5f9f6fc6f75839f8466638733ba492..005bf31dc7ceeb14821e3ec8d5c67df69486c406 100644 (file)
@@ -19,7 +19,7 @@ bool ratelimit_below(RateLimit *r) {
         ts = now(CLOCK_MONOTONIC);
 
         if (r->begin <= 0 ||
-            ts - r->begin > r->interval) {
+            usec_sub_unsigned(ts, r->begin) > r->interval) {
                 r->begin = ts;
 
                 /* Reset counter */
index 4c39ce829042006d9961cb778ac56ee4167208bc..2f2ebc39e9b628e0858b9e3518ad24a167810cf0 100644 (file)
@@ -23,13 +23,38 @@ static bool is_physical_fs(const struct statfs *sfs) {
         return !is_temporary_fs(sfs) && !is_cgroup_fs(sfs);
 }
 
+static int patch_dirfd_mode(
+                int dfd,
+                mode_t *ret_old_mode) {
+
+        struct stat st;
+
+        assert(dfd >= 0);
+        assert(ret_old_mode);
+
+        if (fstat(dfd, &st) < 0)
+                return -errno;
+        if (!S_ISDIR(st.st_mode))
+                return -ENOTDIR;
+        if (FLAGS_SET(st.st_mode, 0700)) /* Already set? */
+                return -EACCES; /* original error */
+        if (st.st_uid != geteuid())  /* this only works if the UID matches ours */
+                return -EACCES;
+
+        if (fchmod(dfd, (st.st_mode | 0700) & 07777) < 0)
+                return -errno;
+
+        *ret_old_mode = st.st_mode;
+        return 0;
+}
+
 static int unlinkat_harder(
                 int dfd,
                 const char *filename,
                 int unlink_flags,
                 RemoveFlags remove_flags) {
 
-        struct stat st;
+        mode_t old_mode;
         int r;
 
         /* Like unlinkat(), but tries harder: if we get EACCESS we'll try to set the r/w/x bits on the
@@ -41,22 +66,46 @@ static int unlinkat_harder(
         if (errno != EACCES || !FLAGS_SET(remove_flags, REMOVE_CHMOD))
                 return -errno;
 
-        if (fstat(dfd, &st) < 0)
-                return -errno;
-        if (!S_ISDIR(st.st_mode))
-                return -ENOTDIR;
-        if (FLAGS_SET(st.st_mode, 0700)) /* Already set? */
-                return -EACCES; /* original error */
-        if (st.st_uid != geteuid())  /* this only works if the UID matches ours */
-                return -EACCES;
-
-        if (fchmod(dfd, (st.st_mode | 0700) & 07777) < 0)
-                return -errno;
+        r = patch_dirfd_mode(dfd, &old_mode);
+        if (r < 0)
+                return r;
 
         if (unlinkat(dfd, filename, unlink_flags) < 0) {
                 r = -errno;
                 /* Try to restore the original access mode if this didn't work */
-                (void) fchmod(dfd, st.st_mode & 07777);
+                (void) fchmod(dfd, old_mode);
+                return r;
+        }
+
+        /* If this worked, we won't reset the old mode, since we'll need it for other entries too, and we
+         * should destroy the whole thing */
+        return 0;
+}
+
+static int fstatat_harder(
+                int dfd,
+                const char *filename,
+                struct stat *ret,
+                int fstatat_flags,
+                RemoveFlags remove_flags) {
+
+        mode_t old_mode;
+        int r;
+
+        /* Like unlink_harder() but does the same for fstatat() */
+
+        if (fstatat(dfd, filename, ret, fstatat_flags) >= 0)
+                return 0;
+        if (errno != EACCES || !FLAGS_SET(remove_flags, REMOVE_CHMOD))
+                return -errno;
+
+        r = patch_dirfd_mode(dfd, &old_mode);
+        if (r < 0)
+                return r;
+
+        if (fstatat(dfd, filename, ret, fstatat_flags) < 0) {
+                r = -errno;
+                (void) fchmod(dfd, old_mode);
                 return r;
         }
 
@@ -112,9 +161,10 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
 
                 if (de->d_type == DT_UNKNOWN ||
                     (de->d_type == DT_DIR && (root_dev || (flags & REMOVE_SUBVOLUME)))) {
-                        if (fstatat(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
-                                if (ret == 0 && errno != ENOENT)
-                                        ret = -errno;
+                        r = fstatat_harder(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW, flags);
+                        if (r < 0) {
+                                if (ret == 0 && r != -ENOENT)
+                                        ret = r;
                                 continue;
                         }
 
index 6483b30d7e0cfeb45d4d90fe1f3116ae0104bf17..87be9b34102b0dcc47080698519663b5f495a05a 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <sys/stat.h>
 
+#include "alloc-util.h"
 #include "errno-util.h"
 
 typedef enum RemoveFlags {
@@ -24,9 +25,8 @@ static inline char *rm_rf_physical_and_free(char *p) {
         if (!p)
                 return NULL;
 
-        (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
-        free(p);
-        return NULL;
+        (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_MISSING_OK|REMOVE_CHMOD);
+        return mfree(p);
 }
 DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rm_rf_physical_and_free);
 
@@ -37,8 +37,7 @@ static inline char *rm_rf_subvolume_and_free(char *p) {
         if (!p)
                 return NULL;
 
-        (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME);
-        free(p);
-        return NULL;
+        (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME|REMOVE_MISSING_OK|REMOVE_CHMOD);
+        return mfree(p);
 }
 DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rm_rf_subvolume_and_free);
index cfc8464c66dd1a1cf3ed01bd756a6c0a8260908d..ee9e34ed47cb676fba1fc92449fecd9ec3aadca8 100644 (file)
@@ -272,6 +272,8 @@ int mac_selinux_fix_container_fd(int fd, const char *path, const char *inside_pa
 
         /* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
         mac_selinux_maybe_reload();
+        if (!label_hnd)
+                return 0;
 
         if (selabel_lookup_raw(label_hnd, &fcon, inside_path, st.st_mode) < 0) {
                 /* If there's no label to set, then exit without warning */
@@ -484,6 +486,8 @@ static int selinux_create_file_prepare_abspath(const char *abspath, mode_t mode)
 
         /* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
         mac_selinux_maybe_reload();
+        if (!label_hnd)
+                return 0;
 
         r = selabel_lookup_raw(label_hnd, &filecon, abspath, mode);
         if (r < 0) {
@@ -506,7 +510,6 @@ int mac_selinux_create_file_prepare_at(int dirfd, const char *path, mode_t mode)
         _cleanup_free_ char *abspath = NULL;
         int r;
 
-
         assert(path);
 
         if (!label_hnd)
@@ -628,6 +631,8 @@ int mac_selinux_bind(int fd, const struct sockaddr *addr, socklen_t addrlen) {
 
         /* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
         mac_selinux_maybe_reload();
+        if (!label_hnd)
+                goto skipped;
 
         if (path_is_absolute(path))
                 r = selabel_lookup_raw(label_hnd, &fcon, path, S_IFSOCK);
index 8267988ad9c7f469d7761507099dd53e4e801313..552ec053ffe977e1816f8c1dbb8e01693094a948 100644 (file)
@@ -31,6 +31,7 @@
 #include "string-table.h"
 #include "string-util.h"
 #include "strv.h"
+#include "sysctl-util.h"
 #include "user-util.h"
 #include "utf8.h"
 
@@ -277,10 +278,48 @@ const char* socket_address_get_path(const SocketAddress *a) {
 }
 
 bool socket_ipv6_is_supported(void) {
-        if (access("/proc/net/if_inet6", F_OK) != 0)
+        static int cached = -1;
+
+        if (cached < 0) {
+
+                if (access("/proc/net/if_inet6", F_OK) < 0) {
+
+                        if (errno != ENOENT) {
+                                log_debug_errno(errno, "Unexpected error when checking whether /proc/net/if_inet6 exists: %m");
+                                return false;
+                        }
+
+                        cached = false;
+                } else
+                        cached = true;
+        }
+
+        return cached;
+}
+
+bool socket_ipv6_is_enabled(void) {
+        _cleanup_free_ char *v = NULL;
+        int r;
+
+        /* Much like socket_ipv6_is_supported(), but also checks that the sysctl that disables IPv6 on all
+         * interfaces isn't turned on */
+
+        if (!socket_ipv6_is_supported())
                 return false;
 
-        return true;
+        r = sysctl_read_ip_property(AF_INET6, "all", "disable_ipv6", &v);
+        if (r < 0) {
+                log_debug_errno(r, "Unexpected error reading 'net.ipv6.conf.all.disable_ipv6' sysctl: %m");
+                return true;
+        }
+
+        r = parse_boolean(v);
+        if (r < 0) {
+                log_debug_errno(r, "Failed to pare 'net.ipv6.conf.all.disable_ipv6' sysctl: %m");
+                return true;
+        }
+
+        return !r;
 }
 
 bool socket_address_matches_fd(const SocketAddress *a, int fd) {
@@ -736,6 +775,11 @@ bool ifname_valid_full(const char *p, IfnameValidFlags flags) {
         if (dot_or_dot_dot(p))
                 return false;
 
+        /* Let's refuse "all" and "default" as interface name, to avoid collisions with the special sysctl
+         * directories /proc/sys/net/{ipv4,ipv6}/conf/{all,default} */
+        if (STR_IN_SET(p, "all", "default"))
+                return false;
+
         for (const char *t = p; *t; t++) {
                 if ((unsigned char) *t >= 127U)
                         return false;
@@ -743,7 +787,10 @@ bool ifname_valid_full(const char *p, IfnameValidFlags flags) {
                 if ((unsigned char) *t <= 32U)
                         return false;
 
-                if (IN_SET(*t, ':', '/'))
+                if (IN_SET(*t,
+                           ':',  /* colons are used by the legacy "alias" interface logic */
+                           '/',  /* slashes cannot work, since we need to use network interfaces in sysfs paths, and in paths slashes are separators */
+                           '%')) /* %d is used in the kernel's weird foo%d format string naming feature which we really really don't want to ever run into by accident */
                         return false;
 
                 numeric = numeric && (*t >= '0' && *t <= '9');
index 2c98283cd34b52b2fdab575f3a5d7dff25e6b9fb..507a599d7cfa072833b1364d2e55f4ff45ca5abf 100644 (file)
@@ -101,6 +101,7 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_
 const char* socket_address_get_path(const SocketAddress *a);
 
 bool socket_ipv6_is_supported(void);
+bool socket_ipv6_is_enabled(void);
 
 int sockaddr_port(const struct sockaddr *_sa, unsigned *port);
 const union in_addr_union *sockaddr_in_addr(const struct sockaddr *sa);
index 7f7122c1f12ed7300b0960836e55f7283098b4e9..058eec54ff932d6e3dc32903b4adcf85a1fc015f 100644 (file)
@@ -71,7 +71,7 @@ char *strnappend(const char *s, const char *suffix, size_t b) {
         assert(suffix);
 
         a = strlen(s);
-        if (b > ((size_t) -1) - a)
+        if (b > SIZE_MAX - a)
                 return NULL;
 
         r = new(char, a+b+1);
@@ -307,7 +307,7 @@ static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_le
 
         assert(s);
         assert(percent <= 100);
-        assert(new_length != (size_t) -1);
+        assert(new_length != SIZE_MAX);
 
         if (old_length <= new_length)
                 return strndup(s, old_length);
@@ -378,7 +378,7 @@ char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigne
         assert(s);
         assert(percent <= 100);
 
-        if (new_length == (size_t) -1)
+        if (new_length == SIZE_MAX)
                 return strndup(s, old_length);
 
         if (new_length == 0)
index 492dfe40023a6056cc686debb3ed36d53c014a0f..765da04a7bd972cc040779c27c07c25c16e71181 100644 (file)
@@ -240,27 +240,28 @@ int strv_extend_strv_concat(char ***a, char * const *b, const char *suffix) {
         return 0;
 }
 
-char **strv_split_newlines(const char *s) {
-        char **l;
+int strv_split_newlines_full(char ***ret, const char *s, ExtractFlags flags) {
+        _cleanup_strv_free_ char **l = NULL;
         size_t n;
+        int r;
 
         assert(s);
 
-        /* Special version of strv_split() that splits on newlines and
-         * suppresses an empty string at the end */
+        /* Special version of strv_split_full() that splits on newlines and
+         * suppresses an empty string at the end. */
 
-        l = strv_split(s, NEWLINE);
-        if (!l)
-                return NULL;
+        r = strv_split_full(&l, s, NEWLINE, flags);
+        if (r < 0)
+                return r;
 
         n = strv_length(l);
-        if (n <= 0)
-                return l;
-
-        if (isempty(l[n - 1]))
+        if (n > 0 && isempty(l[n - 1])) {
                 l[n - 1] = mfree(l[n - 1]);
+                n--;
+        }
 
-        return l;
+        *ret = TAKE_PTR(l);
+        return n;
 }
 
 int strv_split_full(char ***t, const char *s, const char *separators, ExtractFlags flags) {
index 6b3e8e7f8600f57c8e4e99188c8a5b02a03e8136..911528fab495a9d761211ccfd8f7116f168a526b 100644 (file)
@@ -73,15 +73,21 @@ static inline bool strv_isempty(char * const *l) {
         return !l || !*l;
 }
 
-char **strv_split_newlines(const char *s);
-
 int strv_split_full(char ***t, const char *s, const char *separators, ExtractFlags flags);
 static inline char **strv_split(const char *s, const char *separators) {
         char **ret;
-        int r;
 
-        r = strv_split_full(&ret, s, separators, 0);
-        if (r < 0)
+        if (strv_split_full(&ret, s, separators, 0) < 0)
+                return NULL;
+
+        return ret;
+}
+
+int strv_split_newlines_full(char ***ret, const char *s, ExtractFlags flags);
+static inline char **strv_split_newlines(const char *s) {
+        char **ret;
+
+        if (strv_split_newlines_full(&ret, s, 0) < 0)
                 return NULL;
 
         return ret;
index 8287d5c5fcf08ca69217f70a920708d6f7cab71c..8a602cff34bac3f608de0c93655af7c25354b6d5 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush
-bfin_spinlock
 bind
 bpf
 brk
-cache_sync
 cachectl
 cacheflush
 capget
@@ -216,6 +214,7 @@ mmap
 mmap2
 modify_ldt
 mount
+mount_setattr
 move_mount
 move_pages
 mprotect
index fc94c63cdada0bdca309649778b06bb45d9fe247..2a859c5ef4478de7748af7b8c3bea00dcbe0113b 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        300
-bfin_spinlock
 bind   104
 bpf    515
 brk    17
-cache_sync
 cachectl
 cacheflush
 capget 368
@@ -216,6 +214,7 @@ mmap        71
 mmap2
 modify_ldt
 mount  302
+mount_setattr  552
 move_mount     539
 move_pages     472
 mprotect       74
index e710807ecff665ccfb875c1fbd221fc44afcd378..1305f06493f781e0aa04bddd78c79020430e7c40 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush
-bfin_spinlock
 bind   200
 bpf    280
 brk    214
-cache_sync
 cachectl
 cacheflush     244
 capget 90
@@ -216,6 +214,7 @@ mmap
 mmap2  222
 modify_ldt
 mount  40
+mount_setattr  442
 move_mount     429
 move_pages     239
 mprotect       226
index 8d1b98e10c8afd9046ec8b66178c50e2bf4e5a7e..2e7b238b844bfe52dd3a9512c5372ae4ef26f535 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64     270
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        134
-bfin_spinlock
 bind   282
 bpf    386
 brk    45
-cache_sync
 cachectl
 cacheflush
 capget 184
@@ -216,6 +214,7 @@ mmap
 mmap2  192
 modify_ldt
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     344
 mprotect       125
index fdcb4b58c651558c6d5fb934164b36fa85f7109a..7fd4be1ed2ec0880344031dec664c1dcf136d041 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush
-bfin_spinlock
 bind   200
 bpf    280
 brk    214
-cache_sync
 cachectl
 cacheflush
 capget 90
@@ -216,6 +214,7 @@ mmap        222
 mmap2
 modify_ldt
 mount  40
+mount_setattr  442
 move_mount     429
 move_pages     239
 mprotect       226
index b5d9eeafd03d2b703e298e8dc8db13ff49d1486c..281eef070b4cebb27341ffe4e45296eeb67c980f 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        134
-bfin_spinlock
 bind   361
 bpf    357
 brk    45
-cache_sync
 cachectl
 cacheflush
 capget 184
@@ -216,6 +214,7 @@ mmap        90
 mmap2  192
 modify_ldt     123
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     317
 mprotect       125
index 8c92bfde340f5be536234904a7ad2d97186efd83..44742a2a70bed6bbe18fe8546cd7b471072a9f12 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        1138
-bfin_spinlock
 bind   1191
 bpf    1341
 brk    1060
-cache_sync
 cachectl
 cacheflush
 capget 1185
@@ -216,6 +214,7 @@ mmap        1151
 mmap2  1172
 modify_ldt
 mount  1043
+mount_setattr  1466
 move_mount     1453
 move_pages     1276
 mprotect       1155
index 54974783b55cc131439df0ab61557edd34a47880..06c34dd8f4d1be75305eff9385920e2061bfb8ec 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier 336
 atomic_cmpxchg_32      335
 bdflush        134
-bfin_spinlock
 bind   358
 bpf    354
 brk    45
-cache_sync
 cachectl
 cacheflush     123
 capget 184
@@ -216,6 +214,7 @@ mmap        90
 mmap2  192
 modify_ldt
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     310
 mprotect       125
index 9a7d4b9744218e03fae996149c2162725d7d1d12..8b5f321522374ac0f2da3552ae54653f1cc64b41 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush
-bfin_spinlock
 bind   5048
 bpf    5315
 brk    5012
-cache_sync
 cachectl       5198
 cacheflush     5197
 capget 5123
@@ -216,6 +214,7 @@ mmap        5009
 mmap2
 modify_ldt
 mount  5160
+mount_setattr  5442
 move_mount     5429
 move_pages     5267
 mprotect       5010
index fc294eb1c8cf567e2deee90dc2000fcdf18ed496..51ed6fb63969c446a36e8d54283aa63980e07b96 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush
-bfin_spinlock
 bind   6048
 bpf    6319
 brk    6012
-cache_sync
 cachectl       6198
 cacheflush     6197
 capget 6123
@@ -216,6 +214,7 @@ mmap        6009
 mmap2
 modify_ldt
 mount  6160
+mount_setattr  6442
 move_mount     6429
 move_pages     6271
 mprotect       6010
index 7193f5655a09fd4a2461a7de96154ef066401832..0e977111e7fe813bdf5a0494985b88b8db067e48 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        4134
-bfin_spinlock
 bind   4169
 bpf    4355
 brk    4045
-cache_sync
 cachectl       4148
 cacheflush     4147
 capget 4204
@@ -216,6 +214,7 @@ mmap        4090
 mmap2  4210
 modify_ldt     4123
 mount  4021
+mount_setattr  4442
 move_mount     4429
 move_pages     4308
 mprotect       4125
index b9deacdf2b7e1d77d531768a9ce91e22ddd2bfef..3df924989628c1924cbb7f04d332ad14f324be8d 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        134
-bfin_spinlock
 bind   327
 bpf    361
 brk    45
-cache_sync
 cachectl
 cacheflush
 capget 183
@@ -216,6 +214,7 @@ mmap        90
 mmap2  192
 modify_ldt     123
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     301
 mprotect       125
index 27de1fb63c42fc097a6180868a6f1807babdbf8b..492b2c07866f79432ea8831fd41847ee215402a4 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        134
-bfin_spinlock
 bind   327
 bpf    361
 brk    45
-cache_sync
 cachectl
 cacheflush
 capget 183
@@ -216,6 +214,7 @@ mmap        90
 mmap2
 modify_ldt     123
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     301
 mprotect       125
index 957800cebee12c07051e20452cbf4f729cf443d7..a70ced38a837e469169884c4ada6b33d9265d208 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        134
-bfin_spinlock
 bind   361
 bpf    351
 brk    45
-cache_sync
 cachectl
 cacheflush
 capget 184
@@ -216,6 +214,7 @@ mmap        90
 mmap2  192
 modify_ldt
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     310
 mprotect       125
index 4d99b99402542fe5d4ed0c9a0beecb53f5b5aa53..2374cd393a4376feb29fff0ba7fd83c6da653bb2 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        134
-bfin_spinlock
 bind   361
 bpf    351
 brk    45
-cache_sync
 cachectl
 cacheflush
 capget 184
@@ -216,6 +214,7 @@ mmap        90
 mmap2
 modify_ldt
 mount  21
+mount_setattr  442
 move_mount     429
 move_pages     310
 mprotect       125
index 6092daea41693d967c8ece7572a6ce44787dc3db..46ed8b5c76f09925c4a2b58141c08609af0557a1 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush        225
-bfin_spinlock
 bind   353
 bpf    349
 brk    17
-cache_sync
 cachectl
 cacheflush
 capget 21
@@ -216,6 +214,7 @@ mmap        71
 mmap2  56
 modify_ldt
 mount  167
+mount_setattr  442
 move_mount     429
 move_pages     307
 mprotect       74
index 690741a625dcf9d735570743936036ffc57d6814..8a947ee8e1d88f8c1032b556b71471a4441b2b53 100644 (file)
@@ -16,11 +16,9 @@ arm_fadvise64_64
 atomic_barrier
 atomic_cmpxchg_32
 bdflush
-bfin_spinlock
 bind   49
 bpf    321
 brk    12
-cache_sync
 cachectl
 cacheflush
 capget 125
@@ -216,6 +214,7 @@ mmap        9
 mmap2
 modify_ldt     154
 mount  165
+mount_setattr  442
 move_mount     429
 move_pages     279
 mprotect       10
similarity index 94%
rename from src/shared/sysctl-util.c
rename to src/basic/sysctl-util.c
index a835a8bd0a74d6b78b722ca7e00fcdf61ce4d771..c96b5cd77f0eddd7be061edd28dafa71646c1dbf 100644 (file)
@@ -96,14 +96,14 @@ int sysctl_write_ip_property(int af, const char *ifname, const char *property, c
         return write_string_file(p, value, WRITE_STRING_FILE_VERIFY_ON_FAILURE | WRITE_STRING_FILE_DISABLE_BUFFER);
 }
 
-int sysctl_read(const char *property, char **content) {
+int sysctl_read(const char *property, char **ret) {
         char *p;
 
         assert(property);
-        assert(content);
+        assert(ret);
 
         p = strjoina("/proc/sys/", property);
-        return read_full_file(p, content, NULL);
+        return read_full_virtual_file(p, ret, NULL);
 }
 
 int sysctl_read_ip_property(int af, const char *ifname, const char *property, char **ret) {
@@ -118,7 +118,7 @@ int sysctl_read_ip_property(int af, const char *ifname, const char *property, ch
                      ifname ? "/conf/" : "", strempty(ifname),
                      property[0] == '/' ? "" : "/", property);
 
-        r = read_one_line_file(p, &value);
+        r = read_full_virtual_file(p, &value, NULL);
         if (r < 0)
                 return r;
 
index fc63e134c38daee5e224c3db8b39ce7f1de59836..1a3f9ccb33cd782ac773ca404b4c234580c13a7a 100644 (file)
@@ -41,6 +41,7 @@
 #include "strv.h"
 #include "terminal-util.h"
 #include "time-util.h"
+#include "user-util.h"
 #include "util.h"
 
 static volatile unsigned cached_columns = 0;
@@ -440,11 +441,11 @@ int acquire_terminal(
 
                                 assert(ts != USEC_INFINITY);
 
-                                n = now(CLOCK_MONOTONIC);
-                                if (ts + timeout < n)
+                                n = usec_sub_unsigned(now(CLOCK_MONOTONIC), ts);
+                                if (n >= timeout)
                                         return -ETIMEDOUT;
 
-                                r = fd_wait_for_event(notify, POLLIN, ts + timeout - n);
+                                r = fd_wait_for_event(notify, POLLIN, usec_sub_unsigned(timeout, n));
                                 if (r < 0)
                                         return r;
                                 if (r == 0)
@@ -1341,7 +1342,7 @@ int vt_restore(int fd) {
                         q = -errno;
         }
 
-        r = fchmod_and_chown(fd, TTY_MODE, 0, (gid_t) -1);
+        r = fchmod_and_chown(fd, TTY_MODE, 0, GID_INVALID);
         if (r < 0) {
                 log_debug_errno(r, "Failed to chmod()/chown() VT, ignoring: %m");
                 if (q >= 0)
index 933a398e7313ff59da6f526357cc9e93c5274725..0ea4e409fac5991e8b5f37ced3e04fde43a66808 100644 (file)
@@ -836,7 +836,7 @@ bool valid_user_group_name(const char *u, ValidUserFlags flags) {
 
                 if (l > (size_t) sz)
                         return false;
-                if (l > FILENAME_MAX)
+                if (l > NAME_MAX) /* must fit in a filename */
                         return false;
                 if (l > UT_NAMESIZE - 1)
                         return false;
@@ -882,7 +882,7 @@ char *mangle_gecos(const char *d) {
                         continue;
                 }
 
-                len = utf8_encoded_valid_unichar(i, (size_t) -1);
+                len = utf8_encoded_valid_unichar(i, SIZE_MAX);
                 if (len < 0) {
                         *i = ' ';
                         continue;
index d61692d07f191790045b1edf30209a6fc5e370ae..46c3a463b95ccd48fcd03a2a3e72e1c6f41130f9 100644 (file)
@@ -156,14 +156,14 @@ char *utf8_is_valid_n(const char *str, size_t len_bytes) {
 
         assert(str);
 
-        for (const char *p = str; len_bytes != (size_t) -1 ? (size_t) (p - str) < len_bytes : *p != '\0'; ) {
+        for (const char *p = str; len_bytes != SIZE_MAX ? (size_t) (p - str) < len_bytes : *p != '\0'; ) {
                 int len;
 
-                if (_unlikely_(*p == '\0') && len_bytes != (size_t) -1)
+                if (_unlikely_(*p == '\0') && len_bytes != SIZE_MAX)
                         return NULL; /* embedded NUL */
 
                 len = utf8_encoded_valid_unichar(p,
-                                                 len_bytes != (size_t) -1 ? len_bytes - (p - str) : (size_t) -1);
+                                                 len_bytes != SIZE_MAX ? len_bytes - (p - str) : SIZE_MAX);
                 if (_unlikely_(len < 0))
                         return NULL; /* invalid character */
 
@@ -185,7 +185,7 @@ char *utf8_escape_invalid(const char *str) {
         while (*str) {
                 int len;
 
-                len = utf8_encoded_valid_unichar(str, (size_t) -1);
+                len = utf8_encoded_valid_unichar(str, SIZE_MAX);
                 if (len > 0) {
                         s = mempcpy(s, str, len);
                         str += len;
@@ -233,7 +233,7 @@ char *utf8_escape_non_printable_full(const char *str, size_t console_width) {
                 if (!*str) /* done! */
                         goto finish;
 
-                len = utf8_encoded_valid_unichar(str, (size_t) -1);
+                len = utf8_encoded_valid_unichar(str, SIZE_MAX);
                 if (len > 0) {
                         if (utf8_is_printable(str, len)) {
                                 int w;
@@ -508,7 +508,7 @@ int utf8_encoded_valid_unichar(const char *str, size_t length /* bytes */) {
         assert(str);
         assert(length > 0);
 
-        /* We read until NUL, at most length bytes. (size_t) -1 may be used to disable the length check. */
+        /* We read until NUL, at most length bytes. SIZE_MAX may be used to disable the length check. */
 
         len = utf8_encoded_expected_len(str[0]);
         if (len == 0)
@@ -545,14 +545,14 @@ int utf8_encoded_valid_unichar(const char *str, size_t length /* bytes */) {
 size_t utf8_n_codepoints(const char *str) {
         size_t n = 0;
 
-        /* Returns the number of UTF-8 codepoints in this string, or (size_t) -1 if the string is not valid UTF-8. */
+        /* Returns the number of UTF-8 codepoints in this string, or SIZE_MAX if the string is not valid UTF-8. */
 
         while (*str != 0) {
                 int k;
 
-                k = utf8_encoded_valid_unichar(str, (size_t) -1);
+                k = utf8_encoded_valid_unichar(str, SIZE_MAX);
                 if (k < 0)
-                        return (size_t) -1;
+                        return SIZE_MAX;
 
                 str += k;
                 n++;
@@ -572,7 +572,7 @@ size_t utf8_console_width(const char *str) {
 
                 w = utf8_char_console_width(str);
                 if (w < 0)
-                        return (size_t) -1;
+                        return SIZE_MAX;
 
                 n += w;
                 str = utf8_next_char(str);
index a6ea942c6240f49ea482d564eb9581c22dd7a129..219ca89184b6046010606e5cbf8df51f1790a8c1 100644 (file)
@@ -16,7 +16,7 @@ bool unichar_is_valid(char32_t c);
 
 char *utf8_is_valid_n(const char *str, size_t len_bytes) _pure_;
 static inline char *utf8_is_valid(const char *s) {
-        return utf8_is_valid_n(s, (size_t) -1);
+        return utf8_is_valid_n(s, SIZE_MAX);
 }
 char *ascii_is_valid(const char *s) _pure_;
 char *ascii_is_valid_n(const char *str, size_t len);
@@ -27,7 +27,7 @@ bool utf8_is_printable_newline(const char* str, size_t length, bool allow_newlin
 char *utf8_escape_invalid(const char *s);
 char *utf8_escape_non_printable_full(const char *str, size_t console_width);
 static inline char *utf8_escape_non_printable(const char *str) {
-        return utf8_escape_non_printable_full(str, (size_t) -1);
+        return utf8_escape_non_printable_full(str, SIZE_MAX);
 }
 
 size_t utf8_encode_unichar(char *out_utf8, char32_t g);
index b9a0dc54c5329bad9fd1638d62983efc7decc768..c175ce1fbcc79c91aef0dab7aa9c1af917880996 100644 (file)
@@ -147,7 +147,7 @@ static int parse_crtime(le64_t le, usec_t *usec) {
         assert(usec);
 
         u = le64toh(le);
-        if (IN_SET(u, 0, (uint64_t) -1))
+        if (IN_SET(u, 0, UINT64_MAX))
                 return -EIO;
 
         *usec = (usec_t) u;
index 9964dda1fcc61d98698a7a693386b5e0125266c6..04cc7664e512bc2657f0e1a1cb1cf98724ba8f7d 100644 (file)
@@ -541,7 +541,7 @@ static int copy_file_with_version_check(const char *from, const char *to, bool f
                         return log_error_errno(errno, "Failed to open \"%s\" for writing: %m", t);
         }
 
-        r = copy_bytes(fd_from, fd_to, (uint64_t) -1, COPY_REFLINK);
+        r = copy_bytes(fd_from, fd_to, UINT64_MAX, COPY_REFLINK);
         if (r < 0) {
                 (void) unlink(t);
                 return log_error_errno(r, "Failed to copy data from \"%s\" to \"%s\": %m", from, t);
index e0df0dcc4891ef00157670b63a42b34210e49aed..35248db009bf48cfd46c04fac961d7890c27bcc1 100644 (file)
@@ -470,7 +470,7 @@ static VOID print_status(Config *config, CHAR16 *loaded_image_path) {
                 if (entry->call)
                         Print(L"internal call           yes\n");
 
-                if (entry->tries_left != (UINTN) -1)
+                if (entry->tries_left != UINTN_MAX)
                         Print(L"counting boots          yes\n"
                                "tries done              %u\n"
                                "tries left              %u\n"
@@ -1077,7 +1077,7 @@ static VOID config_entry_parse_tries(
                 CHAR16 *file,
                 CHAR16 *suffix) {
 
-        UINTN left = (UINTN) -1, done = (UINTN) -1, factor = 1, i, next_left, next_done;
+        UINTN left = UINTN_MAX, done = UINTN_MAX, factor = 1, i, next_left, next_done;
         _cleanup_freepool_ CHAR16 *prefix = NULL;
 
         /*
@@ -1114,46 +1114,46 @@ static VOID config_entry_parse_tries(
                 switch (file[i]) {
 
                 case '+':
-                        if (left == (UINTN) -1) /* didn't read at least one digit for 'left'? */
+                        if (left == UINTN_MAX) /* didn't read at least one digit for 'left'? */
                                 return;
 
-                        if (done == (UINTN) -1) /* no 'done' counter? If so, it's equivalent to 0 */
+                        if (done == UINTN_MAX) /* no 'done' counter? If so, it's equivalent to 0 */
                                 done = 0;
 
                         goto good;
 
                 case '-':
-                        if (left == (UINTN) -1) /* didn't parse any digit yet? */
+                        if (left == UINTN_MAX) /* didn't parse any digit yet? */
                                 return;
 
-                        if (done != (UINTN) -1) /* already encountered a dash earlier? */
+                        if (done != UINTN_MAX) /* already encountered a dash earlier? */
                                 return;
 
                         /* So we encountered a dash. This means this counter is of the form +LEFT-DONE. Let's assign
                          * what we already parsed to 'done', and start fresh for the 'left' part. */
 
                         done = left;
-                        left = (UINTN) -1;
+                        left = UINTN_MAX;
                         factor = 1;
                         break;
 
                 case '0'...'9': {
                         UINTN new_factor;
 
-                        if (left == (UINTN) -1)
+                        if (left == UINTN_MAX)
                                 left = file[i] - '0';
                         else {
                                 UINTN new_left, digit;
 
                                 digit = file[i] - '0';
-                                if (digit > (UINTN) -1 / factor) /* overflow check */
+                                if (digit > UINTN_MAX / factor) /* overflow check */
                                         return;
 
                                 new_left = left + digit * factor;
                                 if (new_left < left) /* overflow check */
                                         return;
 
-                                if (new_left == (UINTN) -1) /* don't allow us to be confused */
+                                if (new_left == UINTN_MAX) /* don't allow us to be confused */
                                         return;
                         }
 
@@ -1197,7 +1197,7 @@ static VOID config_entry_bump_counters(
         UINTN file_info_size, a, b;
         EFI_STATUS r;
 
-        if (entry->tries_left == (UINTN) -1)
+        if (entry->tries_left == UINTN_MAX)
                 return;
 
         if (!entry->path || !entry->current_name || !entry->next_name)
@@ -1275,8 +1275,8 @@ static VOID config_entry_add_from_file(
         entry = AllocatePool(sizeof(ConfigEntry));
 
         *entry = (ConfigEntry) {
-                .tries_done = (UINTN) -1,
-                .tries_left = (UINTN) -1,
+                .tries_done = UINTN_MAX,
+                .tries_left = UINTN_MAX,
         };
 
         while ((line = line_get_key_value(content, (CHAR8 *)" \t", &pos, &key, &value))) {
@@ -1482,8 +1482,8 @@ static INTN config_entry_compare(ConfigEntry *a, ConfigEntry *b) {
         if (r != 0)
                 return r;
 
-        if (a->tries_left == (UINTN) -1 ||
-            b->tries_left == (UINTN) -1)
+        if (a->tries_left == UINTN_MAX ||
+            b->tries_left == UINTN_MAX)
                 return 0;
 
         /* If both items have boot counting, and otherwise are identical, put the entry with more tries left last */
@@ -1701,8 +1701,8 @@ static BOOLEAN config_entry_add_call(
                 .title = StrDuplicate(title),
                 .call = call,
                 .no_autoselect = TRUE,
-                .tries_done = (UINTN) -1,
-                .tries_left = (UINTN) -1,
+                .tries_done = UINTN_MAX,
+                .tries_left = UINTN_MAX,
         };
 
         config_add_entry(config, entry);
@@ -1730,8 +1730,8 @@ static ConfigEntry *config_entry_add_loader(
                 .loader = StrDuplicate(loader),
                 .id = StrDuplicate(id),
                 .key = key,
-                .tries_done = (UINTN) -1,
-                .tries_left = (UINTN) -1,
+                .tries_done = UINTN_MAX,
+                .tries_left = UINTN_MAX,
         };
 
         StrLwr(entry->id);
@@ -1971,9 +1971,9 @@ static VOID config_load_xbootldr(
                 EFI_HANDLE *device) {
 
         EFI_DEVICE_PATH *partition_path, *disk_path, *copy;
-        UINT32 found_partition_number = (UINT32) -1;
-        UINT64 found_partition_start = (UINT64) -1;
-        UINT64 found_partition_size = (UINT64) -1;
+        UINT32 found_partition_number = UINT32_MAX;
+        UINT64 found_partition_start = UINT64_MAX;
+        UINT64 found_partition_size = UINT64_MAX;
         UINT8 found_partition_signature[16] = {};
         EFI_HANDLE new_device;
         EFI_FILE *root_dir;
@@ -2053,7 +2053,7 @@ static VOID config_load_xbootldr(
                                 continue;
 
                         /* Calculate CRC check */
-                        c = ~crc32_exclude_offset((UINT32) -1,
+                        c = ~crc32_exclude_offset(UINT32_MAX,
                                                   (const UINT8*) &gpt_header_buffer,
                                                   h->Header.HeaderSize,
                                                   OFFSETOF(EFI_PARTITION_TABLE_HEADER, Header.CRC32),
@@ -2087,7 +2087,7 @@ static VOID config_load_xbootldr(
                                 continue;
 
                         /* Calculate CRC of entries array, too */
-                        c = ~crc32((UINT32) -1, entries, sz);
+                        c = ~crc32(UINT32_MAX, entries, sz);
                         if (c != h->PartitionEntryArrayCRC32)
                                 continue;
 
index e3de27fee5cc4e598dbdfc814280126371a49641..83619d2147f3b49af9c207105c8a7f8ace7fe30a 100644 (file)
@@ -9,62 +9,7 @@
 #define SYSTEM_FONT_WIDTH 8
 #define SYSTEM_FONT_HEIGHT 19
 
-#define EFI_SIMPLE_TEXT_INPUT_EX_GUID \
-        &(EFI_GUID) { 0xdd9e7534, 0x7762, 0x4698, { 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa } }
-
-struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
-
-typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET_EX)(
-        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
-        BOOLEAN ExtendedVerification
-);
-
-typedef UINT8 EFI_KEY_TOGGLE_STATE;
-
-typedef struct {
-        UINT32 KeyShiftState;
-        EFI_KEY_TOGGLE_STATE KeyToggleState;
-} EFI_KEY_STATE;
-
-typedef struct {
-        EFI_INPUT_KEY Key;
-        EFI_KEY_STATE KeyState;
-} EFI_KEY_DATA;
-
-typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY_EX)(
-        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
-        EFI_KEY_DATA *KeyData
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_SET_STATE)(
-        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
-        EFI_KEY_TOGGLE_STATE *KeyToggleState
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_KEY_NOTIFY_FUNCTION)(
-        EFI_KEY_DATA *KeyData
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)(
-        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
-        EFI_KEY_DATA KeyData,
-        EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
-        VOID **NotifyHandle
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)(
-        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
-        VOID *NotificationHandle
-);
-
-typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
-        EFI_INPUT_RESET_EX Reset;
-        EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx;
-        EFI_EVENT WaitForKeyEx;
-        EFI_SET_STATE SetState;
-        EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify;
-        EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify;
-} EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+#define EFI_SIMPLE_TEXT_INPUT_EX_GUID &(EFI_GUID) EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID
 
 EFI_STATUS console_key_read(UINT64 *key, BOOLEAN wait) {
         static EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInputEx;
index 41df3a406e0e0a17ccaed36fa6a45c69f8493cff..2c69af552a6f469620f6c8fc8bd010a658b87d1b 100644 (file)
@@ -1,11 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
-#define EFI_SHIFT_STATE_VALID           0x80000000
-#define EFI_RIGHT_CONTROL_PRESSED       0x00000004
-#define EFI_LEFT_CONTROL_PRESSED        0x00000008
-#define EFI_RIGHT_ALT_PRESSED           0x00000010
-#define EFI_LEFT_ALT_PRESSED            0x00000020
+#include "missing_efi.h"
 
 #define EFI_CONTROL_PRESSED             (EFI_RIGHT_CONTROL_PRESSED|EFI_LEFT_CONTROL_PRESSED)
 #define EFI_ALT_PRESSED                 (EFI_RIGHT_ALT_PRESSED|EFI_LEFT_ALT_PRESSED)
index fdbbed6f839da2a17eaff3ccc8b28a55d4407d61..2a37b0a9ac69f96689610ccb833882f6315b1564 100644 (file)
@@ -45,10 +45,15 @@ if conf.get('ENABLE_EFI') == 1 and get_option('gnu-efi') != 'false'
         if efi_cc.length() == 0
                 efi_cc = cc.cmd_array()
         endif
-        efi_ld = get_option('efi-ld')
-        if efi_ld == ''
-                efi_ld = find_program('ld', required: true)
+
+        efi_ld = find_program(get_option('efi-ld'), required: true)
+        efi_ld_name = efi_ld.path().split('/')[-1]
+        if efi_ld_name == 'lld' or efi_ld_name == 'ld.lld'
+                # LLVM/LLD does not support PE/COFF relocations
+                # https://lists.llvm.org/pipermail/llvm-dev/2021-March/149234.html
+                error('LLVM/lld does not support PE/COFF relocations. Use different linker for EFI image.')
         endif
+
         efi_incdir = get_option('efi-includedir')
 
         gnu_efi_path_arch = ''
index 1b838af2a4e11c777f60d453fb855a2259341290..b983931348b2dc1dc1ea6e7cf4992cd36dfe761a 100644 (file)
@@ -53,3 +53,70 @@ typedef struct _EFI_RNG_PROTOCOL {
 } EFI_RNG_PROTOCOL;
 
 #endif
+
+#ifndef EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID
+
+#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
+    { 0xdd9e7534, 0x7762, 0x4698, {0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa} }
+
+#define EFI_SHIFT_STATE_VALID           0x80000000
+#define EFI_RIGHT_CONTROL_PRESSED       0x00000004
+#define EFI_LEFT_CONTROL_PRESSED        0x00000008
+#define EFI_RIGHT_ALT_PRESSED           0x00000010
+#define EFI_LEFT_ALT_PRESSED            0x00000020
+
+struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+
+typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET_EX)(
+        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+        BOOLEAN ExtendedVerification
+);
+
+typedef UINT8 EFI_KEY_TOGGLE_STATE;
+
+typedef struct {
+        UINT32 KeyShiftState;
+        EFI_KEY_TOGGLE_STATE KeyToggleState;
+} EFI_KEY_STATE;
+
+typedef struct {
+        EFI_INPUT_KEY Key;
+        EFI_KEY_STATE KeyState;
+} EFI_KEY_DATA;
+
+typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY_EX)(
+        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+        EFI_KEY_DATA *KeyData
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_SET_STATE)(
+        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+        EFI_KEY_TOGGLE_STATE *KeyToggleState
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_KEY_NOTIFY_FUNCTION)(
+        EFI_KEY_DATA *KeyData
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)(
+        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+        EFI_KEY_DATA KeyData,
+        EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
+        VOID **NotifyHandle
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)(
+        struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+        VOID *NotificationHandle
+);
+
+typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
+        EFI_INPUT_RESET_EX Reset;
+        EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx;
+        EFI_EVENT WaitForKeyEx;
+        EFI_SET_STATE SetState;
+        EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify;
+        EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify;
+} EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+
+#endif
index 6fe61ac45792942d054425c425a7bb61abc5a96e..f3c97186e856653b3a08f657008fdb522f4eb269 100644 (file)
@@ -67,5 +67,11 @@ static inline void FileHandleClosep(EFI_FILE_HANDLE *handle) {
 
 #define UINTN_MAX (~(UINTN)0)
 #define INTN_MAX ((INTN)(UINTN_MAX>>1))
+#ifndef UINT32_MAX
+#define UINT32_MAX ((UINT32) -1)
+#endif
+#ifndef UINT64_MAX
+#define UINT64_MAX ((UINT64) -1)
+#endif
 
 EFI_STATUS log_oom(void);
index 71a6d7e05060e29022e49326577dea076b3aeaa8..cbc24bc2517f32300916551fc5f7e6b1a9a244ab 100644 (file)
@@ -211,7 +211,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) {
         if (r < 0)
                 return log_error_errno(r, "Failed to set empty string: %m");
 
-        r = table_set_sort(table, (size_t) COLUMN_NAME, (size_t) -1);
+        r = table_set_sort(table, (size_t) COLUMN_NAME);
         if (r < 0)
                 return log_error_errno(r, "Failed to set sort column: %m");
 
@@ -224,8 +224,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) {
                                              (size_t) COLUMN_UNIT,
                                              (size_t) COLUMN_SESSION,
                                              (size_t) COLUMN_DESCRIPTION,
-                                             (size_t) COLUMN_MACHINE,
-                                             (size_t) -1);
+                                             (size_t) COLUMN_MACHINE);
         else
                 r = table_set_display(table, (size_t) COLUMN_NAME,
                                              (size_t) COLUMN_PID,
@@ -234,8 +233,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) {
                                              (size_t) COLUMN_CONNECTION,
                                              (size_t) COLUMN_UNIT,
                                              (size_t) COLUMN_SESSION,
-                                             (size_t) COLUMN_DESCRIPTION,
-                                             (size_t) -1);
+                                             (size_t) COLUMN_DESCRIPTION);
 
         if (r < 0)
                 return log_error_errno(r, "Failed to set columns to display: %m");
@@ -1330,7 +1328,7 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f
                 if (r > 0)
                         continue;
 
-                r = sd_bus_wait(bus, (uint64_t) -1);
+                r = sd_bus_wait(bus, UINT64_MAX);
                 if (r < 0)
                         return log_error_errno(r, "Failed to wait for bus: %m");
         }
index cbae9897a507c0fc532d8285e4956bf24af8c189..5424f2c90f78cee45f545eff639a9ce650092031 100644 (file)
@@ -56,7 +56,7 @@ typedef struct Group {
 } Group;
 
 static unsigned arg_depth = 3;
-static unsigned arg_iterations = (unsigned) -1;
+static unsigned arg_iterations = UINT_MAX;
 static bool arg_batch = false;
 static bool arg_raw = false;
 static usec_t arg_delay = 1*USEC_PER_SEC;
@@ -943,7 +943,7 @@ static int run(int argc, char *argv[]) {
 
         signal(SIGWINCH, columns_lines_cache_reset);
 
-        if (arg_iterations == (unsigned) -1)
+        if (arg_iterations == UINT_MAX)
                 arg_iterations = on_tty() ? 0 : 1;
 
         while (!quit) {
@@ -953,7 +953,7 @@ static int run(int argc, char *argv[]) {
 
                 t = now(CLOCK_MONOTONIC);
 
-                if (t >= last_refresh + arg_delay || immediate_refresh) {
+                if (t >= usec_add(last_refresh, arg_delay) || immediate_refresh) {
 
                         r = refresh(root, a, b, iteration++);
                         if (r < 0)
@@ -976,9 +976,9 @@ static int run(int argc, char *argv[]) {
                 fflush(stdout);
 
                 if (arg_batch)
-                        (void) usleep(last_refresh + arg_delay - t);
+                        (void) usleep(usec_add(usec_sub_unsigned(last_refresh, t), arg_delay));
                 else {
-                        r = read_one_char(stdin, &key, last_refresh + arg_delay - t, NULL);
+                        r = read_one_char(stdin, &key, usec_add(usec_sub_unsigned(last_refresh, t), arg_delay), NULL);
                         if (r == -ETIMEDOUT)
                                 continue;
                         if (r < 0)
@@ -1053,10 +1053,7 @@ static int run(int argc, char *argv[]) {
                         break;
 
                 case '+':
-                        if (arg_delay < USEC_PER_SEC)
-                                arg_delay += USEC_PER_MSEC*250;
-                        else
-                                arg_delay += USEC_PER_SEC;
+                        arg_delay = usec_add(arg_delay, arg_delay < USEC_PER_SEC ? USEC_PER_MSEC * 250 : USEC_PER_SEC);
 
                         fprintf(stdout, "\nIncreased delay to %s.", format_timespan(h, sizeof(h), arg_delay, 0));
                         fflush(stdout);
@@ -1066,10 +1063,8 @@ static int run(int argc, char *argv[]) {
                 case '-':
                         if (arg_delay <= USEC_PER_MSEC*500)
                                 arg_delay = USEC_PER_MSEC*250;
-                        else if (arg_delay < USEC_PER_MSEC*1250)
-                                arg_delay -= USEC_PER_MSEC*250;
                         else
-                                arg_delay -= USEC_PER_SEC;
+                                arg_delay = usec_sub_unsigned(arg_delay, arg_delay < USEC_PER_MSEC * 1250 ? USEC_PER_MSEC * 250 : USEC_PER_SEC);
 
                         fprintf(stdout, "\nDecreased delay to %s.", format_timespan(h, sizeof(h), arg_delay, 0));
                         fflush(stdout);
index 8690a6487165fbc721a8d6347a69942c2d667391..96073b108b2e7674e88bd4b4936cf64bb0967a3a 100644 (file)
@@ -1880,10 +1880,6 @@ int unit_pick_cgroup_path(Unit *u) {
         return 0;
 }
 
-static int cg_v1_errno_to_log_level(int r) {
-        return r == -EROFS ? LOG_DEBUG : LOG_WARNING;
-}
-
 static int unit_update_cgroup(
                 Unit *u,
                 CGroupMask target_mask,
@@ -1941,30 +1937,16 @@ static int unit_update_cgroup(
          * We perform migration also with whole slices for cases when users don't care about leave
          * granularity. Since delegated_mask is subset of target mask, we won't trim slice subtree containing
          * delegated units.
-         *
-         * If we're in an nspawn container and using legacy cgroups, the controller hierarchies are mounted
-         * read-only into the container. We skip migration/trim in this scenario since it would fail
-         * regardless with noisy "Read-only filesystem" warnings.
          */
         if (cg_all_unified() == 0) {
                 r = cg_migrate_v1_controllers(u->manager->cgroup_supported, migrate_mask, u->cgroup_path, migrate_callback, u);
                 if (r < 0)
-                        log_unit_full_errno(
-                                u,
-                                cg_v1_errno_to_log_level(r),
-                                r,
-                                "Failed to migrate controller cgroups from %s, ignoring: %m",
-                                u->cgroup_path);
+                        log_unit_warning_errno(u, r, "Failed to migrate controller cgroups from %s, ignoring: %m", u->cgroup_path);
 
                 is_root_slice = unit_has_name(u, SPECIAL_ROOT_SLICE);
                 r = cg_trim_v1_controllers(u->manager->cgroup_supported, ~target_mask, u->cgroup_path, !is_root_slice);
                 if (r < 0)
-                        log_unit_full_errno(
-                                u,
-                                cg_v1_errno_to_log_level(r),
-                                r,
-                                "Failed to delete controller cgroups %s, ignoring: %m",
-                                u->cgroup_path);
+                        log_unit_warning_errno(u, r, "Failed to delete controller cgroups %s, ignoring: %m", u->cgroup_path);
         }
 
         /* Set attributes */
@@ -3151,7 +3133,7 @@ int manager_setup_cgroup(Manager *m) {
                 (void) cg_set_attribute("memory", "/", "memory.use_hierarchy", "1");
 
         /* 8. Figure out which controllers are supported */
-        r = cg_mask_supported(&m->cgroup_supported);
+        r = cg_mask_supported_subtree(m->cgroup_root, &m->cgroup_supported);
         if (r < 0)
                 return log_error_errno(r, "Failed to determine supported controllers: %m");
 
index d695106658bff89da7087b5a035601d4ec02a6b8..b3df8cd893c099b36c85ef3e338999b83f922bbf 100644 (file)
@@ -142,7 +142,7 @@ static int vl_method_subscribe_managed_oom_cgroups(
         /* We only take one subscriber for this method so return an error if there's already an existing one.
          * This shouldn't happen since systemd-oomd is the only client of this method. */
         if (FLAGS_SET(flags, VARLINK_METHOD_MORE) && m->managed_oom_varlink_request)
-                return varlink_error(m->managed_oom_varlink_request, VARLINK_ERROR_SUBSCRIPTION_TAKEN, NULL);
+                return varlink_error(link, VARLINK_ERROR_SUBSCRIPTION_TAKEN, NULL);
 
         r = json_build(&arr, JSON_BUILD_EMPTY_ARRAY);
         if (r < 0)
@@ -188,6 +188,7 @@ static int vl_method_subscribe_managed_oom_cgroups(
         if (!FLAGS_SET(flags, VARLINK_METHOD_MORE))
                 return varlink_reply(link, v);
 
+        assert(!m->managed_oom_varlink_request);
         m->managed_oom_varlink_request = varlink_ref(link);
         return varlink_notify(m->managed_oom_varlink_request, v);
 }
@@ -475,8 +476,7 @@ void manager_varlink_done(Manager *m) {
         assert(m);
 
         /* Send the final message if we still have a subscribe request open. */
-        if (m->managed_oom_varlink_request)
-                m->managed_oom_varlink_request = varlink_close_unref(m->managed_oom_varlink_request);
+        m->managed_oom_varlink_request = varlink_close_unref(m->managed_oom_varlink_request);
 
         m->varlink_server = varlink_server_unref(m->varlink_server);
 }
index a4817ca6de7baa92dbda9782abe3a662d44f96b3..4a1585f663313d3025f1ebb87e12606ca80ccb73 100644 (file)
@@ -1162,6 +1162,7 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("PrivateNetwork", "b", bus_property_get_bool, offsetof(ExecContext, private_network), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PrivateUsers", "b", bus_property_get_bool, offsetof(ExecContext, private_users), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PrivateMounts", "b", bus_property_get_bool, offsetof(ExecContext, private_mounts), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("PrivateIPC", "b", bus_property_get_bool, offsetof(ExecContext, private_ipc), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ProtectHome", "s", property_get_protect_home, offsetof(ExecContext, protect_home), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ProtectSystem", "s", property_get_protect_system, offsetof(ExecContext, protect_system), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SameProcessGroup", "b", bus_property_get_bool, offsetof(ExecContext, same_pgrp), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -1204,6 +1205,7 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("ProcSubset", "s", property_get_proc_subset, offsetof(ExecContext, proc_subset), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ProtectHostname", "b", bus_property_get_bool, offsetof(ExecContext, protect_hostname), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("NetworkNamespacePath", "s", NULL, offsetof(ExecContext, network_namespace_path), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("IPCNamespacePath", "s", NULL, offsetof(ExecContext, ipc_namespace_path), SD_BUS_VTABLE_PROPERTY_CONST),
 
         /* Obsolete/redundant properties: */
         SD_BUS_PROPERTY("Capabilities", "s", property_get_empty_string, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
@@ -1753,6 +1755,9 @@ int bus_exec_context_set_transient_property(
         if (streq(name, "PrivateNetwork"))
                 return bus_set_transient_bool(u, name, &c->private_network, message, flags, error);
 
+        if (streq(name, "PrivateIPC"))
+                return bus_set_transient_bool(u, name, &c->private_ipc, message, flags, error);
+
         if (streq(name, "PrivateUsers"))
                 return bus_set_transient_bool(u, name, &c->private_users, message, flags, error);
 
@@ -1873,6 +1878,9 @@ int bus_exec_context_set_transient_property(
         if (streq(name, "NetworkNamespacePath"))
                 return bus_set_transient_path(u, name, &c->network_namespace_path, message, flags, error);
 
+        if (streq(name, "IPCNamespacePath"))
+                return bus_set_transient_path(u, name, &c->ipc_namespace_path, message, flags, error);
+
         if (streq(name, "SupplementaryGroups")) {
                 _cleanup_strv_free_ char **l = NULL;
                 char **p;
@@ -2244,6 +2252,9 @@ int bus_exec_context_set_transient_property(
                                 if (r < 0)
                                         return r;
 
+                                if (allow_list && e >= 0)
+                                        return -EINVAL;
+
                                 r = seccomp_parse_syscall_filter(n,
                                                                  e,
                                                                  c->syscall_filter,
@@ -2307,15 +2318,8 @@ int bus_exec_context_set_transient_property(
                         }
 
                         STRV_FOREACH(s, l) {
-                                _cleanup_free_ char *n = NULL;
-                                int e;
-
-                                r = parse_syscall_and_errno(*s, &n, &e);
-                                if (r < 0)
-                                        return r;
-
-                                r = seccomp_parse_syscall_filter(n,
-                                                                 0, /* errno not used */
+                                r = seccomp_parse_syscall_filter(*s,
+                                                                 -1, /* errno not used */
                                                                  c->syscall_log,
                                                                  SECCOMP_PARSE_LOG | SECCOMP_PARSE_PERMISSIVE |
                                                                  invert_flag |
@@ -3301,7 +3305,7 @@ int bus_exec_context_set_transient_property(
                         if (r < 0)
                                 return r;
 
-                        if (rl == (uint64_t) -1)
+                        if (rl == UINT64_MAX)
                                 x = RLIM_INFINITY;
                         else {
                                 x = (rlim_t) rl;
index f54e73684e8d1c8bb73174acd0213ab38e95c601..e33896f9763f49a3f1293a0f67b460c6a0d24b19 100644 (file)
@@ -2664,7 +2664,7 @@ const sd_bus_vtable bus_manager_vtable[] = {
         SD_BUS_PROPERTY("ShowStatus", "b", property_get_show_status, 0, 0),
         SD_BUS_PROPERTY("UnitPath", "as", NULL, offsetof(Manager, lookup_paths.search_path), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("DefaultStandardOutput", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_error), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_WRITABLE_PROPERTY("RuntimeWatchdogUSec", "t", property_get_runtime_watchdog, property_set_runtime_watchdog, 0, 0),
         SD_BUS_WRITABLE_PROPERTY("RebootWatchdogUSec", "t", property_get_reboot_watchdog, property_set_reboot_watchdog, 0, 0),
         /* The following item is an obsolete alias */
index f7cdb51eba883c83b8472173dc01342f47326788..73906ebab73d23862b6ae4e71e1f752cb20fe479 100644 (file)
@@ -27,6 +27,7 @@
 #include "unit.h"
 
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_type, service_type, ServiceType);
+static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_exit_type, service_exit_type, ServiceExitType);
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, service_result, ServiceResult);
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_restart, service_restart, ServiceRestart);
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_notify_access, notify_access, NotifyAccess);
@@ -192,6 +193,7 @@ int bus_service_method_mount_image(sd_bus_message *message, void *userdata, sd_b
 const sd_bus_vtable bus_service_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("Type", "s", property_get_type, offsetof(Service, type), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ExitType", "s", property_get_exit_type, offsetof(Service, exit_type), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Restart", "s", property_get_restart, offsetof(Service, restart), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PIDFile", "s", NULL, offsetof(Service, pid_file), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("NotifyAccess", "s", property_get_notify_access, offsetof(Service, notify_access), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -377,6 +379,7 @@ static int bus_set_transient_std_fd(
 }
 static BUS_DEFINE_SET_TRANSIENT_PARSE(notify_access, NotifyAccess, notify_access_from_string);
 static BUS_DEFINE_SET_TRANSIENT_PARSE(service_type, ServiceType, service_type_from_string);
+static BUS_DEFINE_SET_TRANSIENT_PARSE(service_exit_type, ServiceExitType, service_exit_type_from_string);
 static BUS_DEFINE_SET_TRANSIENT_PARSE(service_restart, ServiceRestart, service_restart_from_string);
 static BUS_DEFINE_SET_TRANSIENT_PARSE(oom_policy, OOMPolicy, oom_policy_from_string);
 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(bus_name, sd_bus_service_name_is_valid);
@@ -414,6 +417,9 @@ static int bus_service_set_transient_property(
         if (streq(name, "Type"))
                 return bus_set_transient_service_type(u, name, &s->type, message, flags, error);
 
+        if (streq(name, "ExitType"))
+                return bus_set_transient_service_exit_type(u, name, &s->exit_type, message, flags, error);
+
         if (streq(name, "OOMPolicy"))
                 return bus_set_transient_oom_policy(u, name, &s->oom_policy, message, flags, error);
 
index 859e35eee4244516aaf6a165d78587dd956a8ff6..39d6799b59a7f91818bbb19b226c4543ce1ace02 100644 (file)
@@ -1069,7 +1069,7 @@ static int property_get_current_memory(
                 void *userdata,
                 sd_bus_error *error) {
 
-        uint64_t sz = (uint64_t) -1;
+        uint64_t sz = UINT64_MAX;
         Unit *u = userdata;
         int r;
 
@@ -1093,7 +1093,7 @@ static int property_get_current_tasks(
                 void *userdata,
                 sd_bus_error *error) {
 
-        uint64_t cn = (uint64_t) -1;
+        uint64_t cn = UINT64_MAX;
         Unit *u = userdata;
         int r;
 
@@ -1117,7 +1117,7 @@ static int property_get_cpu_usage(
                 void *userdata,
                 sd_bus_error *error) {
 
-        nsec_t ns = (nsec_t) -1;
+        nsec_t ns = NSEC_INFINITY;
         Unit *u = userdata;
         int r;
 
index 0d3fc1c0fc4a425bdb249b3ebc4b9a53d2809702..35aea2f83015ca01d0d2501f655e4b3331a15989 100644 (file)
@@ -1430,21 +1430,21 @@ static bool context_has_no_new_privileges(const ExecContext *c) {
                 return false;
 
         /* We need NNP if we have any form of seccomp and are unprivileged */
-        return context_has_address_families(c) ||
+        return c->lock_personality ||
                 c->memory_deny_write_execute ||
-                c->restrict_realtime ||
-                c->restrict_suid_sgid ||
-                exec_context_restrict_namespaces_set(c) ||
+                c->private_devices ||
                 c->protect_clock ||
+                c->protect_hostname ||
                 c->protect_kernel_tunables ||
                 c->protect_kernel_modules ||
                 c->protect_kernel_logs ||
-                c->private_devices ||
-                context_has_syscall_filters(c) ||
-                context_has_syscall_logs(c) ||
+                context_has_address_families(c) ||
+                exec_context_restrict_namespaces_set(c) ||
+                c->restrict_realtime ||
+                c->restrict_suid_sgid ||
                 !set_isempty(c->syscall_archs) ||
-                c->lock_personality ||
-                c->protect_hostname;
+                context_has_syscall_filters(c) ||
+                context_has_syscall_logs(c);
 }
 
 static bool exec_context_has_credentials(const ExecContext *context) {
@@ -2037,7 +2037,9 @@ bool exec_needs_mount_namespace(
             context->protect_kernel_logs ||
             context->protect_control_groups ||
             context->protect_proc != PROTECT_PROC_DEFAULT ||
-            context->proc_subset != PROC_SUBSET_ALL)
+            context->proc_subset != PROC_SUBSET_ALL ||
+            context->private_ipc ||
+            context->ipc_namespace_path)
                 return true;
 
         if (context->root_directory) {
@@ -2506,7 +2508,7 @@ static int write_credential(
                                             * user can no longer chmod() the file to gain write access. */
                                 return r;
 
-                        if (fchown(fd, uid, (gid_t) -1) < 0)
+                        if (fchown(fd, uid, GID_INVALID) < 0)
                                 return -errno;
                 }
         }
@@ -2624,7 +2626,7 @@ static int acquire_credentials(
                         if (!ownership_ok)
                                 return r;
 
-                        if (fchown(dfd, uid, (gid_t) -1) < 0)
+                        if (fchown(dfd, uid, GID_INVALID) < 0)
                                 return -errno;
                 }
         }
@@ -3178,6 +3180,7 @@ static int apply_mount_namespace(
                         .protect_system = context->protect_system,
                         .protect_proc = context->protect_proc,
                         .proc_subset = context->proc_subset,
+                        .private_ipc = context->private_ipc || context->ipc_namespace_path,
                 };
         } else if (!context->dynamic_user && root_dir)
                 /*
@@ -3476,8 +3479,10 @@ static int close_remaining_fds(
                 n_dont_close += n_fds;
         }
 
-        if (runtime)
+        if (runtime) {
                 append_socket_pair(dont_close, &n_dont_close, runtime->netns_storage_socket);
+                append_socket_pair(dont_close, &n_dont_close, runtime->ipcns_storage_socket);
+        }
 
         if (dcreds) {
                 if (dcreds->user)
@@ -3918,13 +3923,21 @@ static int exec_child(
         }
 
         if (context->network_namespace_path && runtime && runtime->netns_storage_socket[0] >= 0) {
-                r = open_netns_path(runtime->netns_storage_socket, context->network_namespace_path);
+                r = open_shareable_ns_path(runtime->netns_storage_socket, context->network_namespace_path, CLONE_NEWNET);
                 if (r < 0) {
                         *exit_status = EXIT_NETWORK;
                         return log_unit_error_errno(unit, r, "Failed to open network namespace path %s: %m", context->network_namespace_path);
                 }
         }
 
+        if (context->ipc_namespace_path && runtime && runtime->ipcns_storage_socket[0] >= 0) {
+                r = open_shareable_ns_path(runtime->ipcns_storage_socket, context->ipc_namespace_path, CLONE_NEWIPC);
+                if (r < 0) {
+                        *exit_status = EXIT_NAMESPACE;
+                        return log_unit_error_errno(unit, r, "Failed to open IPC namespace path %s: %m", context->ipc_namespace_path);
+                }
+        }
+
         r = setup_input(context, params, socket_fd, named_iofds);
         if (r < 0) {
                 *exit_status = EXIT_STDIN;
@@ -4195,7 +4208,7 @@ static int exec_child(
         if ((context->private_network || context->network_namespace_path) && runtime && runtime->netns_storage_socket[0] >= 0) {
 
                 if (ns_type_supported(NAMESPACE_NET)) {
-                        r = setup_netns(runtime->netns_storage_socket);
+                        r = setup_shareable_ns(runtime->netns_storage_socket, CLONE_NEWNET);
                         if (r == -EPERM)
                                 log_unit_warning_errno(unit, r,
                                                        "PrivateNetwork=yes is configured, but network namespace setup failed, ignoring: %m");
@@ -4211,6 +4224,25 @@ static int exec_child(
                         log_unit_warning(unit, "PrivateNetwork=yes is configured, but the kernel does not support network namespaces, ignoring.");
         }
 
+        if ((context->private_ipc || context->ipc_namespace_path) && runtime && runtime->ipcns_storage_socket[0] >= 0) {
+
+                if (ns_type_supported(NAMESPACE_IPC)) {
+                        r = setup_shareable_ns(runtime->ipcns_storage_socket, CLONE_NEWIPC);
+                        if (r == -EPERM)
+                                log_unit_warning_errno(unit, r,
+                                                       "PrivateIPC=yes is configured, but IPC namespace setup failed, ignoring: %m");
+                        else if (r < 0) {
+                                *exit_status = EXIT_NAMESPACE;
+                                return log_unit_error_errno(unit, r, "Failed to set up IPC namespacing: %m");
+                        }
+                } else if (context->ipc_namespace_path) {
+                        *exit_status = EXIT_NAMESPACE;
+                        return log_unit_error_errno(unit, SYNTHETIC_ERRNO(EOPNOTSUPP),
+                                                    "IPCNamespacePath= is not supported, refusing.");
+                } else
+                        log_unit_warning(unit, "PrivateIPC=yes is configured, but the kernel does not support IPC namespaces, ignoring.");
+        }
+
         needs_mount_namespace = exec_needs_mount_namespace(context, params, runtime);
         if (needs_mount_namespace) {
                 _cleanup_free_ char *error_path = NULL;
@@ -4314,7 +4346,7 @@ static int exec_child(
 #endif
 
         /* We repeat the fd closing here, to make sure that nothing is leaked from the PAM modules. Note that we are
-         * more aggressive this time since socket_fd and the netns fds we don't need anymore. We do keep the exec_fd
+         * more aggressive this time since socket_fd and the netns and ipcns fds we don't need anymore. We do keep the exec_fd
          * however if we have it as we want to keep it open until the final execve(). */
 
         r = close_all_fds(keep_fds, n_keep_fds);
@@ -6057,6 +6089,7 @@ static ExecRuntime* exec_runtime_free(ExecRuntime *rt, bool destroy) {
         rt->tmp_dir = mfree(rt->tmp_dir);
         rt->var_tmp_dir = mfree(rt->var_tmp_dir);
         safe_close_pair(rt->netns_storage_socket);
+        safe_close_pair(rt->ipcns_storage_socket);
         return mfree(rt);
 }
 
@@ -6081,6 +6114,7 @@ static int exec_runtime_allocate(ExecRuntime **ret, const char *id) {
         *n = (ExecRuntime) {
                 .id = TAKE_PTR(id_copy),
                 .netns_storage_socket = { -1, -1 },
+                .ipcns_storage_socket = { -1, -1 },
         };
 
         *ret = n;
@@ -6093,6 +6127,7 @@ static int exec_runtime_add(
                 char **tmp_dir,
                 char **var_tmp_dir,
                 int netns_storage_socket[2],
+                int ipcns_storage_socket[2],
                 ExecRuntime **ret) {
 
         _cleanup_(exec_runtime_freep) ExecRuntime *rt = NULL;
@@ -6101,7 +6136,7 @@ static int exec_runtime_add(
         assert(m);
         assert(id);
 
-        /* tmp_dir, var_tmp_dir, netns_storage_socket fds are donated on success */
+        /* tmp_dir, var_tmp_dir, {net,ipc}ns_storage_socket fds are donated on success */
 
         r = exec_runtime_allocate(&rt, id);
         if (r < 0)
@@ -6120,6 +6155,11 @@ static int exec_runtime_add(
                 rt->netns_storage_socket[1] = TAKE_FD(netns_storage_socket[1]);
         }
 
+        if (ipcns_storage_socket) {
+                rt->ipcns_storage_socket[0] = TAKE_FD(ipcns_storage_socket[0]);
+                rt->ipcns_storage_socket[1] = TAKE_FD(ipcns_storage_socket[1]);
+        }
+
         rt->manager = m;
 
         if (ret)
@@ -6136,7 +6176,7 @@ static int exec_runtime_make(
                 ExecRuntime **ret) {
 
         _cleanup_(namespace_cleanup_tmpdirp) char *tmp_dir = NULL, *var_tmp_dir = NULL;
-        _cleanup_close_pair_ int netns_storage_socket[2] = { -1, -1 };
+        _cleanup_close_pair_ int netns_storage_socket[2] = { -1, -1 }, ipcns_storage_socket[2] = { -1, -1 };
         int r;
 
         assert(m);
@@ -6144,7 +6184,7 @@ static int exec_runtime_make(
         assert(id);
 
         /* It is not necessary to create ExecRuntime object. */
-        if (!c->private_network && !c->private_tmp && !c->network_namespace_path) {
+        if (!c->private_network && !c->private_ipc && !c->private_tmp && !c->network_namespace_path) {
                 *ret = NULL;
                 return 0;
         }
@@ -6163,7 +6203,12 @@ static int exec_runtime_make(
                         return -errno;
         }
 
-        r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, netns_storage_socket, ret);
+        if (c->private_ipc || c->ipc_namespace_path) {
+                if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, ipcns_storage_socket) < 0)
+                        return -errno;
+        }
+
+        r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, netns_storage_socket, ipcns_storage_socket, ret);
         if (r < 0)
                 return r;
 
@@ -6254,6 +6299,26 @@ int exec_runtime_serialize(const Manager *m, FILE *f, FDSet *fds) {
                         fprintf(f, " netns-socket-1=%i", copy);
                 }
 
+                if (rt->ipcns_storage_socket[0] >= 0) {
+                        int copy;
+
+                        copy = fdset_put_dup(fds, rt->ipcns_storage_socket[0]);
+                        if (copy < 0)
+                                return copy;
+
+                        fprintf(f, " ipcns-socket-0=%i", copy);
+                }
+
+                if (rt->ipcns_storage_socket[1] >= 0) {
+                        int copy;
+
+                        copy = fdset_put_dup(fds, rt->ipcns_storage_socket[1]);
+                        if (copy < 0)
+                                return copy;
+
+                        fprintf(f, " ipcns-socket-1=%i", copy);
+                }
+
                 fputc('\n', f);
         }
 
@@ -6335,6 +6400,28 @@ int exec_runtime_deserialize_compat(Unit *u, const char *key, const char *value,
 
                 safe_close(rt->netns_storage_socket[1]);
                 rt->netns_storage_socket[1] = fdset_remove(fds, fd);
+
+        } else if (streq(key, "ipcns-socket-0")) {
+                int fd;
+
+                if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) {
+                        log_unit_debug(u, "Failed to parse ipcns socket value: %s", value);
+                        return 0;
+                }
+
+                safe_close(rt->ipcns_storage_socket[0]);
+                rt->ipcns_storage_socket[0] = fdset_remove(fds, fd);
+
+        } else if (streq(key, "ipcns-socket-1")) {
+                int fd;
+
+                if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) {
+                        log_unit_debug(u, "Failed to parse ipcns socket value: %s", value);
+                        return 0;
+                }
+
+                safe_close(rt->ipcns_storage_socket[1]);
+                rt->ipcns_storage_socket[1] = fdset_remove(fds, fd);
         } else
                 return 0;
 
@@ -6358,7 +6445,7 @@ int exec_runtime_deserialize_compat(Unit *u, const char *key, const char *value,
 int exec_runtime_deserialize_one(Manager *m, const char *value, FDSet *fds) {
         _cleanup_free_ char *tmp_dir = NULL, *var_tmp_dir = NULL;
         char *id = NULL;
-        int r, fdpair[] = {-1, -1};
+        int r, netns_fdpair[] = {-1, -1}, ipcns_fdpair[] = {-1, -1};
         const char *p, *v = value;
         size_t n;
 
@@ -6401,13 +6488,13 @@ int exec_runtime_deserialize_one(Manager *m, const char *value, FDSet *fds) {
                 n = strcspn(v, " ");
                 buf = strndupa(v, n);
 
-                r = safe_atoi(buf, &fdpair[0]);
+                r = safe_atoi(buf, &netns_fdpair[0]);
                 if (r < 0)
                         return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-0=%s: %m", buf);
-                if (!fdset_contains(fds, fdpair[0]))
+                if (!fdset_contains(fds, netns_fdpair[0]))
                         return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
-                                               "exec-runtime specification netns-socket-0= refers to unknown fd %d: %m", fdpair[0]);
-                fdpair[0] = fdset_remove(fds, fdpair[0]);
+                                               "exec-runtime specification netns-socket-0= refers to unknown fd %d: %m", netns_fdpair[0]);
+                netns_fdpair[0] = fdset_remove(fds, netns_fdpair[0]);
                 if (v[n] != ' ')
                         goto finalize;
                 p = v + n + 1;
@@ -6419,17 +6506,56 @@ int exec_runtime_deserialize_one(Manager *m, const char *value, FDSet *fds) {
 
                 n = strcspn(v, " ");
                 buf = strndupa(v, n);
-                r = safe_atoi(buf, &fdpair[1]);
+
+                r = safe_atoi(buf, &netns_fdpair[1]);
                 if (r < 0)
                         return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-1=%s: %m", buf);
-                if (!fdset_contains(fds, fdpair[1]))
+                if (!fdset_contains(fds, netns_fdpair[1]))
+                        return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
+                                               "exec-runtime specification netns-socket-1= refers to unknown fd %d: %m", netns_fdpair[1]);
+                netns_fdpair[1] = fdset_remove(fds, netns_fdpair[1]);
+                if (v[n] != ' ')
+                        goto finalize;
+                p = v + n + 1;
+        }
+
+        v = startswith(p, "ipcns-socket-0=");
+        if (v) {
+                char *buf;
+
+                n = strcspn(v, " ");
+                buf = strndupa(v, n);
+
+                r = safe_atoi(buf, &ipcns_fdpair[0]);
+                if (r < 0)
+                        return log_debug_errno(r, "Unable to parse exec-runtime specification ipcns-socket-0=%s: %m", buf);
+                if (!fdset_contains(fds, ipcns_fdpair[0]))
+                        return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
+                                               "exec-runtime specification ipcns-socket-0= refers to unknown fd %d: %m", ipcns_fdpair[0]);
+                ipcns_fdpair[0] = fdset_remove(fds, ipcns_fdpair[0]);
+                if (v[n] != ' ')
+                        goto finalize;
+                p = v + n + 1;
+        }
+
+        v = startswith(p, "ipcns-socket-1=");
+        if (v) {
+                char *buf;
+
+                n = strcspn(v, " ");
+                buf = strndupa(v, n);
+
+                r = safe_atoi(buf, &ipcns_fdpair[1]);
+                if (r < 0)
+                        return log_debug_errno(r, "Unable to parse exec-runtime specification ipcns-socket-1=%s: %m", buf);
+                if (!fdset_contains(fds, ipcns_fdpair[1]))
                         return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
-                                               "exec-runtime specification netns-socket-1= refers to unknown fd %d: %m", fdpair[1]);
-                fdpair[1] = fdset_remove(fds, fdpair[1]);
+                                               "exec-runtime specification ipcns-socket-1= refers to unknown fd %d: %m", ipcns_fdpair[1]);
+                ipcns_fdpair[1] = fdset_remove(fds, ipcns_fdpair[1]);
         }
 
 finalize:
-        r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, fdpair, NULL);
+        r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, netns_fdpair, ipcns_fdpair, NULL);
         if (r < 0)
                 return log_debug_errno(r, "Failed to add exec-runtime: %m");
         return 0;
index 20e1799b46a2f126a9feaac6dc34205ae78be20a..4c7a5b874f364ed5dbcfe5f40691f6132a59f5ae 100644 (file)
@@ -117,6 +117,9 @@ struct ExecRuntime {
         /* An AF_UNIX socket pair, that contains a datagram containing a file descriptor referring to the network
          * namespace. */
         int netns_storage_socket[2];
+
+        /* Like netns_storage_socket, but the file descriptor is referring to the IPC namespace. */
+        int ipcns_storage_socket[2];
 };
 
 typedef enum ExecDirectoryType {
@@ -280,6 +283,7 @@ struct ExecContext {
         bool private_devices;
         bool private_users;
         bool private_mounts;
+        bool private_ipc;
         bool protect_kernel_tunables;
         bool protect_kernel_modules;
         bool protect_kernel_logs;
@@ -314,6 +318,7 @@ struct ExecContext {
         Set *address_families;
 
         char *network_namespace_path;
+        char *ipc_namespace_path;
 
         ExecDirectory directories[_EXEC_DIRECTORY_TYPE_MAX];
         ExecPreserveMode runtime_directory_preserve_mode;
index d1c85e23bfaf1a0cc4bdd33be5bd842886dd4f7a..3bb48564ccdfd642cf0dcc6aac6c28cb8abcd349 100644 (file)
@@ -112,6 +112,7 @@ int unit_load_dropin(Unit *u) {
                         return log_oom();
         }
 
+        u->dropin_mtime = 0;
         STRV_FOREACH(f, u->dropin_paths)
                 (void) config_parse(
                                 u->id, *f, NULL,
index 6a11ef0d9d76923e8d0afcbe3d60e72e96e88ac3..5ef785c0deea156e4606834653ab5282c47faeb1 100644 (file)
@@ -133,10 +133,12 @@ $1.ProtectKernelLogs,                    config_parse_bool,
 $1.ProtectClock,                         config_parse_bool,                           0,                                  offsetof($1, exec_context.protect_clock)
 $1.ProtectControlGroups,                 config_parse_bool,                           0,                                  offsetof($1, exec_context.protect_control_groups)
 $1.NetworkNamespacePath,                 config_parse_unit_path_printf,               0,                                  offsetof($1, exec_context.network_namespace_path)
+$1.IPCNamespacePath,                     config_parse_unit_path_printf,               0,                                  offsetof($1, exec_context.ipc_namespace_path)
 $1.LogNamespace,                         config_parse_log_namespace,                  0,                                  offsetof($1, exec_context)
 $1.PrivateNetwork,                       config_parse_bool,                           0,                                  offsetof($1, exec_context.private_network)
 $1.PrivateUsers,                         config_parse_bool,                           0,                                  offsetof($1, exec_context.private_users)
 $1.PrivateMounts,                        config_parse_bool,                           0,                                  offsetof($1, exec_context.private_mounts)
+$1.PrivateIPC,                           config_parse_bool,                           0,                                  offsetof($1, exec_context.private_ipc)
 $1.ProtectSystem,                        config_parse_protect_system,                 0,                                  offsetof($1, exec_context.protect_system)
 $1.ProtectHome,                          config_parse_protect_home,                   0,                                  offsetof($1, exec_context.protect_home)
 $1.MountFlags,                           config_parse_exec_mount_flags,               0,                                  offsetof($1, exec_context.mount_flags)
@@ -357,6 +359,7 @@ Service.StartLimitAction,                config_parse_emergency_action,
 Service.FailureAction,                   config_parse_emergency_action,               0,                                  offsetof(Unit, failure_action)
 Service.RebootArgument,                  config_parse_unit_string_printf,             0,                                  offsetof(Unit, reboot_arg)
 Service.Type,                            config_parse_service_type,                   0,                                  offsetof(Service, type)
+Service.ExitType,                        config_parse_service_exit_type,              0,                                  offsetof(Service, exit_type)
 Service.Restart,                         config_parse_service_restart,                0,                                  offsetof(Service, restart)
 Service.PermissionsStartOnly,            config_parse_bool,                           0,                                  offsetof(Service, permissions_start_only)
 Service.RootDirectoryStartOnly,          config_parse_bool,                           0,                                  offsetof(Service, root_directory_start_only)
index c27814ad387f07e7797e575056efe9dac818eae3..ead7f7bf117961429be4669a5c85da4438fbb785 100644 (file)
@@ -130,6 +130,7 @@ DEFINE_CONFIG_PARSE_ENUM(config_parse_protect_home, protect_home, ProtectHome, "
 DEFINE_CONFIG_PARSE_ENUM(config_parse_protect_system, protect_system, ProtectSystem, "Failed to parse protect system value");
 DEFINE_CONFIG_PARSE_ENUM(config_parse_runtime_preserve_mode, exec_preserve_mode, ExecPreserveMode, "Failed to parse runtime directory preserve mode");
 DEFINE_CONFIG_PARSE_ENUM(config_parse_service_type, service_type, ServiceType, "Failed to parse service type");
+DEFINE_CONFIG_PARSE_ENUM(config_parse_service_exit_type, service_exit_type, ServiceExitType, "Failed to parse service exit type");
 DEFINE_CONFIG_PARSE_ENUM(config_parse_service_restart, service_restart, ServiceRestart, "Failed to parse service restart specifier");
 DEFINE_CONFIG_PARSE_ENUM(config_parse_service_timeout_failure_mode, service_timeout_failure_mode, ServiceTimeoutFailureMode, "Failed to parse timeout failure mode");
 DEFINE_CONFIG_PARSE_ENUM(config_parse_socket_bind, socket_address_bind_ipv6_only_or_bool, SocketAddressBindIPv6Only, "Failed to parse bind IPv6 only value");
@@ -1094,7 +1095,7 @@ int config_parse_exec_input_data(
                 return 0;
         }
 
-        r = unbase64mem(rvalue, (size_t) -1, &p, &sz);
+        r = unbase64mem(rvalue, SIZE_MAX, &p, &sz);
         if (r < 0) {
                 log_syntax(unit, LOG_WARNING, filename, line, r,
                            "Failed to decode base64 data, ignoring: %s", rvalue);
@@ -3209,13 +3210,20 @@ int config_parse_syscall_filter(
                 if (r == -ENOMEM)
                         return log_oom();
                 if (r < 0) {
-                        log_syntax(unit, LOG_WARNING, filename, line, r, "Invalid syntax, ignoring: %s", rvalue);
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
                         return 0;
                 }
 
                 r = parse_syscall_and_errno(word, &name, &num);
                 if (r < 0) {
-                        log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse syscall:errno, ignoring: %s", word);
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Failed to parse syscall:errno, ignoring: %s", word);
+                        continue;
+                }
+                if (!invert && num >= 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, 0,
+                                   "Allow-listed system calls cannot take error number, ignoring: %s", word);
                         continue;
                 }
 
@@ -3280,8 +3288,7 @@ int config_parse_syscall_log(
 
         p = rvalue;
         for (;;) {
-                _cleanup_free_ char *word = NULL, *name = NULL;
-                int num;
+                _cleanup_free_ char *word = NULL;
 
                 r = extract_first_word(&p, &word, NULL, 0);
                 if (r == 0)
@@ -3293,14 +3300,8 @@ int config_parse_syscall_log(
                         return 0;
                 }
 
-                r = parse_syscall_and_errno(word, &name, &num);
-                if (r < 0 || num >= 0) { /* errno code not allowed */
-                        log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse syscall, ignoring: %s", word);
-                        continue;
-                }
-
                 r = seccomp_parse_syscall_filter(
-                                name, 0, c->syscall_log,
+                                word, -1, c->syscall_log,
                                 SECCOMP_PARSE_LOG|SECCOMP_PARSE_PERMISSIVE|
                                 (invert ? SECCOMP_PARSE_INVERT : 0)|
                                 (c->syscall_log_allow_list ? SECCOMP_PARSE_ALLOW_LIST : 0),
@@ -5748,6 +5749,7 @@ void unit_dump_config_items(FILE *f) {
                 { config_parse_unit_deps,             "UNIT [...]" },
                 { config_parse_exec,                  "PATH [ARGUMENT [...]]" },
                 { config_parse_service_type,          "SERVICETYPE" },
+                { config_parse_service_exit_type,     "SERVICEEXITTYPE" },
                 { config_parse_service_restart,       "SERVICERESTART" },
                 { config_parse_service_timeout_failure_mode, "TIMEOUTMODE" },
                 { config_parse_kill_mode,             "KILLMODE" },
index b8a6d5feadc57fed460cfea1bf516c8e6c1af75e..4746a8a792b2674f841bb3c9673be6b359d099bc 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_service_timeout);
 CONFIG_PARSER_PROTOTYPE(config_parse_service_timeout_abort);
 CONFIG_PARSER_PROTOTYPE(config_parse_service_timeout_failure_mode);
 CONFIG_PARSER_PROTOTYPE(config_parse_service_type);
+CONFIG_PARSER_PROTOTYPE(config_parse_service_exit_type);
 CONFIG_PARSER_PROTOTYPE(config_parse_service_restart);
 CONFIG_PARSER_PROTOTYPE(config_parse_socket_bindtodevice);
 CONFIG_PARSER_PROTOTYPE(config_parse_exec_output);
index af5a1f426d1fb6cb63103b193d3a3a7e58386254..0ddd6298513cba22f08be59d99ed3c85b5e9a550 100644 (file)
@@ -544,7 +544,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
                 if (proc_cmdline_value_missing(key, value))
                         return 0;
 
-                r = unbase64mem(value, (size_t) -1, &p, &sz);
+                r = unbase64mem(value, SIZE_MAX, &p, &sz);
                 if (r < 0)
                         log_warning_errno(r, "Failed to parse systemd.random_seed= argument, ignoring: %s", value);
 
index d8f80a55362cfe231420828fdfa9f9a64920fe5f..629966ea60edef121b4afb36b6448c123293996b 100644 (file)
@@ -2200,7 +2200,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) {
         /* When we are reloading, let's not wait with generating signals, since we need to exit the manager as quickly
          * as we can. There's no point in throttling generation of signals in that case. */
         if (MANAGER_IS_RELOADING(m) || m->send_reloading_done || m->pending_reload_message)
-                budget = (unsigned) -1; /* infinite budget in this case */
+                budget = UINT_MAX; /* infinite budget in this case */
         else {
                 /* Anything to do at all? */
                 if (!m->dbus_unit_queue && !m->dbus_job_queue)
@@ -2232,7 +2232,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) {
                 bus_unit_send_change_signal(u);
                 n++;
 
-                if (budget != (unsigned) -1)
+                if (budget != UINT_MAX)
                         budget--;
         }
 
@@ -2242,7 +2242,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) {
                 bus_job_send_change_signal(j);
                 n++;
 
-                if (budget != (unsigned) -1)
+                if (budget != UINT_MAX)
                         budget--;
         }
 
index 23b558859c2fef6eb21dea7379b40104c1a235b2..ca5d0939a18f36a5338f284c9876fdad361454a2 100644 (file)
@@ -1019,7 +1019,7 @@ static void mount_enter_mounting(Mount *m) {
         if (p) {
                 _cleanup_free_ char *opts = NULL;
 
-                r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts);
+                r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, NULL, &opts);
                 if (r < 0)
                         goto fail;
 
index 04b631d90c9a956e8e9b92186fe6c8b0c50ec6d8..d47531408baac5f5ab8723433716e7de85d634c7 100644 (file)
@@ -26,6 +26,7 @@
 #include "mountpoint-util.h"
 #include "namespace-util.h"
 #include "namespace.h"
+#include "nsflags.h"
 #include "nulstr-util.h"
 #include "os-util.h"
 #include "path-util.h"
@@ -63,6 +64,7 @@ typedef enum MountMode {
         EXEC,
         TMPFS,
         EXTENSION_IMAGES, /* Mounted outside the root directory, and used by subsequent mounts */
+        MQUEUEFS,
         READWRITE_IMPLICIT, /* Should have the lowest priority. */
         _MOUNT_MODE_MAX,
 } MountMode;
@@ -227,6 +229,7 @@ static const char * const mount_mode_table[_MOUNT_MODE_MAX] = {
         [READWRITE_IMPLICIT]   = "rw-implicit",
         [EXEC]                 = "exec",
         [NOEXEC]               = "noexec",
+        [MQUEUEFS]             = "mqueuefs",
 };
 
 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(mount_mode, MountMode);
@@ -1112,6 +1115,24 @@ static int mount_run(const MountEntry *m) {
         return mount_tmpfs(m);
 }
 
+static int mount_mqueuefs(const MountEntry *m) {
+        int r;
+        const char *entry_path;
+
+        assert(m);
+
+        entry_path = mount_entry_path(m);
+
+        (void) mkdir_p_label(entry_path, 0755);
+        (void) umount_recursive(entry_path, 0);
+
+        r = mount_nofollow_verbose(LOG_DEBUG, "mqueue", entry_path, "mqueue", m->flags, mount_entry_options(m));
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 static int mount_image(const MountEntry *m, const char *root_directory) {
 
         _cleanup_free_ char *host_os_release_id = NULL, *host_os_release_version_id = NULL,
@@ -1316,6 +1337,9 @@ static int apply_one_mount(
         case RUN:
                 return mount_run(m);
 
+        case MQUEUEFS:
+                return mount_mqueuefs(m);
+
         case MOUNT_IMAGES:
                 return mount_image(m, NULL);
 
@@ -1515,7 +1539,8 @@ static size_t namespace_calculate_mounts(
                 (creds_path ? 2 : 1) +
                 !!log_namespace +
                 setup_propagate + /* /run/systemd/incoming */
-                !!notify_socket;
+                !!notify_socket +
+                ns_info->private_ipc; /* /dev/mqueue */
 }
 
 static void normalize_mounts(const char *root_directory, MountEntry *mounts, size_t *n_mounts) {
@@ -2026,6 +2051,13 @@ int setup_namespace(
                         };
                 }
 
+                if (ns_info->private_ipc)
+                        *(m++) = (MountEntry) {
+                                .path_const = "/dev/mqueue",
+                                .mode = MQUEUEFS,
+                                .flags = MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME,
+                        };
+
                 if (creds_path) {
                         /* If our service has a credentials store configured, then bind that one in, but hide
                          * everything else. */
@@ -2117,11 +2149,10 @@ int setup_namespace(
         if (setup_propagate)
                 (void) mkdir_p(propagate_dir, 0600);
 
-        if (n_extension_images > 0) {
+        if (n_extension_images > 0)
                 /* ExtensionImages mountpoint directories will be created
                  * while parsing the mounts to create, so have the parent ready */
                 (void) mkdir_p(extension_dir, 0600);
-        }
 
         /* Remount / as SLAVE so that nothing now mounted in the namespace
          * shows up in the parent */
@@ -2508,13 +2539,17 @@ int setup_tmp_dirs(const char *id, char **tmp_dir, char **var_tmp_dir) {
         return 0;
 }
 
-int setup_netns(const int netns_storage_socket[static 2]) {
-        _cleanup_close_ int netns = -1;
+int setup_shareable_ns(const int ns_storage_socket[static 2], unsigned long nsflag) {
+        _cleanup_close_ int ns = -1;
         int r, q;
+        const char *ns_name, *ns_path;
+
+        assert(ns_storage_socket);
+        assert(ns_storage_socket[0] >= 0);
+        assert(ns_storage_socket[1] >= 0);
 
-        assert(netns_storage_socket);
-        assert(netns_storage_socket[0] >= 0);
-        assert(netns_storage_socket[1] >= 0);
+        ns_name = namespace_single_flag_to_string(nsflag);
+        assert(ns_name);
 
         /* We use the passed socketpair as a storage buffer for our
          * namespace reference fd. Whatever process runs this first
@@ -2524,35 +2559,36 @@ int setup_netns(const int netns_storage_socket[static 2]) {
          *
          * It's a bit crazy, but hey, works great! */
 
-        if (lockf(netns_storage_socket[0], F_LOCK, 0) < 0)
+        if (lockf(ns_storage_socket[0], F_LOCK, 0) < 0)
                 return -errno;
 
-        netns = receive_one_fd(netns_storage_socket[0], MSG_DONTWAIT);
-        if (netns == -EAGAIN) {
+        ns = receive_one_fd(ns_storage_socket[0], MSG_DONTWAIT);
+        if (ns == -EAGAIN) {
                 /* Nothing stored yet, so let's create a new namespace. */
 
-                if (unshare(CLONE_NEWNET) < 0) {
+                if (unshare(nsflag) < 0) {
                         r = -errno;
                         goto fail;
                 }
 
                 (void) loopback_setup();
 
-                netns = open("/proc/self/ns/net", O_RDONLY|O_CLOEXEC|O_NOCTTY);
-                if (netns < 0) {
+                ns_path = strjoina("/proc/self/ns/", ns_name);
+                ns = open(ns_path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                if (ns < 0) {
                         r = -errno;
                         goto fail;
                 }
 
                 r = 1;
 
-        } else if (netns < 0) {
-                r = netns;
+        } else if (ns < 0) {
+                r = ns;
                 goto fail;
 
         } else {
                 /* Yay, found something, so let's join the namespace */
-                if (setns(netns, CLONE_NEWNET) < 0) {
+                if (setns(ns, nsflag) < 0) {
                         r = -errno;
                         goto fail;
                 }
@@ -2560,45 +2596,45 @@ int setup_netns(const int netns_storage_socket[static 2]) {
                 r = 0;
         }
 
-        q = send_one_fd(netns_storage_socket[1], netns, MSG_DONTWAIT);
+        q = send_one_fd(ns_storage_socket[1], ns, MSG_DONTWAIT);
         if (q < 0) {
                 r = q;
                 goto fail;
         }
 
 fail:
-        (void) lockf(netns_storage_socket[0], F_ULOCK, 0);
+        (void) lockf(ns_storage_socket[0], F_ULOCK, 0);
         return r;
 }
 
-int open_netns_path(const int netns_storage_socket[static 2], const char *path) {
-        _cleanup_close_ int netns = -1;
+int open_shareable_ns_path(const int ns_storage_socket[static 2], const char *path, unsigned long nsflag) {
+        _cleanup_close_ int ns = -1;
         int q, r;
 
-        assert(netns_storage_socket);
-        assert(netns_storage_socket[0] >= 0);
-        assert(netns_storage_socket[1] >= 0);
+        assert(ns_storage_socket);
+        assert(ns_storage_socket[0] >= 0);
+        assert(ns_storage_socket[1] >= 0);
         assert(path);
 
-        /* If the storage socket doesn't contain a netns fd yet, open one via the file system and store it in
-         * it. This is supposed to be called ahead of time, i.e. before setup_netns() which will allocate a
-         * new anonymous netns if needed. */
+        /* If the storage socket doesn't contain a ns fd yet, open one via the file system and store it in
+         * it. This is supposed to be called ahead of time, i.e. before setup_shareable_ns() which will
+         * allocate a new anonymous ns if needed. */
 
-        if (lockf(netns_storage_socket[0], F_LOCK, 0) < 0)
+        if (lockf(ns_storage_socket[0], F_LOCK, 0) < 0)
                 return -errno;
 
-        netns = receive_one_fd(netns_storage_socket[0], MSG_DONTWAIT);
-        if (netns == -EAGAIN) {
+        ns = receive_one_fd(ns_storage_socket[0], MSG_DONTWAIT);
+        if (ns == -EAGAIN) {
                 /* Nothing stored yet. Open the file from the file system. */
 
-                netns = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC);
-                if (netns < 0) {
+                ns = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC);
+                if (ns < 0) {
                         r = -errno;
                         goto fail;
                 }
 
-                r = fd_is_network_ns(netns);
-                if (r == 0) { /* Not a netns? Refuse early. */
+                r = fd_is_ns(ns, nsflag);
+                if (r == 0) { /* Not a ns of our type? Refuse early. */
                         r = -EINVAL;
                         goto fail;
                 }
@@ -2607,20 +2643,20 @@ int open_netns_path(const int netns_storage_socket[static 2], const char *path)
 
                 r = 1;
 
-        } else if (netns < 0) {
-                r = netns;
+        } else if (ns < 0) {
+                r = ns;
                 goto fail;
         } else
                 r = 0; /* Already allocated */
 
-        q = send_one_fd(netns_storage_socket[1], netns, MSG_DONTWAIT);
+        q = send_one_fd(ns_storage_socket[1], ns, MSG_DONTWAIT);
         if (q < 0) {
                 r = q;
                 goto fail;
         }
 
 fail:
-        (void) lockf(netns_storage_socket[0], F_ULOCK, 0);
+        (void) lockf(ns_storage_socket[0], F_ULOCK, 0);
         return r;
 }
 
index cb9d5a5d388a193b66547128c71800dbdc24f723..2806db8fd1bf0aace57b52a8d4628f39f77ace16 100644 (file)
@@ -73,6 +73,7 @@ struct NamespaceInfo {
         bool protect_kernel_logs;
         bool mount_apivfs;
         bool protect_hostname;
+        bool private_ipc;
         ProtectHome protect_home;
         ProtectSystem protect_system;
         ProtectProc protect_proc;
@@ -160,8 +161,8 @@ int setup_tmp_dirs(
                 char **tmp_dir,
                 char **var_tmp_dir);
 
-int setup_netns(const int netns_storage_socket[static 2]);
-int open_netns_path(const int netns_storage_socket[static 2], const char *path);
+int setup_shareable_ns(const int ns_storage_socket[static 2], unsigned long nsflag);
+int open_shareable_ns_path(const int netns_storage_socket[static 2], const char *path, unsigned long nsflag);
 
 const char* protect_home_to_string(ProtectHome p) _const_;
 ProtectHome protect_home_from_string(const char *s) _pure_;
index df3ed05cfc6e8e6114af3b6f52dd0c45816dd858..550db4063126337f8e03f1c3ad1c3ba16612441d 100644 (file)
@@ -1621,18 +1621,25 @@ static int control_pid_good(Service *s) {
         return s->control_pid > 0;
 }
 
-static int cgroup_good(Service *s) {
-        int r;
-
+static int cgroup_empty(Service *s) {
         assert(s);
 
-        /* Returns 0 if the cgroup is empty or doesn't exist, > 0 if it is exists and is populated, < 0 if we can't
-         * figure it out */
+        /* Returns 0 if there is no cgroup, > 0 if is empty or doesn't exist, < 0 if we can't figure it out */
 
         if (!UNIT(s)->cgroup_path)
                 return 0;
 
-        r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, UNIT(s)->cgroup_path);
+        return cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, UNIT(s)->cgroup_path);
+}
+
+
+static int cgroup_good(Service *s) {
+        int r;
+
+        /* Returns 0 if the cgroup is empty or doesn't exist, > 0 if it is exists and is populated, < 0 if we can't
+         * figure it out */
+
+        r = cgroup_empty(s);
         if (r < 0)
                 return r;
 
@@ -3398,7 +3405,14 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         else
                 assert_not_reached("Unknown code");
 
-        if (s->main_pid == pid) {
+        /* Services with ExitType=cgroup ignore the main PID for purposes of exit status */
+        if (s->exit_type == SERVICE_EXIT_CGROUP && s->main_pid == pid) {
+                service_unwatch_main_pid(s);
+                s->main_pid_known = false;
+        }
+
+        if ((s->exit_type == SERVICE_EXIT_MAIN && s->main_pid == pid) ||
+            (s->exit_type == SERVICE_EXIT_CGROUP && cgroup_empty(s) && !control_pid_good(s))) {
                 /* Forking services may occasionally move to a new PID.
                  * As long as they update the PID file before exiting the old
                  * PID, they're fine. */
@@ -3431,7 +3445,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
                 unit_log_process_exit(
                                 u,
-                                "Main process",
+                                s->exit_type == SERVICE_EXIT_CGROUP ? "Last process" : "Main process",
                                 service_exec_command_to_string(SERVICE_EXEC_START),
                                 f == SERVICE_SUCCESS,
                                 code, status);
@@ -4448,6 +4462,13 @@ static const char* const service_type_table[_SERVICE_TYPE_MAX] = {
 
 DEFINE_STRING_TABLE_LOOKUP(service_type, ServiceType);
 
+static const char* const service_exit_type_table[_SERVICE_EXIT_TYPE_MAX] = {
+        [SERVICE_EXIT_MAIN] = "main",
+        [SERVICE_EXIT_CGROUP] = "cgroup",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(service_exit_type, ServiceExitType);
+
 static const char* const service_exec_command_table[_SERVICE_EXEC_COMMAND_MAX] = {
         [SERVICE_EXEC_CONDITION] = "ExecCondition",
         [SERVICE_EXEC_START_PRE] = "ExecStartPre",
index af474aa40e90a0ebe6d7aac8a47cfafb987702b9..92c1caf79491131c8fa8fc67af7cc6b0622057c2 100644 (file)
@@ -35,6 +35,13 @@ typedef enum ServiceType {
         _SERVICE_TYPE_INVALID = -EINVAL,
 } ServiceType;
 
+typedef enum ServiceExitType {
+        SERVICE_EXIT_MAIN,    /* we consider the main PID when deciding if the service exited */
+        SERVICE_EXIT_CGROUP,  /* we wait for the last process in the cgroup to exit */
+        _SERVICE_EXIT_TYPE_MAX,
+        _SERVICE_EXIT_TYPE_INVALID = -EINVAL,
+} ServiceExitType;
+
 typedef enum ServiceExecCommand {
         SERVICE_EXEC_CONDITION,
         SERVICE_EXEC_START_PRE,
@@ -97,6 +104,7 @@ struct Service {
         Unit meta;
 
         ServiceType type;
+        ServiceExitType exit_type;
         ServiceRestart restart;
         ExitStatusSet restart_prevent_status;
         ExitStatusSet restart_force_status;
@@ -226,6 +234,9 @@ ServiceRestart service_restart_from_string(const char *s) _pure_;
 const char* service_type_to_string(ServiceType i) _const_;
 ServiceType service_type_from_string(const char *s) _pure_;
 
+const char* service_exit_type_to_string(ServiceExitType i) _const_;
+ServiceExitType service_exit_type_from_string(const char *s) _pure_;
+
 const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
 ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
 
index e9cacfdf3a237a264587c0e0f4f3a64f403b0a03..016986401bc10fa9925b66fa9b5e17093d5dbb0e 100644 (file)
@@ -99,7 +99,7 @@ static void socket_init(Unit *u) {
         s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
 
         s->trigger_limit.interval = USEC_INFINITY;
-        s->trigger_limit.burst = (unsigned) -1;
+        s->trigger_limit.burst = UINT_MAX;
 }
 
 static void socket_unwatch_control_pid(Socket *s) {
@@ -313,7 +313,7 @@ static int socket_add_extras(Socket *s) {
         if (s->trigger_limit.interval == USEC_INFINITY)
                 s->trigger_limit.interval = 2 * USEC_PER_SEC;
 
-        if (s->trigger_limit.burst == (unsigned) -1) {
+        if (s->trigger_limit.burst == UINT_MAX) {
                 if (s->accept)
                         s->trigger_limit.burst = 200;
                 else
@@ -1547,11 +1547,19 @@ static int socket_address_listen_in_cgroup(
         if (s->exec_context.network_namespace_path &&
             s->exec_runtime &&
             s->exec_runtime->netns_storage_socket[0] >= 0) {
-                r = open_netns_path(s->exec_runtime->netns_storage_socket, s->exec_context.network_namespace_path);
+                r = open_shareable_ns_path(s->exec_runtime->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
                 if (r < 0)
                         return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
         }
 
+        if (s->exec_context.ipc_namespace_path &&
+            s->exec_runtime &&
+            s->exec_runtime->ipcns_storage_socket[0] >= 0) {
+                r = open_shareable_ns_path(s->exec_runtime->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
+                if (r < 0)
+                        return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
+        }
+
         if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
                 return log_unit_error_errno(UNIT(s), errno, "Failed to create communication channel: %m");
 
@@ -1568,7 +1576,7 @@ static int socket_address_listen_in_cgroup(
                     s->exec_runtime->netns_storage_socket[0] >= 0) {
 
                         if (ns_type_supported(NAMESPACE_NET)) {
-                                r = setup_netns(s->exec_runtime->netns_storage_socket);
+                                r = setup_shareable_ns(s->exec_runtime->netns_storage_socket, CLONE_NEWNET);
                                 if (r < 0) {
                                         log_unit_error_errno(UNIT(s), r, "Failed to join network namespace: %m");
                                         _exit(EXIT_NETWORK);
index b8805b02fa365b5d1a982a2cfd2ee89fc2bcf383..fa6fb690c7806a11348de5573089e1469e62f253 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/system.conf' to display the full config.
+#
 # See systemd-system.conf(5) for details.
 
 [Manager]
index d7388e2367a3967b49eb6f409016b7eaf3a40217..1d3cf8f1fc61c4eafb5bb2bb7045b95c181c2715 100644 (file)
@@ -405,7 +405,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi
                                    j->unit->id,
                                    unit_id == array ? "ordering cycle" : "dependency",
                                    *unit_id, *job_type,
-                                   unit_ids);
+                                   "%s", unit_ids);
 
                 if (delete) {
                         const char *status;
@@ -414,7 +414,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi
                                    "MESSAGE=%s: Job %s/%s deleted to break ordering cycle starting with %s/%s",
                                    j->unit->id, delete->unit->id, job_type_to_string(delete->type),
                                    j->unit->id, job_type_to_string(j->type),
-                                   unit_ids);
+                                   "%s", unit_ids);
 
                         if (log_get_show_color())
                                 status = ANSI_HIGHLIGHT_RED " SKIP " ANSI_NORMAL;
@@ -432,7 +432,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi
                 log_struct(LOG_ERR,
                            "MESSAGE=%s: Unable to break cycle starting with %s/%s",
                            j->unit->id, j->unit->id, job_type_to_string(j->type),
-                           unit_ids);
+                           "%s", unit_ids);
 
                 return sd_bus_error_setf(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC,
                                          "Transaction order is cyclic. See system logs for details.");
index d20df847e8edd9af84e133c0ec46c4bfeb85aa5d..95c3fca66186e5f5a1852e6ba59cbcfc9bc2f8c4 100644 (file)
@@ -66,7 +66,7 @@ static int uid_from_file_name(const char *filename, uid_t *uid) {
 }
 
 static bool vacuum_necessary(int fd, uint64_t sum, uint64_t keep_free, uint64_t max_use) {
-        uint64_t fs_size = 0, fs_free = (uint64_t) -1;
+        uint64_t fs_size = 0, fs_free = UINT64_MAX;
         struct statvfs sv;
 
         assert(fd >= 0);
@@ -76,7 +76,7 @@ static bool vacuum_necessary(int fd, uint64_t sum, uint64_t keep_free, uint64_t
                 fs_free = sv.f_frsize * sv.f_bfree;
         }
 
-        if (max_use == (uint64_t) -1) {
+        if (max_use == UINT64_MAX) {
 
                 if (fs_size > 0) {
                         max_use = PAGE_ALIGN(fs_size / 10); /* 10% */
@@ -94,7 +94,7 @@ static bool vacuum_necessary(int fd, uint64_t sum, uint64_t keep_free, uint64_t
         if (max_use > 0 && sum > max_use)
                 return true;
 
-        if (keep_free == (uint64_t) -1) {
+        if (keep_free == UINT64_MAX) {
 
                 if (fs_size > 0) {
                         keep_free = PAGE_ALIGN((fs_size * 3) / 20); /* 15% */
index c727cddba42c0c8935114f8ac205eb4b0129231d..2fb2404500e88c026241b69ad03c71178ac831e8 100644 (file)
@@ -141,8 +141,8 @@ static bool arg_compress = true;
 static uint64_t arg_process_size_max = PROCESS_SIZE_MAX;
 static uint64_t arg_external_size_max = EXTERNAL_SIZE_MAX;
 static uint64_t arg_journal_size_max = JOURNAL_SIZE_MAX;
-static uint64_t arg_keep_free = (uint64_t) -1;
-static uint64_t arg_max_use = (uint64_t) -1;
+static uint64_t arg_keep_free = UINT64_MAX;
+static uint64_t arg_max_use = UINT64_MAX;
 
 static int parse_config(void) {
         static const ConfigTableItem items[] = {
@@ -1125,23 +1125,23 @@ static int gather_pid_metadata(struct iovec_wrapper *iovw, Context *context) {
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_OPEN_FDS=", t);
 
         p = procfs_file_alloca(pid, "status");
-        if (read_full_file(p, &t, NULL) >= 0)
+        if (read_full_virtual_file(p, &t, NULL) >= 0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_STATUS=", t);
 
         p = procfs_file_alloca(pid, "maps");
-        if (read_full_file(p, &t, NULL) >= 0)
+        if (read_full_virtual_file(p, &t, NULL) >= 0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_MAPS=", t);
 
         p = procfs_file_alloca(pid, "limits");
-        if (read_full_file(p, &t, NULL) >= 0)
+        if (read_full_virtual_file(p, &t, NULL) >= 0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_LIMITS=", t);
 
         p = procfs_file_alloca(pid, "cgroup");
-        if (read_full_file(p, &t, NULL) >=0)
+        if (read_full_virtual_file(p, &t, NULL) >=0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_CGROUP=", t);
 
         p = procfs_file_alloca(pid, "mountinfo");
-        if (read_full_file(p, &t, NULL) >=0)
+        if (read_full_virtual_file(p, &t, NULL) >=0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_MOUNTINFO=", t);
 
         if (get_process_cwd(pid, &t) >= 0)
index 738c45bed25af9a7200eda60acf394755ee85394..56c100824524185386bc7c40de63286e06e309d8 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/coredump.conf' to display the full config.
+#
 # See coredump.conf(5) for details.
 
 [Coredump]
index 5364169c4ff904a8036057b46b404995dabd6d65..0c4ef2e123486216213435956539b90482b4454c 100644 (file)
@@ -563,6 +563,7 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
                 RETRIEVE(d, l, "COREDUMP_EXE", exe);
                 RETRIEVE(d, l, "COREDUMP_COMM", comm);
                 RETRIEVE(d, l, "COREDUMP_CMDLINE", cmdline);
+                RETRIEVE(d, l, "COREDUMP_HOSTNAME", hostname);
                 RETRIEVE(d, l, "COREDUMP_UNIT", unit);
                 RETRIEVE(d, l, "COREDUMP_USER_UNIT", user_unit);
                 RETRIEVE(d, l, "COREDUMP_SESSION", session);
@@ -575,7 +576,6 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
                 RETRIEVE(d, l, "COREDUMP", coredump);
                 RETRIEVE(d, l, "_BOOT_ID", boot_id);
                 RETRIEVE(d, l, "_MACHINE_ID", machine_id);
-                RETRIEVE(d, l, "_HOSTNAME", hostname);
                 RETRIEVE(d, l, "MESSAGE", message);
         }
 
@@ -1078,8 +1078,10 @@ static int run_debug(int argc, char **argv, void *userdata) {
         if (r < 0)
                 return r;
 
-        print_info(stdout, j, false);
-        fputs("\n", stdout);
+        if (!arg_quiet) {
+                print_info(stdout, j, false);
+                fputs("\n", stdout);
+        }
 
         r = sd_journal_get_data(j, "COREDUMP_EXE", (const void**) &data, &len);
         if (r < 0)
@@ -1114,7 +1116,7 @@ static int run_debug(int argc, char **argv, void *userdata) {
 
         fork_name = strjoina("(", debugger_call[0], ")");
 
-        r = safe_fork(fork_name, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_RLIMIT_NOFILE_SAFE|FORK_LOG, &pid);
+        r = safe_fork(fork_name, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_RLIMIT_NOFILE_SAFE|FORK_LOG|FORK_FLUSH_STDIO, &pid);
         if (r < 0)
                 goto finish;
         if (r == 0) {
index ac212ea23b885085d79094b6bcb8ba2717edd4ea..840884d961220a631f5c142e8f663221802eb2cc 100644 (file)
@@ -6,7 +6,7 @@
 
 int main(int argc, char *argv[]) {
 
-        if (coredump_vacuum(-1, (uint64_t) -1, 70 * 1024) < 0)
+        if (coredump_vacuum(-1, UINT64_MAX, 70 * 1024) < 0)
                 return EXIT_FAILURE;
 
         return EXIT_SUCCESS;
index b58f3a2e7fc024028c821fb7f2ebfeceb233f0f7..9c1478c474e34a1476c1112277a5caf0d89b27f0 100644 (file)
@@ -42,7 +42,7 @@ static int search_policy_hash(
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "TPM2 token data lacks 'tpm2-policy-hash' field.");
 
-                r = unhexmem(json_variant_string(w), (size_t) -1, &thash, &thash_size);
+                r = unhexmem(json_variant_string(w), SIZE_MAX, &thash, &thash_size);
                 if (r < 0)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "Invalid base64 data in 'tpm2-policy-hash' field.");
index 623a52fa0b005900aaab631a53807e1d1fafd178..dfdb964360a7998e9cecfc527726641dc3c35b6e 100644 (file)
@@ -138,7 +138,7 @@ int find_fido2_auto_data(
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "FIDO2 token data lacks 'fido2-credential' field.");
 
-                r = unbase64mem(json_variant_string(w), (size_t) -1, &cid, &cid_size);
+                r = unbase64mem(json_variant_string(w), SIZE_MAX, &cid, &cid_size);
                 if (r < 0)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "Invalid base64 data in 'fido2-credential' field.");
@@ -150,7 +150,7 @@ int find_fido2_auto_data(
 
                 assert(!salt);
                 assert(salt_size == 0);
-                r = unbase64mem(json_variant_string(w), (size_t) -1, &salt, &salt_size);
+                r = unbase64mem(json_variant_string(w), SIZE_MAX, &salt, &salt_size);
                 if (r < 0)
                         return log_error_errno(r, "Failed to decode base64 encoded salt.");
 
index 74f739b5139e8116833f940cb4cd6f39d5df4a1f..98c8408da54526e45577374ba803f3ed1f6d1e5a 100644 (file)
@@ -301,7 +301,9 @@ static int create_disk(
         netdev = fstab_test_option(options, "_netdev\0");
         attach_in_initrd = fstab_test_option(options, "x-initrd.attach\0");
 
-        keyfile_can_timeout = fstab_filter_options(options, "keyfile-timeout\0", NULL, &keyfile_timeout_value, NULL);
+        keyfile_can_timeout = fstab_filter_options(options,
+                                                   "keyfile-timeout\0",
+                                                   NULL, &keyfile_timeout_value, NULL, NULL);
         if (keyfile_can_timeout < 0)
                 return log_error_errno(keyfile_can_timeout, "Failed to parse keyfile-timeout= option value: %m");
 
@@ -310,11 +312,12 @@ static int create_disk(
                 "header\0",
                 NULL,
                 &header_path,
+                NULL,
                 headerdev ? &filtered_header : NULL);
         if (detached_header < 0)
                 return log_error_errno(detached_header, "Failed to parse header= option value: %m");
 
-        tmp = fstab_filter_options(options, "tmp\0", NULL, &tmp_fstype, NULL);
+        tmp = fstab_filter_options(options, "tmp\0", NULL, &tmp_fstype, NULL, NULL);
         if (tmp < 0)
                 return log_error_errno(tmp, "Failed to parse tmp= option value: %m");
 
@@ -602,7 +605,7 @@ static int filter_header_device(const char *options,
         assert(ret_headerdev);
         assert(ret_filtered_headerdev_options);
 
-        r = fstab_filter_options(options, "header\0", NULL, &headerspec, &filtered_headerspec);
+        r = fstab_filter_options(options, "header\0", NULL, &headerspec, NULL, &filtered_headerspec);
         if (r < 0)
                 return log_error_errno(r, "Failed to parse header= option value: %m");
 
index a005b62cafb9c04fca8c0c8d03525dfa3e72b2ad..8d7d74fb75b1294725db55248dfaa8be9d88bc57 100644 (file)
@@ -214,7 +214,7 @@ int find_pkcs11_auto_data(
 
                 assert(!key);
                 assert(key_size == 0);
-                r = unbase64mem(json_variant_string(w), (size_t) -1, &key, &key_size);
+                r = unbase64mem(json_variant_string(w), SIZE_MAX, &key, &key_size);
                 if (r < 0)
                         return log_error_errno(r, "Failed to decode base64 encoded key.");
 
index c22f63d973e5074f1010a03fbccd6b3704dee93e..4757c5882d0e3becbfe14e36e04738809062dc9a 100644 (file)
@@ -125,7 +125,7 @@ int find_tpm2_auto_data(
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "TPM2 token data lacks 'tpm2-blob' field.");
 
-                r = unbase64mem(json_variant_string(w), (size_t) -1, &blob, &blob_size);
+                r = unbase64mem(json_variant_string(w), SIZE_MAX, &blob, &blob_size);
                 if (r < 0)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "Invalid base64 data in 'tpm2-blob' field.");
@@ -136,7 +136,7 @@ int find_tpm2_auto_data(
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "TPM2 token data lacks 'tpm2-policy-hash' field.");
 
-                r = unhexmem(json_variant_string(w), (size_t) -1, &policy_hash, &policy_hash_size);
+                r = unhexmem(json_variant_string(w), SIZE_MAX, &policy_hash, &policy_hash_size);
                 if (r < 0)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                "Invalid base64 data in 'tpm2-policy-hash' field.");
index 65e328389dcfb4ef20bf6bb5daabf844f45cf519..dba26a54a3f15faa45c1d82e557bb31f5e52088b 100644 (file)
@@ -320,7 +320,7 @@ static int parse_one_option(const char *option) {
                         _cleanup_free_ void *cid = NULL;
                         size_t cid_size;
 
-                        r = unbase64mem(val, (size_t) -1, &cid, &cid_size);
+                        r = unbase64mem(val, SIZE_MAX, &cid, &cid_size);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to decode FIDO2 CID data: %m");
 
@@ -1503,10 +1503,9 @@ static int run(int argc, char *argv[]) {
 
                 flags = determine_flags();
 
-                if (arg_timeout == USEC_INFINITY)
+                until = usec_add(now(CLOCK_MONOTONIC), arg_timeout);
+                if (until == USEC_INFINITY)
                         until = 0;
-                else
-                        until = now(CLOCK_MONOTONIC) + arg_timeout;
 
                 arg_key_size = (arg_key_size > 0 ? arg_key_size : (256 / 8));
 
index 85102d3efa4ce28d7b9182956d3411848a93fe8a..cb96a57abee41b6987c1f0c7ef0a022307bc2a05 100644 (file)
@@ -627,11 +627,11 @@ static int action_copy(DissectedImage *m, LoopDevice *d) {
 
                 /* Copying to stdout? */
                 if (streq(arg_target, "-")) {
-                        r = copy_bytes(source_fd, STDOUT_FILENO, (uint64_t) -1, COPY_REFLINK);
+                        r = copy_bytes(source_fd, STDOUT_FILENO, UINT64_MAX, COPY_REFLINK);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to copy bytes from %s in mage '%s' to stdout: %m", arg_source, arg_image);
 
-                        /* When we copy to stdou we don't copy any attributes (i.e. no access mode, no ownership, no xattr, no times) */
+                        /* When we copy to stdout we don't copy any attributes (i.e. no access mode, no ownership, no xattr, no times) */
                         return 0;
                 }
 
@@ -653,7 +653,7 @@ static int action_copy(DissectedImage *m, LoopDevice *d) {
                 if (target_fd < 0)
                         return log_error_errno(errno, "Failed to create regular file at target path '%s': %m", arg_target);
 
-                r = copy_bytes(source_fd, target_fd, (uint64_t) -1, COPY_REFLINK);
+                r = copy_bytes(source_fd, target_fd, UINT64_MAX, COPY_REFLINK);
                 if (r < 0)
                         return log_error_errno(r, "Failed to copy bytes from %s in mage '%s' to '%s': %m", arg_source, arg_image, arg_target);
 
@@ -684,7 +684,7 @@ static int action_copy(DissectedImage *m, LoopDevice *d) {
                         if (target_fd < 0)
                                 return log_error_errno(errno, "Failed to open target file '%s': %m", arg_target);
 
-                        r = copy_bytes(STDIN_FILENO, target_fd, (uint64_t) -1, COPY_REFLINK);
+                        r = copy_bytes(STDIN_FILENO, target_fd, UINT64_MAX, COPY_REFLINK);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to copy bytes from stdin to '%s' in image '%s': %m", arg_target, arg_image);
 
@@ -722,7 +722,7 @@ static int action_copy(DissectedImage *m, LoopDevice *d) {
                 if (target_fd < 0)
                         return log_error_errno(errno, "Failed to open target file '%s': %m", arg_target);
 
-                r = copy_bytes(source_fd, target_fd, (uint64_t) -1, COPY_REFLINK);
+                r = copy_bytes(source_fd, target_fd, UINT64_MAX, COPY_REFLINK);
                 if (r < 0)
                         return log_error_errno(r, "Failed to copy bytes from '%s' to '%s' in image '%s': %m", arg_source, arg_target, arg_image);
 
index c0e88e7915d5d96b72636d2291769b3e2477470f..8e3028717e79dbccc4d07acb3e93d9e331befabb 100644 (file)
@@ -675,7 +675,7 @@ static int write_root_passwd(const char *passwd_path, const char *password, cons
         if (original) {
                 struct passwd *i;
 
-                r = sync_rights(fileno(original), fileno(passwd));
+                r = copy_rights(fileno(original), fileno(passwd));
                 if (r < 0)
                         return r;
 
@@ -743,7 +743,7 @@ static int write_root_shadow(const char *shadow_path, const char *hashed_passwor
         if (original) {
                 struct spwd *i;
 
-                r = sync_rights(fileno(original), fileno(shadow));
+                r = copy_rights(fileno(original), fileno(shadow));
                 if (r < 0)
                         return r;
 
@@ -771,7 +771,7 @@ static int write_root_shadow(const char *shadow_path, const char *hashed_passwor
                         .sp_warn = -1,
                         .sp_inact = -1,
                         .sp_expire = -1,
-                        .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
+                        .sp_flag = ULONG_MAX, /* this appears to be what everybody does ... */
                 };
 
                 if (errno != ENOENT)
index 6df7fa532899792c43cc6965f69adfe5fffbed14..8c1087a9a33b1d0fe9800ff869dd3e52e42bc574 100644 (file)
@@ -200,7 +200,7 @@ static int write_timeout(
         usec_t u;
         int r;
 
-        r = fstab_filter_options(opts, filter, NULL, &timeout, NULL);
+        r = fstab_filter_options(opts, filter, NULL, &timeout, NULL, NULL);
         if (r < 0)
                 return log_warning_errno(r, "Failed to parse options: %m");
         if (r == 0)
@@ -241,7 +241,7 @@ static int write_dependency(
         assert(f);
         assert(opts);
 
-        r = fstab_extract_values(opts, filter, &names);
+        r = fstab_filter_options(opts, filter, NULL, NULL, &names, NULL);
         if (r < 0)
                 return log_warning_errno(r, "Failed to parse options: %m");
         if (r == 0)
@@ -274,17 +274,17 @@ static int write_dependency(
 
 static int write_after(FILE *f, const char *opts) {
         return write_dependency(f, opts,
-                                "x-systemd.after", "After=%1$s\n");
+                                "x-systemd.after\0", "After=%1$s\n");
 }
 
 static int write_requires_after(FILE *f, const char *opts) {
         return write_dependency(f, opts,
-                                "x-systemd.requires", "After=%1$s\nRequires=%1$s\n");
+                                "x-systemd.requires\0", "After=%1$s\nRequires=%1$s\n");
 }
 
 static int write_before(FILE *f, const char *opts) {
         return write_dependency(f, opts,
-                                "x-systemd.before", "Before=%1$s\n");
+                                "x-systemd.before\0", "Before=%1$s\n");
 }
 
 static int write_requires_mounts_for(FILE *f, const char *opts) {
@@ -295,7 +295,7 @@ static int write_requires_mounts_for(FILE *f, const char *opts) {
         assert(f);
         assert(opts);
 
-        r = fstab_extract_values(opts, "x-systemd.requires-mounts-for", &paths);
+        r = fstab_filter_options(opts, "x-systemd.requires-mounts-for\0", NULL, NULL, &paths, NULL);
         if (r < 0)
                 return log_warning_errno(r, "Failed to parse options: %m");
         if (r == 0)
@@ -376,11 +376,11 @@ static int add_mount(
             mount_point_ignore(where))
                 return 0;
 
-        r = fstab_extract_values(opts, "x-systemd.wanted-by", &wanted_by);
+        r = fstab_filter_options(opts, "x-systemd.wanted-by\0", NULL, NULL, &wanted_by, NULL);
         if (r < 0)
                 return r;
 
-        r = fstab_extract_values(opts, "x-systemd.required-by", &required_by);
+        r = fstab_filter_options(opts, "x-systemd.required-by\0", NULL, NULL, &required_by, NULL);
         if (r < 0)
                 return r;
 
@@ -423,7 +423,7 @@ static int add_mount(
                  * mount.nfs (so systemd can manage the job-control aspects of 'bg'),
                  * we need to explicitly preserve that default, and also ensure
                  * the systemd mount-timeout doesn't interfere.
-                 * By placing these options first, they can be over-ridden by
+                 * By placing these options first, they can be overridden by
                  * settings in /etc/fstab. */
                 opts = strjoina("x-systemd.mount-timeout=infinity,retry=10000,nofail,", opts, ",fg");
                 SET_FLAG(flags, NOFAIL, true);
@@ -611,11 +611,11 @@ static int parse_fstab(bool initrd) {
                          * /etc/fstab. So we canonicalize here. Note that we use CHASE_NONEXISTENT to handle the case
                          * where a symlink refers to another mount target; this works assuming the sub-mountpoint
                          * target is the final directory. */
-                        r = chase_symlinks(where, initrd ? "/sysroot" : NULL,
+                        k = chase_symlinks(where, initrd ? "/sysroot" : NULL,
                                            CHASE_PREFIX_ROOT | CHASE_NONEXISTENT,
                                            &canonical_where, NULL);
-                        if (r < 0) /* If we can't canonicalize we continue on as if it wasn't a symlink */
-                                log_debug_errno(r, "Failed to read symlink target for %s, ignoring: %m", where);
+                        if (k < 0) /* If we can't canonicalize we continue on as if it wasn't a symlink */
+                                log_debug_errno(k, "Failed to read symlink target for %s, ignoring: %m", where);
                         else if (streq(canonical_where, where)) /* If it was fully canonicalized, suppress the change */
                                 canonical_where = mfree(canonical_where);
                         else
@@ -699,9 +699,9 @@ static int add_sysroot_mount(void) {
                 if (!what)
                         return log_oom();
 
-                fstype = arg_root_fstype ?: "tmpfs"; /* tmpfs, unless overriden */
+                fstype = arg_root_fstype ?: "tmpfs"; /* tmpfs, unless overridden */
 
-                default_rw = true; /* writable, unless overriden */;
+                default_rw = true; /* writable, unless overridden */;
         } else {
 
                 what = fstab_node_to_udev_node(arg_root_what);
@@ -710,7 +710,7 @@ static int add_sysroot_mount(void) {
 
                 fstype = arg_root_fstype; /* if not specified explicitly, don't default to anything here */
 
-                default_rw = false; /* read-only, unless overriden */
+                default_rw = false; /* read-only, unless overridden */
         }
 
         if (!arg_root_options)
index c39db5d59d0083d4497121e7d8de440f9b5844c6..cf70424c16242f4fcd93322730222a971842e569 100644 (file)
@@ -1,9 +1,11 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include "alloc-util.h"
-#include "log.h"
 #include "fileio.h"
 #include "fuzz.h"
+#include "log.h"
+#include "parse-util.h"
+#include "string-util.h"
 #include "tests.h"
 
 /* This is a test driver for the systemd fuzzers that provides main function
 /* This one was borrowed from
  * https://github.com/google/oss-fuzz/blob/646fca1b506b056db3a60d32c4a1a7398f171c94/infra/base-images/base-runner/bad_build_check#L19
  */
-#define MIN_NUMBER_OF_RUNS 4
+#define NUMBER_OF_RUNS 4
 
 int main(int argc, char **argv) {
         int r;
 
         test_setup_logging(LOG_DEBUG);
 
+        unsigned number_of_runs = NUMBER_OF_RUNS;
+
+        const char *v = getenv("SYSTEMD_FUZZ_RUNS");
+        if (!isempty(v)) {
+                r = safe_atou(v, &number_of_runs);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse SYSTEMD_FUZZ_RUNS=%s: %m", v);
+        }
+
         for (int i = 1; i < argc; i++) {
                 _cleanup_free_ char *buf = NULL;
                 size_t size;
@@ -35,7 +46,7 @@ int main(int argc, char **argv) {
                 }
                 printf("%s... ", name);
                 fflush(stdout);
-                for (int j = 0; j < MIN_NUMBER_OF_RUNS; j++)
+                for (unsigned j = 0; j < number_of_runs; j++)
                         if (LLVMFuzzerTestOneInput((uint8_t*)buf, size) == EXIT_TEST_SKIP)
                                 return EXIT_TEST_SKIP;
                 printf("ok\n");
index 96528a191d1bcc32b9b989260afafc1a86a802b7..1ed1dd82518ea0860a7330d60c14686601d870b1 100644 (file)
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
 fuzzers += [
-        [['src/fuzz/fuzz-bus-message.c']],
-
         [['src/fuzz/fuzz-catalog.c']],
 
         [['src/fuzz/fuzz-json.c']],
index d59dfb1f609dbe40d129d84d828b0f2bd80c4150..9d12b9abae528ff5d36d4d26cf6704a83d6e18a2 100644 (file)
@@ -171,7 +171,7 @@ static int list_homes(int argc, char *argv[], void *userdata) {
                 return bus_log_parse_error(r);
 
         if (table_get_rows(table) > 1 || !FLAGS_SET(arg_json_format_flags, JSON_FORMAT_OFF)) {
-                r = table_set_sort(table, (size_t) 0, (size_t) -1);
+                r = table_set_sort(table, (size_t) 0);
                 if (r < 0)
                         return table_log_sort_error(r);
 
index 5643a9a6e43981b7f14c53b5775f1c45c48b27dd..2a58ecbc1a84b3f5f950abb0dba7e5dcb0e35a6f 100644 (file)
@@ -885,7 +885,7 @@ static int on_deferred_change(sd_event_source *s, void *userdata) {
 
         assert(h);
 
-        h->deferred_change_event_source = sd_event_source_unref(h->deferred_change_event_source);
+        h->deferred_change_event_source = sd_event_source_disable_unref(h->deferred_change_event_source);
 
         r = bus_home_path(h, &path);
         if (r < 0) {
index f1db828ed0e2ce40334c8e8976ef23a52daae553..b0c5ce4232a6b6429f443b7910a707d773316c70 100644 (file)
@@ -188,17 +188,17 @@ Home *home_free(Home *h) {
         user_record_unref(h->record);
         user_record_unref(h->secret);
 
-        h->worker_event_source = sd_event_source_unref(h->worker_event_source);
+        h->worker_event_source = sd_event_source_disable_unref(h->worker_event_source);
         safe_close(h->worker_stdout_fd);
         free(h->user_name);
         free(h->sysfs);
 
-        h->ref_event_source_please_suspend = sd_event_source_unref(h->ref_event_source_please_suspend);
-        h->ref_event_source_dont_suspend = sd_event_source_unref(h->ref_event_source_dont_suspend);
+        h->ref_event_source_please_suspend = sd_event_source_disable_unref(h->ref_event_source_please_suspend);
+        h->ref_event_source_dont_suspend = sd_event_source_disable_unref(h->ref_event_source_dont_suspend);
 
         h->pending_operations = ordered_set_free(h->pending_operations);
-        h->pending_event_source = sd_event_source_unref(h->pending_event_source);
-        h->deferred_change_event_source = sd_event_source_unref(h->deferred_change_event_source);
+        h->pending_event_source = sd_event_source_disable_unref(h->pending_event_source);
+        h->deferred_change_event_source = sd_event_source_disable_unref(h->deferred_change_event_source);
 
         h->current_operation = operation_unref(h->current_operation);
 
@@ -888,7 +888,7 @@ static int home_on_worker_process(sd_event_source *s, const siginfo_t *si, void
         (void) hashmap_remove_value(h->manager->homes_by_worker_pid, PID_TO_PTR(h->worker_pid), h);
 
         h->worker_pid = 0;
-        h->worker_event_source = sd_event_source_unref(h->worker_event_source);
+        h->worker_event_source = sd_event_source_disable_unref(h->worker_event_source);
 
         if (si->si_code != CLD_EXITED) {
                 assert(IN_SET(si->si_code, CLD_KILLED, CLD_DUMPED));
@@ -1007,7 +1007,7 @@ static int home_start_work(Home *h, const char *verb, UserRecord *hr, UserRecord
 
         r = safe_fork_full("(sd-homework)",
                            (int[]) { stdin_fd, stdout_fd }, 2,
-                           FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG, &pid);
+                           FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_REOPEN_LOG, &pid);
         if (r < 0)
                 return r;
         if (r == 0) {
@@ -1067,7 +1067,7 @@ static int home_start_work(Home *h, const char *verb, UserRecord *hr, UserRecord
 
         r = hashmap_put(h->manager->homes_by_worker_pid, PID_TO_PTR(pid), h);
         if (r < 0) {
-                h->worker_event_source = sd_event_source_unref(h->worker_event_source);
+                h->worker_event_source = sd_event_source_disable_unref(h->worker_event_source);
                 return r;
         }
 
@@ -1838,7 +1838,9 @@ int home_killall(Home *h) {
         assert(h->uid > 0); /* We never should be UID 0 */
 
         /* Let's kill everything matching the specified UID */
-        r = safe_fork("(sd-killer)", FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_WAIT|FORK_LOG, NULL);
+        r = safe_fork("(sd-killer)",
+                      FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_WAIT|FORK_LOG|FORK_REOPEN_LOG,
+                      NULL);
         if (r < 0)
                 return r;
         if (r == 0) {
index d3ac98f901ce355f77b08cbc131371257bc3177e..8a06bb62bf76cae80bffee9b61028f0e73bfa071 100644 (file)
@@ -860,7 +860,7 @@ static int on_deferred_auto_login(sd_event_source *s, void *userdata) {
 
         assert(m);
 
-        m->deferred_auto_login_event_source = sd_event_source_unref(m->deferred_auto_login_event_source);
+        m->deferred_auto_login_event_source = sd_event_source_disable_unref(m->deferred_auto_login_event_source);
 
         r = sd_bus_emit_properties_changed(
                         m->bus,
index f0c844b0cb0bfdc2e11dd0dd79d586bf8b83e9ec..85fdc88962c6c8a0772044fe176e6d9b189a1085 100644 (file)
@@ -79,7 +79,7 @@ static void manager_watch_home(Manager *m) {
 
         assert(m);
 
-        m->inotify_event_source = sd_event_source_unref(m->inotify_event_source);
+        m->inotify_event_source = sd_event_source_disable_unref(m->inotify_event_source);
         m->scan_slash_home = false;
 
         if (statfs("/home/", &sfs) < 0) {
@@ -100,7 +100,9 @@ static void manager_watch_home(Manager *m) {
 
         m->scan_slash_home = true;
 
-        r = sd_event_add_inotify(m->event, &m->inotify_event_source, "/home/", IN_CREATE|IN_CLOSE_WRITE|IN_DELETE_SELF|IN_MOVE_SELF|IN_ONLYDIR|IN_MOVED_TO|IN_MOVED_FROM|IN_DELETE, on_home_inotify, m);
+        r = sd_event_add_inotify(m->event, &m->inotify_event_source, "/home/",
+                                 IN_CREATE|IN_CLOSE_WRITE|IN_DELETE_SELF|IN_MOVE_SELF|IN_ONLYDIR|IN_MOVED_TO|IN_MOVED_FROM|IN_DELETE,
+                                 on_home_inotify, m);
         if (r < 0)
                 log_full_errno(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, r,
                                "Failed to create inotify watch on /home/, ignoring.");
@@ -239,25 +241,24 @@ Manager* manager_free(Manager *m) {
         HASHMAP_FOREACH(h, m->homes_by_worker_pid)
                 (void) home_wait_for_worker(h);
 
-        hashmap_free(m->homes_by_uid);
-        hashmap_free(m->homes_by_name);
-        hashmap_free(m->homes_by_worker_pid);
-        hashmap_free(m->homes_by_sysfs);
-
-        m->inotify_event_source = sd_event_source_unref(m->inotify_event_source);
-
-        bus_verify_polkit_async_registry_free(m->polkit_registry);
-
         sd_bus_flush_close_unref(m->bus);
-        sd_event_unref(m->event);
+        bus_verify_polkit_async_registry_free(m->polkit_registry);
 
-        m->notify_socket_event_source = sd_event_source_unref(m->notify_socket_event_source);
         m->device_monitor = sd_device_monitor_unref(m->device_monitor);
 
+        m->inotify_event_source = sd_event_source_unref(m->inotify_event_source);
+        m->notify_socket_event_source = sd_event_source_unref(m->notify_socket_event_source);
         m->deferred_rescan_event_source = sd_event_source_unref(m->deferred_rescan_event_source);
         m->deferred_gc_event_source = sd_event_source_unref(m->deferred_gc_event_source);
         m->deferred_auto_login_event_source = sd_event_source_unref(m->deferred_auto_login_event_source);
 
+        sd_event_unref(m->event);
+
+        hashmap_free(m->homes_by_uid);
+        hashmap_free(m->homes_by_name);
+        hashmap_free(m->homes_by_worker_pid);
+        hashmap_free(m->homes_by_sysfs);
+
         if (m->private_key)
                 EVP_PKEY_free(m->private_key);
 
@@ -368,7 +369,9 @@ static int manager_add_home_by_record(
                 return r;
 
         if (!streq_ptr(hr->user_name, name))
-                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Identity's user name %s does not match file name %s, refusing.", hr->user_name, name);
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "Identity's user name %s does not match file name %s, refusing.",
+                                       hr->user_name, name);
 
         is_signed = manager_verify_user_record(m, hr);
         switch (is_signed) {
@@ -599,19 +602,22 @@ static int manager_acquire_uid(
 
                 other = hashmap_get(m->homes_by_uid, UID_TO_PTR(candidate));
                 if (other) {
-                        log_debug("Candidate UID " UID_FMT " already used by another home directory (%s), let's try another.", candidate, other->user_name);
+                        log_debug("Candidate UID " UID_FMT " already used by another home directory (%s), let's try another.",
+                                  candidate, other->user_name);
                         continue;
                 }
 
                 pw = getpwuid(candidate);
                 if (pw) {
-                        log_debug("Candidate UID " UID_FMT " already registered by another user in NSS (%s), let's try another.", candidate, pw->pw_name);
+                        log_debug("Candidate UID " UID_FMT " already registered by another user in NSS (%s), let's try another.",
+                                  candidate, pw->pw_name);
                         continue;
                 }
 
                 gr = getgrgid((gid_t) candidate);
                 if (gr) {
-                        log_debug("Candidate UID " UID_FMT " already registered by another group in NSS (%s), let's try another.", candidate, gr->gr_name);
+                        log_debug("Candidate UID " UID_FMT " already registered by another group in NSS (%s), let's try another.",
+                                  candidate, gr->gr_name);
                         continue;
                 }
 
@@ -619,7 +625,8 @@ static int manager_acquire_uid(
                 if (r < 0)
                         continue;
                 if (r > 0) {
-                        log_debug_errno(r, "Candidate UID " UID_FMT " already owns IPC objects, let's try another: %m", candidate);
+                        log_debug_errno(r, "Candidate UID " UID_FMT " already owns IPC objects, let's try another: %m",
+                                        candidate);
                         continue;
                 }
 
@@ -692,7 +699,9 @@ static int manager_add_home_by_image(
         if (h && uid_is_valid(h->uid))
                 uid = h->uid;
         else {
-                r = manager_acquire_uid(m, start_uid, user_name, IN_SET(storage, USER_SUBVOLUME, USER_DIRECTORY, USER_FSCRYPT) ? image_path : NULL, &uid);
+                r = manager_acquire_uid(m, start_uid, user_name,
+                                        IN_SET(storage, USER_SUBVOLUME, USER_DIRECTORY, USER_FSCRYPT) ? image_path : NULL,
+                                        &uid);
                 if (r < 0)
                         return log_warning_errno(r, "Failed to acquire unused UID for %s: %m", user_name);
         }
@@ -1660,7 +1669,7 @@ static int on_deferred_rescan(sd_event_source *s, void *userdata) {
 
         assert(m);
 
-        m->deferred_rescan_event_source = sd_event_source_unref(m->deferred_rescan_event_source);
+        m->deferred_rescan_event_source = sd_event_source_disable_unref(m->deferred_rescan_event_source);
 
         manager_enumerate_devices(m);
         manager_enumerate_images(m);
@@ -1698,7 +1707,7 @@ static int on_deferred_gc(sd_event_source *s, void *userdata) {
 
         assert(m);
 
-        m->deferred_gc_event_source = sd_event_source_unref(m->deferred_gc_event_source);
+        m->deferred_gc_event_source = sd_event_source_disable_unref(m->deferred_gc_event_source);
 
         manager_gc_images(m);
         return 0;
index 86b6266895ca6a5836424f8fc54e4061c2c1168d..ba854641df78f5b3e6d50ebcd6be07ece3fead1d 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/homed.conf' to display the full config.
+#
 # See homed.conf(5) for details.
 
 [Home]
index d0676f8ae6dffdb8d825ca5b432636b2bd4522aa..037e4853fd349f1b9a98c532132681b2adf871e9 100644 (file)
@@ -324,7 +324,9 @@ int home_prepare_fscrypt(
         /* Also install the access key in the user's own keyring */
 
         if (uid_is_valid(h->uid)) {
-                r = safe_fork("(sd-addkey)", FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT, NULL);
+                r = safe_fork("(sd-addkey)",
+                              FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_REOPEN_LOG,
+                              NULL);
                 if (r < 0)
                         return log_error_errno(r, "Failed install encryption key in user's keyring: %m");
                 if (r == 0) {
index 1d012c5d02ba7c678a65a57b47b181ed4ef7e7ce..07d5bcfdb6136eb79fd9f6f4708f6f4bdadb74ac 100644 (file)
@@ -199,12 +199,15 @@ static int run_fsck(const char *node, const char *fstype) {
                 return 0;
         }
 
-        r = safe_fork("(fsck)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR, &fsck_pid);
+        r = safe_fork("(fsck)",
+                      FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR|FORK_CLOSE_ALL_FDS,
+                      &fsck_pid);
         if (r < 0)
                 return r;
         if (r == 0) {
                 /* Child */
                 execl("/sbin/fsck", "/sbin/fsck", "-aTl", node, NULL);
+                log_open();
                 log_error_errno(errno, "Failed to execute fsck: %m");
                 _exit(FSCK_OPERATIONAL_ERROR);
         }
@@ -2351,12 +2354,15 @@ static int ext4_offline_resize_fs(HomeSetup *setup, uint64_t new_size, bool disc
         log_info("Temporary unmounting of file system completed.");
 
         /* resize2fs requires that the file system is force checked first, do so. */
-        r = safe_fork("(e2fsck)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR, &fsck_pid);
+        r = safe_fork("(e2fsck)",
+                      FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR|FORK_CLOSE_ALL_FDS,
+                      &fsck_pid);
         if (r < 0)
                 return r;
         if (r == 0) {
                 /* Child */
                 execlp("e2fsck" ,"e2fsck", "-fp", setup->dm_node, NULL);
+                log_open();
                 log_error_errno(errno, "Failed to execute e2fsck: %m");
                 _exit(EXIT_FAILURE);
         }
@@ -2380,12 +2386,15 @@ static int ext4_offline_resize_fs(HomeSetup *setup, uint64_t new_size, bool disc
                 return log_oom();
 
         /* Resize the thing */
-        r = safe_fork("(e2resize)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_STDOUT_TO_STDERR, &resize_pid);
+        r = safe_fork("(e2resize)",
+                      FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_STDOUT_TO_STDERR|FORK_CLOSE_ALL_FDS,
+                      &resize_pid);
         if (r < 0)
                 return r;
         if (r == 0) {
                 /* Child */
                 execlp("resize2fs" ,"resize2fs", setup->dm_node, size_str, NULL);
+                log_open();
                 log_error_errno(errno, "Failed to execute resize2fs: %m");
                 _exit(EXIT_FAILURE);
         }
index 3e0348f4c160f074cc9328e4ee70378863438228..d42c56172fdde8d9a12645bc37c08401f36900a3 100644 (file)
@@ -95,7 +95,7 @@ int raw_export_new(
                 .input_fd = -1,
                 .on_finished = on_finished,
                 .userdata = userdata,
-                .last_percent = (unsigned) -1,
+                .last_percent = UINT_MAX,
                 .progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
         };
 
index 1e6b2c12683f594de9a24e7e76a109d556a4f0a3..b734c3004a7158deca8ea529c4cf5c3efc6ffb9f 100644 (file)
@@ -97,8 +97,8 @@ int tar_export_new(
                 .tar_fd = -1,
                 .on_finished = on_finished,
                 .userdata = userdata,
-                .quota_referenced = (uint64_t) -1,
-                .last_percent = (unsigned) -1,
+                .quota_referenced = UINT64_MAX,
+                .last_percent = UINT_MAX,
                 .progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
         };
 
@@ -120,7 +120,7 @@ static void tar_export_report_progress(TarExport *e) {
         assert(e);
 
         /* Do we have any quota info? If not, we don't know anything about the progress */
-        if (e->quota_referenced == (uint64_t) -1)
+        if (e->quota_referenced == UINT64_MAX)
                 return;
 
         if (e->written_uncompressed >= e->quota_referenced)
@@ -281,7 +281,7 @@ int tar_export_start(TarExport *e, const char *path, int fd, ImportCompressType
         if (r < 0)
                 return r;
 
-        e->quota_referenced = (uint64_t) -1;
+        e->quota_referenced = UINT64_MAX;
 
         if (btrfs_might_be_subvol(&e->st)) {
                 BtrfsQuotaInfo q;
index 4eb59fbb25c09126a72f5ba83103e0c4fd2eccf0..0e7757b6f0c114e1cf95d79876086510f1d70cc3 100644 (file)
@@ -104,7 +104,7 @@ int raw_import_new(
                 .output_fd = -1,
                 .on_finished = on_finished,
                 .userdata = userdata,
-                .last_percent = (unsigned) -1,
+                .last_percent = UINT_MAX,
                 .image_root = TAKE_PTR(root),
                 .progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
         };
index e94474389d5c57bc3c548f33ffdf4286de3e4d2e..7c4e5127a9fb495e475910dab7464ebedfb3ffdc 100644 (file)
@@ -113,7 +113,7 @@ int tar_import_new(
                 .tar_fd = -1,
                 .on_finished = on_finished,
                 .userdata = userdata,
-                .last_percent = (unsigned) -1,
+                .last_percent = UINT_MAX,
                 .image_root = TAKE_PTR(root),
                 .progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
         };
index f9e8481a6d73b7ca882efe271370fd674c308e35..fa8ff68a461bd2c8994d4dbc23dfdf18f873df8e 100644 (file)
@@ -161,7 +161,7 @@ static int transfer_new(Manager *m, Transfer **ret) {
                 .stdin_fd = -1,
                 .stdout_fd = -1,
                 .verify = _IMPORT_VERIFY_INVALID,
-                .progress_percent= (unsigned) -1,
+                .progress_percent= UINT_MAX,
         };
 
         id = m->current_transfer_id + 1;
@@ -186,7 +186,7 @@ static int transfer_new(Manager *m, Transfer **ret) {
 static double transfer_percent_as_double(Transfer *t) {
         assert(t);
 
-        if (t->progress_percent == (unsigned) -1)
+        if (t->progress_percent == UINT_MAX)
                 return -DBL_MAX;
 
         return (double) t->progress_percent / 100.0;
index 908546b96839af76e449a2c58ee38b5f4ec2e7b1..33512cd77a8adfb1d1fef0a9622a53e27208e666 100644 (file)
@@ -176,7 +176,7 @@ void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
                 goto finish;
         }
 
-        if (j->content_length != (uint64_t) -1 &&
+        if (j->content_length != UINT64_MAX &&
             j->content_length != j->written_compressed) {
                 log_error("Download truncated.");
                 r = -EIO;
@@ -293,7 +293,7 @@ static int pull_job_write_compressed(PullJob *j, void *p, size_t sz) {
         if (j->written_compressed + sz > j->compressed_max)
                 return log_error_errno(SYNTHETIC_ERRNO(EFBIG), "File overly large, refusing.");
 
-        if (j->content_length != (uint64_t) -1 &&
+        if (j->content_length != UINT64_MAX &&
             j->written_compressed + sz > j->content_length)
                 return log_error_errno(SYNTHETIC_ERRNO(EFBIG),
                                        "Content length incorrect.");
@@ -502,7 +502,7 @@ static size_t pull_job_header_callback(void *contents, size_t size, size_t nmemb
         if (r > 0) {
                 (void) safe_atou64(length, &j->content_length);
 
-                if (j->content_length != (uint64_t) -1) {
+                if (j->content_length != UINT64_MAX) {
                         char bytes[FORMAT_BYTES_MAX];
 
                         if (j->content_length > j->compressed_max) {
@@ -604,7 +604,7 @@ int pull_job_new(PullJob **ret, const char *url, CurlGlue *glue, void *userdata)
                 .disk_fd = -1,
                 .userdata = userdata,
                 .glue = glue,
-                .content_length = (uint64_t) -1,
+                .content_length = UINT64_MAX,
                 .start_usec = now(CLOCK_MONOTONIC),
                 .compressed_max = 64LLU * 1024LLU * 1024LLU * 1024LLU, /* 64GB safety limit */
                 .uncompressed_max = 64LLU * 1024LLU * 1024LLU * 1024LLU, /* 64GB safety limit */
index c9bda3c3b48cfbb72023547f2a8bf7c3845dcc2f..9b5d8ef9e30c009e96b40f9273f5ec30a0a0612f 100644 (file)
@@ -364,7 +364,7 @@ static int raw_pull_make_local_copy(RawPull *i) {
          * since it reduces fragmentation caused by not allowing in-place writes. */
         (void) import_set_nocow_and_log(dfd, tp);
 
-        r = copy_bytes(i->raw_job->disk_fd, dfd, (uint64_t) -1, COPY_REFLINK);
+        r = copy_bytes(i->raw_job->disk_fd, dfd, UINT64_MAX, COPY_REFLINK);
         if (r < 0) {
                 (void) unlink(tp);
                 return log_error_errno(r, "Failed to make writable copy of image: %m");
index bd1edb1797dd528e0e7e597c1745ae6ae9f1a309..4cefe3918c9d60dc4180dc7cbd9fa3c8f0d28a07 100644 (file)
@@ -501,7 +501,9 @@ static int request_handler_entries(
         if (!response)
                 return respond_oom(connection);
 
-        MHD_add_response_header(response, "Content-Type", mime_types[m->mode]);
+        if (MHD_add_response_header(response, "Content-Type", mime_types[m->mode]) == MHD_NO)
+                return respond_oom(connection);
+
         return MHD_queue_response(connection, MHD_HTTP_OK, response);
 }
 
@@ -629,7 +631,9 @@ static int request_handler_fields(
         if (!response)
                 return respond_oom(connection);
 
-        MHD_add_response_header(response, "Content-Type", mime_types[m->mode == OUTPUT_JSON ? OUTPUT_JSON : OUTPUT_SHORT]);
+        if (MHD_add_response_header(response, "Content-Type", mime_types[m->mode == OUTPUT_JSON ? OUTPUT_JSON : OUTPUT_SHORT]) == MHD_NO)
+                return respond_oom(connection);
+
         return MHD_queue_response(connection, MHD_HTTP_OK, response);
 }
 
@@ -637,7 +641,7 @@ static int request_handler_redirect(
                 struct MHD_Connection *connection,
                 const char *target) {
 
-        char *page;
+        _cleanup_free_ char *page = NULL;
         _cleanup_(MHD_destroy_responsep) struct MHD_Response *response = NULL;
 
         assert(connection);
@@ -647,13 +651,14 @@ static int request_handler_redirect(
                 return respond_oom(connection);
 
         response = MHD_create_response_from_buffer(strlen(page), page, MHD_RESPMEM_MUST_FREE);
-        if (!response) {
-                free(page);
+        if (!response)
+                return respond_oom(connection);
+        TAKE_PTR(page);
+
+        if (MHD_add_response_header(response, "Content-Type", "text/html") == MHD_NO ||
+            MHD_add_response_header(response, "Location", target) == MHD_NO)
                 return respond_oom(connection);
-        }
 
-        MHD_add_response_header(response, "Content-Type", "text/html");
-        MHD_add_response_header(response, "Location", target);
         return MHD_queue_response(connection, MHD_HTTP_MOVED_PERMANENTLY, response);
 }
 
@@ -682,7 +687,9 @@ static int request_handler_file(
                 return respond_oom(connection);
         TAKE_FD(fd);
 
-        MHD_add_response_header(response, "Content-Type", mime_type);
+        if (MHD_add_response_header(response, "Content-Type", mime_type) == MHD_NO)
+                return respond_oom(connection);
+
         return MHD_queue_response(connection, MHD_HTTP_OK, response);
 }
 
@@ -783,7 +790,9 @@ static int request_handler_machine(
                 return respond_oom(connection);
         TAKE_PTR(json);
 
-        MHD_add_response_header(response, "Content-Type", "application/json");
+        if (MHD_add_response_header(response, "Content-Type", "application/json") == MHD_NO)
+                return respond_oom(connection);
+
         return MHD_queue_response(connection, MHD_HTTP_OK, response);
 }
 
index 3e84c3dd7b91cb7f7e0b32bbfc01a0587488d571..ae1d43756a143ede25b95ad2b2d000681e6f034a 100644 (file)
@@ -471,7 +471,7 @@ static int setup_microhttpd_server(RemoteServer *s,
         }
 
         r = sd_event_add_time(s->events, &d->timer_event,
-                              CLOCK_MONOTONIC, (uint64_t) -1, 0,
+                              CLOCK_MONOTONIC, UINT64_MAX, 0,
                               null_timer_event_handler, d);
         if (r < 0) {
                 log_error_errno(r, "Failed to add timer_event: %m");
index 764a3ec70bf6506a3ec417173380b2249ee0755d..ea7162318ed243ce4fa01a6ca8cc6880683ad2f9 100644 (file)
@@ -4,7 +4,7 @@
 #include "journal-remote.h"
 
 static int do_rotate(JournalFile **f, bool compress, bool seal) {
-        int r = journal_file_rotate(f, compress, (uint64_t) -1, seal, NULL);
+        int r = journal_file_rotate(f, compress, UINT64_MAX, seal, NULL);
         if (r < 0) {
                 if (*f)
                         log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
index 0cee84445270112ca8763ed101093916283917e6..6f71248aaf31cf754652aa04d05d31b5c0fa73ab 100644 (file)
@@ -62,7 +62,7 @@ static int open_output(RemoteServer *s, Writer *w, const char* host) {
 
         r = journal_file_open_reliably(filename,
                                        O_RDWR|O_CREAT, 0640,
-                                       s->compress, (uint64_t) -1, s->seal,
+                                       s->compress, UINT64_MAX, s->seal,
                                        &w->metrics,
                                        w->mmap, NULL,
                                        NULL, &w->journal);
index 3296c2268eac2bc163e34d8ca52b433adf2f6318..f23d5cf8b9ca6d9a2edc2fe85393e1d0f569b220 100644 (file)
@@ -399,7 +399,7 @@ int open_journal_for_upload(Uploader *u,
                         return log_error_errno(r, "Failed to register input event: %m");
 
                 log_debug("Listening for journal events on fd:%d, timeout %d",
-                          fd, u->timeout == (uint64_t) -1 ? -1 : (int) u->timeout);
+                          fd, u->timeout == UINT64_MAX ? -1 : (int) u->timeout);
         } else
                 log_debug("Not listening for journal events.");
 
index e56e336b4f7ecae14fdef81df888cb5ae53069bb..a8f1f7e5115b4793605d291b34019ad6c9a246eb 100644 (file)
@@ -71,6 +71,9 @@ static void close_fd_input(Uploader *u);
                 }                                                       \
         } while (0)
 
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(CURL*, curl_easy_cleanup, NULL);
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct curl_slist*, curl_slist_free_all, NULL);
+
 static size_t output_callback(char *buf,
                               size_t size,
                               size_t nmemb,
@@ -180,29 +183,28 @@ int start_upload(Uploader *u,
         assert(input_callback);
 
         if (!u->header) {
-                struct curl_slist *h;
+                _cleanup_(curl_slist_free_allp) struct curl_slist *h = NULL;
+                struct curl_slist *l;
 
                 h = curl_slist_append(NULL, "Content-Type: application/vnd.fdo.journal");
                 if (!h)
                         return log_oom();
 
-                h = curl_slist_append(h, "Transfer-Encoding: chunked");
-                if (!h) {
-                        curl_slist_free_all(h);
+                l = curl_slist_append(h, "Transfer-Encoding: chunked");
+                if (!l)
                         return log_oom();
-                }
+                h = l;
 
-                h = curl_slist_append(h, "Accept: text/plain");
-                if (!h) {
-                        curl_slist_free_all(h);
+                l = curl_slist_append(h, "Accept: text/plain");
+                if (!l)
                         return log_oom();
-                }
+                h = l;
 
-                u->header = h;
+                u->header = TAKE_PTR(h);
         }
 
         if (!u->easy) {
-                CURL *curl;
+                _cleanup_(curl_easy_cleanupp) CURL *curl = NULL;
 
                 curl = curl_easy_init();
                 if (!curl)
@@ -260,7 +262,7 @@ int start_upload(Uploader *u,
                         easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1,
                                     LOG_WARNING, );
 
-                u->easy = curl;
+                u->easy = TAKE_PTR(curl);
         } else {
                 /* truncate the potential old error message */
                 u->error[0] = '\0';
index d3fb0b8b191361a6b40316862b0de3de63f63403..e6a82544912ddc3d941339857ac8685dbcd4d881 100644 (file)
@@ -39,7 +39,8 @@ static int mhd_respond_internal(struct MHD_Connection *connection,
                 return MHD_NO;
 
         log_debug("Queueing response %u: %s", code, buffer);
-        MHD_add_response_header(response, "Content-Type", "text/plain");
+        if (MHD_add_response_header(response, "Content-Type", "text/plain") == MHD_NO)
+                return MHD_NO;
         return MHD_queue_response(connection, code, response);
 }
 
index 038b335cb32bcdf25028273b0c961d00132e2b21..8a979df3ced408094695d86838772e48e6a4013f 100644 (file)
@@ -27,7 +27,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         assert_se(stdout_stream_install(&s, stream_fds[0], &stream) >= 0);
         assert_se(write(stream_fds[1], data, size) == (ssize_t) size);
         while (ioctl(stream_fds[0], SIOCINQ, &v) == 0 && v)
-                sd_event_run(s.event, (uint64_t) -1);
+                sd_event_run(s.event, UINT64_MAX);
         if (s.n_stdout_streams)
                 stdout_stream_destroy(stream);
         server_done(&s);
index 823cf0a25f42e3a2b581e518d0026a3265732b3e..6b06320d78285fd53119cd3fc2be9225a0e26be3 100644 (file)
@@ -5,7 +5,6 @@
 #include <fnmatch.h>
 #include <getopt.h>
 #include <linux/fs.h>
-#include <poll.h>
 #include <signal.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -2095,8 +2094,6 @@ static int wait_for_change(sd_journal *j, int poll_fd) {
                 { .fd = poll_fd, .events = POLLIN },
                 { .fd = STDOUT_FILENO },
         };
-
-        struct timespec ts;
         usec_t timeout;
         int r;
 
@@ -2110,21 +2107,16 @@ static int wait_for_change(sd_journal *j, int poll_fd) {
         if (r < 0)
                 return log_error_errno(r, "Failed to determine journal waiting time: %m");
 
-        if (ppoll(pollfds, ELEMENTSOF(pollfds),
-                  timeout == USEC_INFINITY ? NULL : timespec_store(&ts, timeout), NULL) < 0) {
-                if (errno == EINTR)
-                        return 0;
-
-                return log_error_errno(errno, "Couldn't wait for journal event: %m");
-        }
+        r = ppoll_usec(pollfds, ELEMENTSOF(pollfds), timeout);
+        if (r == -EINTR)
+                return 0;
+        if (r < 0)
+                return log_error_errno(r, "Couldn't wait for journal event: %m");
 
-        if (pollfds[1].revents & (POLLHUP|POLLERR|POLLNVAL)) /* STDOUT has been closed? */
+        if (pollfds[1].revents & (POLLHUP|POLLERR)) /* STDOUT has been closed? */
                 return log_debug_errno(SYNTHETIC_ERRNO(ECANCELED),
                                        "Standard output has been closed.");
 
-        if (pollfds[0].revents & POLLNVAL)
-                return log_debug_errno(SYNTHETIC_ERRNO(EBADF), "Change fd closed?");
-
         r = sd_journal_process(j);
         if (r < 0)
                 return log_error_errno(r, "Failed to process journal events: %m");
index 58151aa03db97a01be0540226c1f7bde2db99699..add0a5480d54a17d4d394302f38006cd16fb4905 100644 (file)
@@ -69,7 +69,7 @@
 static size_t cache_max(void) {
         static size_t cached = -1;
 
-        if (cached == (size_t) -1) {
+        if (cached == SIZE_MAX) {
                 uint64_t mem_total;
                 int r;
 
index 1c5849ed5535e6d636634f1387048e3a5edb2f6d..102814a403da8057654207b46a6f4038d0fc7ab1 100644 (file)
@@ -105,7 +105,7 @@ static int server_process_entry(
          *
          * Note that *remaining is altered on both success and failure. */
 
-        size_t n = 0, j, tn = (size_t) -1, m = 0, entry_size = 0;
+        size_t n = 0, j, tn = SIZE_MAX, m = 0, entry_size = 0;
         char *identifier = NULL, *message = NULL;
         struct iovec *iovec = NULL;
         int priority = LOG_INFO;
index 5cad3740838fd13298f608cd650b5bfdc2d101c4..6d87fa0f844bf16b8fe4b9cc3b40a35854259465 100644 (file)
@@ -144,7 +144,7 @@ static int cache_space_refresh(Server *s, JournalStorage *storage) {
 
         ts = now(CLOCK_MONOTONIC);
 
-        if (space->timestamp != 0 && space->timestamp + RECHECK_SPACE_USEC > ts)
+        if (space->timestamp != 0 && usec_add(space->timestamp, RECHECK_SPACE_USEC) > ts)
                 return 0;
 
         r = determine_path_usage(s, storage->path, &vfs_used, &vfs_avail);
@@ -1206,7 +1206,7 @@ finish:
         server_driver_message(s, 0, NULL,
                               LOG_MESSAGE("Time spent on flushing to %s is %s for %u entries.",
                                           s->system_storage.path,
-                                          format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0),
+                                          format_timespan(ts, sizeof(ts), usec_sub_unsigned(now(CLOCK_MONOTONIC), start), 0),
                                           n),
                               NULL);
 
@@ -1625,17 +1625,19 @@ static int server_parse_config_file(Server *s) {
         assert(s);
 
         if (s->namespace) {
-                const char *namespaced;
+                const char *namespaced, *dropin_dirname;
 
                 /* If we are running in namespace mode, load the namespace specific configuration file, and nothing else */
                 namespaced = strjoina(PKGSYSCONFDIR "/journald@", s->namespace, ".conf");
-
-                r = config_parse(NULL,
-                                 namespaced, NULL,
-                                 "Journal\0",
-                                 config_item_perf_lookup, journald_gperf_lookup,
-                                 CONFIG_PARSE_WARN, s,
-                                 NULL);
+                dropin_dirname = strjoina("journald@", s->namespace, ".conf.d");
+
+                r = config_parse_many(
+                                STRV_MAKE_CONST(namespaced),
+                                (const char* const*) CONF_PATHS_STRV("systemd"),
+                                dropin_dirname,
+                                "Journal\0",
+                                config_item_perf_lookup, journald_gperf_lookup,
+                                CONFIG_PARSE_WARN, s, NULL);
                 if (r < 0)
                         return r;
 
@@ -2185,7 +2187,7 @@ int server_init(Server *s, const char *namespace) {
                 .notify_fd = -1,
 
                 .compress.enabled = true,
-                .compress.threshold_bytes = (uint64_t) -1,
+                .compress.threshold_bytes = UINT64_MAX,
                 .seal = true,
 
                 .set_audit = true,
@@ -2593,7 +2595,7 @@ int config_parse_compress(
 
         if (isempty(rvalue)) {
                 compress->enabled = true;
-                compress->threshold_bytes = (uint64_t) -1;
+                compress->threshold_bytes = UINT64_MAX;
         } else if (streq(rvalue, "1")) {
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "Compress= ambiguously specified as 1, enabling compression with default threshold");
index 73b3240677a279351bf294c98f4599106c9d535a..7bc26097f3a2a20b84b7e1a6bae2b02ffca3fe80 100644 (file)
@@ -334,6 +334,22 @@ static int stdout_stream_log(
         return 0;
 }
 
+static int syslog_parse_priority_and_facility(const char *s) {
+        int prio, r;
+
+        /* Parses both facility and priority in one value, i.e. is different from log_level_from_string()
+         * which only parses the priority and refuses any facility value */
+
+        r = safe_atoi(s, &prio);
+        if (r < 0)
+                return r;
+
+        if (prio < 0 || prio > 999)
+                return -ERANGE;
+
+        return prio;
+}
+
 static int stdout_stream_line(StdoutStream *s, char *p, LineBreak line_break) {
         char *orig;
         int r;
@@ -373,22 +389,22 @@ static int stdout_stream_line(StdoutStream *s, char *p, LineBreak line_break) {
                 s->state = STDOUT_STREAM_PRIORITY;
                 return 0;
 
-        case STDOUT_STREAM_PRIORITY:
-                r = safe_atoi(p, &s->priority);
-                if (r < 0 || s->priority < 0 || s->priority > 999) {
-                        log_warning("Failed to parse log priority line.");
-                        return -EINVAL;
-                }
+        case STDOUT_STREAM_PRIORITY: {
+                int priority;
+
+                priority = syslog_parse_priority_and_facility(p);
+                if (priority < 0)
+                        return log_warning_errno(priority, "Failed to parse log priority line: %m");
 
+                s->priority = priority;
                 s->state = STDOUT_STREAM_LEVEL_PREFIX;
                 return 0;
+        }
 
         case STDOUT_STREAM_LEVEL_PREFIX:
                 r = parse_boolean(p);
-                if (r < 0) {
-                        log_warning("Failed to parse level prefix line.");
-                        return -EINVAL;
-                }
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to parse level prefix line: %m");
 
                 s->level_prefix = r;
                 s->state = STDOUT_STREAM_FORWARD_TO_SYSLOG;
@@ -396,10 +412,8 @@ static int stdout_stream_line(StdoutStream *s, char *p, LineBreak line_break) {
 
         case STDOUT_STREAM_FORWARD_TO_SYSLOG:
                 r = parse_boolean(p);
-                if (r < 0) {
-                        log_warning("Failed to parse forward to syslog line.");
-                        return -EINVAL;
-                }
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to parse forward to syslog line: %m");
 
                 s->forward_to_syslog = r;
                 s->state = STDOUT_STREAM_FORWARD_TO_KMSG;
@@ -407,10 +421,8 @@ static int stdout_stream_line(StdoutStream *s, char *p, LineBreak line_break) {
 
         case STDOUT_STREAM_FORWARD_TO_KMSG:
                 r = parse_boolean(p);
-                if (r < 0) {
-                        log_warning("Failed to parse copy to kmsg line.");
-                        return -EINVAL;
-                }
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to parse copy to kmsg line: %m");
 
                 s->forward_to_kmsg = r;
                 s->state = STDOUT_STREAM_FORWARD_TO_CONSOLE;
@@ -418,10 +430,8 @@ static int stdout_stream_line(StdoutStream *s, char *p, LineBreak line_break) {
 
         case STDOUT_STREAM_FORWARD_TO_CONSOLE:
                 r = parse_boolean(p);
-                if (r < 0) {
-                        log_warning("Failed to parse copy to console line.");
-                        return -EINVAL;
-                }
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to parse copy to console line.");
 
                 s->forward_to_console = r;
                 s->state = STDOUT_STREAM_RUNNING;
@@ -750,7 +760,7 @@ static int stdout_stream_load(StdoutStream *stream, const char *fname) {
         if (priority) {
                 int p;
 
-                p = log_level_from_string(priority);
+                p = syslog_parse_priority_and_facility(priority);
                 if (p >= 0)
                         stream->priority = p;
         }
index ee674ebefed4bb93b25f46d5e121129b1b825a2e..18d6b30773bad40962631dc8b50c727ff01382f6 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
+#
 # See journald.conf(5) for details.
 
 [Journal]
index 4f29e1b310fbf073967b8ab43ed159924adab276..bd0de9600a91fde39399611a666417c96b582958 100644 (file)
@@ -43,7 +43,7 @@ static void test_config_compress(void) {
         /* Invalid Case */
         COMPRESS_PARSE_CHECK("-1", true, 111);
         COMPRESS_PARSE_CHECK("blah blah", true, 111);
-        COMPRESS_PARSE_CHECK("", true, (uint64_t)-1);
+        COMPRESS_PARSE_CHECK("", true, UINT64_MAX);
 }
 
 int main(int argc, char *argv[]) {
index 40e6b1f26f7a3c7e4d38f352f23dc9f23647e804..c5c851c57506526ffb540024b84d83d2d9488822 100644 (file)
@@ -12,6 +12,7 @@
 #include "sd-dhcp-client.h"
 
 #include "dhcp-protocol.h"
+#include "log-link.h"
 #include "socket-util.h"
 
 typedef struct sd_dhcp_option {
@@ -65,5 +66,15 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, ui
 #define DHCP_CLIENT_DONT_DESTROY(client) \
         _cleanup_(sd_dhcp_client_unrefp) _unused_ sd_dhcp_client *_dont_destroy_##client = sd_dhcp_client_ref(client)
 
-#define log_dhcp_client_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "DHCP CLIENT (0x%x): " fmt, client->xid, ##__VA_ARGS__)
-#define log_dhcp_client(client, fmt, ...) log_dhcp_client_errno(client, 0, fmt, ##__VA_ARGS__)
+#define log_dhcp_client_errno(client, error, fmt, ...)                  \
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                sd_dhcp_client_get_ifname(client),      \
+                                LOG_DEBUG, _e, "DHCPv4 client: " fmt,   \
+                                ##__VA_ARGS__);                         \
+                -ERRNO_VALUE(_e);                                       \
+        })
+#define log_dhcp_client(client, fmt, ...)                       \
+        log_dhcp_client_errno(client, 0, fmt, ##__VA_ARGS__)
index b5293c3ed66996913223a5c7738c6d270e78f541..33e236627f08b89e38fdcfe8f833b4f063a85903 100644 (file)
@@ -10,7 +10,7 @@
 
 #include "dhcp-internal.h"
 #include "ordered-set.h"
-#include "log.h"
+#include "log-link.h"
 #include "time-util.h"
 
 typedef enum DHCPRawOption {
@@ -48,6 +48,7 @@ struct sd_dhcp_server {
         int fd_raw;
 
         int ifindex;
+        char *ifname;
         be32_t address;
         be32_t netmask;
         be32_t subnet;
@@ -85,9 +86,6 @@ typedef struct DHCPRequest {
         uint32_t lifetime;
 } DHCPRequest;
 
-#define log_dhcp_server(client, fmt, ...) log_internal(LOG_DEBUG, 0, PROJECT_FILE, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__)
-#define log_dhcp_server_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__)
-
 int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
                                size_t length);
 int dhcp_server_send_packet(sd_dhcp_server *server,
@@ -96,3 +94,16 @@ int dhcp_server_send_packet(sd_dhcp_server *server,
 
 void client_id_hash_func(const DHCPClientId *p, struct siphash *state);
 int client_id_compare_func(const DHCPClientId *a, const DHCPClientId *b);
+
+#define log_dhcp_server_errno(server, error, fmt, ...)                  \
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_dhcp_server_get_ifname(server),  \
+                                    LOG_DEBUG, _e, "DHCPv4 server: " fmt, \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
+#define log_dhcp_server(server, fmt, ...)                       \
+        log_dhcp_server_errno(server, 0, fmt, ##__VA_ARGS__)
index 681c462315587cfea3cbc0b1ff32db791983716f..274b14b056e2a56d25be36c1f45c58179ce47a68 100644 (file)
@@ -9,9 +9,11 @@
 #include <netinet/in.h>
 
 #include "sd-event.h"
+#include "sd-dhcp6-client.h"
 
-#include "list.h"
 #include "hashmap.h"
+#include "list.h"
+#include "log-link.h"
 #include "macro.h"
 #include "sparse-endian.h"
 
@@ -78,7 +80,7 @@ struct ia_ta {
         be32_t id;
 } _packed_;
 
-struct DHCP6IA {
+typedef struct DHCP6IA {
         uint16_t type;
         union {
                 struct ia_na ia_na;
@@ -87,12 +89,7 @@ struct DHCP6IA {
         };
 
         LIST_HEAD(DHCP6Address, addresses);
-};
-
-typedef struct DHCP6IA DHCP6IA;
-
-#define log_dhcp6_client_errno(p, error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "DHCPv6 CLIENT: " fmt, ##__VA_ARGS__)
-#define log_dhcp6_client(p, fmt, ...) log_dhcp6_client_errno(p, 0, fmt, ##__VA_ARGS__)
+} DHCP6IA;
 
 int dhcp6_option_append(uint8_t **buf, size_t *buflen, uint16_t code,
                         size_t optlen, const void *optval);
@@ -105,7 +102,7 @@ int dhcp6_option_append_vendor_option(uint8_t **buf, size_t *buflen, OrderedHash
 int dhcp6_option_parse(uint8_t **buf, size_t *buflen, uint16_t *optcode,
                        size_t *optlen, uint8_t **optvalue);
 int dhcp6_option_parse_status(DHCP6Option *option, size_t len);
-int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code);
+int dhcp6_option_parse_ia(sd_dhcp6_client *client, DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code);
 int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
                                 struct in6_addr **addrs, size_t count,
                                 size_t *allocated);
@@ -121,3 +118,16 @@ const char *dhcp6_message_type_to_string(int s) _const_;
 int dhcp6_message_type_from_string(const char *s) _pure_;
 const char *dhcp6_message_status_to_string(int s) _const_;
 int dhcp6_message_status_from_string(const char *s) _pure_;
+
+#define log_dhcp6_client_errno(client, error, fmt, ...)                 \
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_dhcp6_client_get_ifname(client), \
+                                    LOG_DEBUG, _e, "DHCPv6 client: " fmt, \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
+#define log_dhcp6_client(client, fmt, ...)                       \
+        log_dhcp6_client_errno(client, 0, fmt, ##__VA_ARGS__)
index 93140160245380ac293256df80b32cff8f43bf38..ff51758e0bc05f51bbfdbf0b38044d97dd1a0ce4 100644 (file)
@@ -257,9 +257,9 @@ int dhcp6_option_append_pd(uint8_t **buf, size_t *buflen, const DHCP6IA *pd, con
                 len += r;
         }
 
-        if (hint_pd_prefix) {
+        if (hint_pd_prefix && hint_pd_prefix->iapdprefix.prefixlen > 0) {
                 r = option_append_pd_prefix(buf, buflen, hint_pd_prefix);
-                if (r < 0 && r != -EINVAL)
+                if (r < 0)
                         return r;
 
                 len += r;
@@ -425,7 +425,7 @@ int dhcp6_option_parse_status(DHCP6Option *option, size_t len) {
         return be16toh(statusopt->status);
 }
 
-static int dhcp6_option_parse_address(DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
+static int dhcp6_option_parse_address(sd_dhcp6_client *client, DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
         DHCP6AddressOption *addr_option = (DHCP6AddressOption *)option;
         DHCP6Address *addr;
         uint32_t lt_valid, lt_pref;
@@ -437,23 +437,20 @@ static int dhcp6_option_parse_address(DHCP6Option *option, DHCP6IA *ia, uint32_t
         lt_valid = be32toh(addr_option->iaaddr.lifetime_valid);
         lt_pref = be32toh(addr_option->iaaddr.lifetime_preferred);
 
-        if (lt_valid == 0 || lt_pref > lt_valid) {
-                log_dhcp6_client(client,
-                                 "Valid lifetime of an IA address is zero or "
-                                 "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
-                                 lt_pref, lt_valid);
-                return -EINVAL;
-        }
+        if (lt_valid == 0 || lt_pref > lt_valid)
+                return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                              "Valid lifetime of an IA address is zero or "
+                                              "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
+                                              lt_pref, lt_valid);
 
         if (be16toh(option->len) + offsetof(DHCP6Option, data) > sizeof(*addr_option)) {
                 r = dhcp6_option_parse_status((DHCP6Option *)addr_option->options, be16toh(option->len) + offsetof(DHCP6Option, data) - sizeof(*addr_option));
                 if (r < 0)
                         return r;
-                if (r > 0) {
-                        log_dhcp6_client(client, "Non-zero status code '%s' for address is received",
-                                         dhcp6_message_status_to_string(r));
-                        return -EINVAL;
-                }
+                if (r > 0)
+                        return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                                      "Non-zero status code '%s' for address is received",
+                                                      dhcp6_message_status_to_string(r));
         }
 
         addr = new0(DHCP6Address, 1);
@@ -470,7 +467,7 @@ static int dhcp6_option_parse_address(DHCP6Option *option, DHCP6IA *ia, uint32_t
         return 0;
 }
 
-static int dhcp6_option_parse_pdprefix(DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
+static int dhcp6_option_parse_pdprefix(sd_dhcp6_client *client, DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
         DHCP6PDPrefixOption *pdprefix_option = (DHCP6PDPrefixOption *)option;
         DHCP6Address *prefix;
         uint32_t lt_valid, lt_pref;
@@ -482,23 +479,20 @@ static int dhcp6_option_parse_pdprefix(DHCP6Option *option, DHCP6IA *ia, uint32_
         lt_valid = be32toh(pdprefix_option->iapdprefix.lifetime_valid);
         lt_pref = be32toh(pdprefix_option->iapdprefix.lifetime_preferred);
 
-        if (lt_valid == 0 || lt_pref > lt_valid) {
-                log_dhcp6_client(client,
-                                 "Valid lifetieme of a PD prefix is zero or "
-                                 "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
-                                 lt_pref, lt_valid);
-                return -EINVAL;
-        }
+        if (lt_valid == 0 || lt_pref > lt_valid)
+                return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                              "Valid lifetieme of a PD prefix is zero or "
+                                              "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
+                                              lt_pref, lt_valid);
 
         if (be16toh(option->len) + offsetof(DHCP6Option, data) > sizeof(*pdprefix_option)) {
                 r = dhcp6_option_parse_status((DHCP6Option *)pdprefix_option->options, be16toh(option->len) + offsetof(DHCP6Option, data) - sizeof(*pdprefix_option));
                 if (r < 0)
                         return r;
-                if (r > 0) {
-                        log_dhcp6_client(client, "Non-zero status code '%s' for PD prefix is received",
-                                         dhcp6_message_status_to_string(r));
-                        return -EINVAL;
-                }
+                if (r > 0)
+                        return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                                      "Non-zero status code '%s' for PD prefix is received",
+                                                      dhcp6_message_status_to_string(r));
         }
 
         prefix = new0(DHCP6Address, 1);
@@ -515,7 +509,7 @@ static int dhcp6_option_parse_pdprefix(DHCP6Option *option, DHCP6IA *ia, uint32_
         return 0;
 }
 
-int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code) {
+int dhcp6_option_parse_ia(sd_dhcp6_client *client, DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code) {
         uint32_t lt_t1, lt_t2, lt_valid = 0, lt_min = UINT32_MAX;
         uint16_t iatype, optlen;
         size_t iaaddr_offset;
@@ -541,10 +535,10 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
                 lt_t1 = be32toh(ia->ia_na.lifetime_t1);
                 lt_t2 = be32toh(ia->ia_na.lifetime_t2);
 
-                if (lt_t1 && lt_t2 && lt_t1 > lt_t2) {
-                        log_dhcp6_client(client, "IA NA T1 %"PRIu32"sec > T2 %"PRIu32"sec", lt_t1, lt_t2);
-                        return -EINVAL;
-                }
+                if (lt_t1 > lt_t2)
+                        return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                                      "IA NA T1 %"PRIu32"sec > T2 %"PRIu32"sec",
+                                                      lt_t1, lt_t2);
 
                 break;
 
@@ -559,10 +553,10 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
                 lt_t1 = be32toh(ia->ia_pd.lifetime_t1);
                 lt_t2 = be32toh(ia->ia_pd.lifetime_t2);
 
-                if (lt_t1 && lt_t2 && lt_t1 > lt_t2) {
-                        log_dhcp6_client(client, "IA PD T1 %"PRIu32"sec > T2 %"PRIu32"sec", lt_t1, lt_t2);
-                        return -EINVAL;
-                }
+                if (lt_t1 > lt_t2)
+                        return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                                      "IA PD T1 %"PRIu32"sec > T2 %"PRIu32"sec",
+                                                      lt_t1, lt_t2);
 
                 break;
 
@@ -594,12 +588,11 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
                 switch (opt) {
                 case SD_DHCP6_OPTION_IAADDR:
 
-                        if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_NA, SD_DHCP6_OPTION_IA_TA)) {
-                                log_dhcp6_client(client, "IA Address option not in IA NA or TA option");
-                                return -EINVAL;
-                        }
+                        if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_NA, SD_DHCP6_OPTION_IA_TA))
+                                return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                                              "IA Address option not in IA NA or TA option");
 
-                        r = dhcp6_option_parse_address(option, ia, &lt_valid);
+                        r = dhcp6_option_parse_address(client, option, ia, &lt_valid);
                         if (r < 0 && r != -EINVAL)
                                 return r;
                         if (r >= 0 && lt_valid < lt_min)
@@ -609,12 +602,11 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
 
                 case SD_DHCP6_OPTION_IA_PD_PREFIX:
 
-                        if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_PD)) {
-                                log_dhcp6_client(client, "IA PD Prefix option not in IA PD option");
-                                return -EINVAL;
-                        }
+                        if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_PD))
+                                return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+                                                              "IA PD Prefix option not in IA PD option");
 
-                        r = dhcp6_option_parse_pdprefix(option, ia, &lt_valid);
+                        r = dhcp6_option_parse_pdprefix(client, option, ia, &lt_valid);
                         if (r < 0 && r != -EINVAL)
                                 return r;
                         if (r >= 0 && lt_valid < lt_min)
@@ -650,7 +642,7 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
 
         switch(iatype) {
         case SD_DHCP6_OPTION_IA_NA:
-                if (!ia->ia_na.lifetime_t1 && !ia->ia_na.lifetime_t2 && lt_min != UINT32_MAX) {
+                if (ia->ia_na.lifetime_t1 == 0 && ia->ia_na.lifetime_t2 == 0 && lt_min != UINT32_MAX) {
                         lt_t1 = lt_min / 2;
                         lt_t2 = lt_min / 10 * 8;
                         ia->ia_na.lifetime_t1 = htobe32(lt_t1);
@@ -663,7 +655,7 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
                 break;
 
         case SD_DHCP6_OPTION_IA_PD:
-                if (!ia->ia_pd.lifetime_t1 && !ia->ia_pd.lifetime_t2 && lt_min != UINT32_MAX) {
+                if (ia->ia_pd.lifetime_t1 == 0 && ia->ia_pd.lifetime_t2 == 0 && lt_min != UINT32_MAX) {
                         lt_t1 = lt_min / 2;
                         lt_t2 = lt_min / 10 * 8;
                         ia->ia_pd.lifetime_t1 = htobe32(lt_t1);
index e5e70dd606ef9b1bf2df455125bb3927579b0222..acb8d9b98ca0d5eeabced8f0f233b765b5edf4d5 100644 (file)
@@ -41,7 +41,7 @@ static void fuzz_client(const uint8_t *data, size_t size, bool is_information_re
 
         assert_se(write(test_dhcp_fd[1], data, size) == (ssize_t) size);
 
-        sd_event_run(e, (uint64_t) -1);
+        sd_event_run(e, UINT64_MAX);
 
         assert_se(sd_dhcp6_client_stop(client) >= 0);
 
index d74cd2fffc7f50fffc1adf576a76e64ae52170e8..20350d449cf398d39b5eb683c8eb2087ce61f41b 100644 (file)
@@ -53,7 +53,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         assert_se(sd_ndisc_set_mac(nd, &mac_addr) >= 0);
         assert_se(sd_ndisc_start(nd) >= 0);
         assert_se(write(test_fd[1], data, size) == (ssize_t) size);
-        (void) sd_event_run(e, (uint64_t) -1);
+        (void) sd_event_run(e, UINT64_MAX);
         assert_se(sd_ndisc_stop(nd) >= 0);
         close(test_fd[1]);
 
index daedbb088fbb767eb6567b9fd4a8e6a880c7f8c4..f13555d35c46d922e463a5bf4ca2ae11b10e1bca 100644 (file)
@@ -5,13 +5,14 @@
 #include "sd-lldp.h"
 
 #include "hashmap.h"
-#include "log.h"
+#include "log-link.h"
 #include "prioq.h"
 
 struct sd_lldp {
         unsigned n_ref;
 
         int ifindex;
+        char *ifname;
         int fd;
 
         sd_event *event;
@@ -32,8 +33,18 @@ struct sd_lldp {
         struct ether_addr filter_address;
 };
 
-#define log_lldp_errno(error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "LLDP: " fmt, ##__VA_ARGS__)
-#define log_lldp(fmt, ...) log_lldp_errno(0, fmt, ##__VA_ARGS__)
-
 const char* lldp_event_to_string(sd_lldp_event_t e) _const_;
 sd_lldp_event_t lldp_event_from_string(const char *s) _pure_;
+
+#define log_lldp_errno(lldp, error, fmt, ...)                           \
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_lldp_get_ifname(lldp),           \
+                                    LOG_DEBUG, _e, "LLDP: " fmt,        \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
+#define log_lldp(lldp, fmt, ...)                       \
+        log_lldp_errno(lldp, 0, fmt, ##__VA_ARGS__)
index 546ae1c980fa167f4f35d4d4f15b6bb1f31cfff8..3bd775158efdbb6c3ea8858f5f9241f415ea0b9c 100644 (file)
@@ -112,7 +112,7 @@ sd_lldp_neighbor *lldp_neighbor_new(size_t raw_size) {
         return n;
 }
 
-static int parse_string(char **s, const void *q, size_t n) {
+static int parse_string(sd_lldp *lldp, char **s, const void *q, size_t n) {
         const char *p = q;
         char *k;
 
@@ -120,7 +120,7 @@ static int parse_string(char **s, const void *q, size_t n) {
         assert(p || n == 0);
 
         if (*s) {
-                log_lldp("Found duplicate string, ignoring field.");
+                log_lldp(lldp, "Found duplicate string, ignoring field.");
                 return 0;
         }
 
@@ -133,14 +133,14 @@ static int parse_string(char **s, const void *q, size_t n) {
 
         /* Look for inner NULs */
         if (memchr(p, 0, n)) {
-                log_lldp("Found inner NUL in string, ignoring field.");
+                log_lldp(lldp, "Found inner NUL in string, ignoring field.");
                 return 0;
         }
 
         /* Let's escape weird chars, for security reasons */
         k = cescape_length(p, n);
         if (!k)
-                return -ENOMEM;
+                return log_oom_debug();
 
         free(*s);
         *s = k;
@@ -156,27 +156,24 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
 
         assert(n);
 
-        if (n->raw_size < sizeof(struct ether_header)) {
-                log_lldp("Received truncated packet, ignoring.");
-                return -EBADMSG;
-        }
+        if (n->raw_size < sizeof(struct ether_header))
+                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                      "Received truncated packet, ignoring.");
 
         memcpy(&h, LLDP_NEIGHBOR_RAW(n), sizeof(h));
 
-        if (h.ether_type != htobe16(ETHERTYPE_LLDP)) {
-                log_lldp("Received packet with wrong type, ignoring.");
-                return -EBADMSG;
-        }
+        if (h.ether_type != htobe16(ETHERTYPE_LLDP))
+                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                      "Received packet with wrong type, ignoring.");
 
         if (h.ether_dhost[0] != 0x01 ||
             h.ether_dhost[1] != 0x80 ||
             h.ether_dhost[2] != 0xc2 ||
             h.ether_dhost[3] != 0x00 ||
             h.ether_dhost[4] != 0x00 ||
-            !IN_SET(h.ether_dhost[5], 0x00, 0x03, 0x0e)) {
-                log_lldp("Received packet with wrong destination address, ignoring.");
-                return -EBADMSG;
-        }
+            !IN_SET(h.ether_dhost[5], 0x00, 0x03, 0x0e))
+                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                      "Received packet with wrong destination address, ignoring.");
 
         memcpy(&n->source_address, h.ether_shost, sizeof(struct ether_addr));
         memcpy(&n->destination_address, h.ether_dhost, sizeof(struct ether_addr));
@@ -188,27 +185,24 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
                 uint8_t type;
                 uint16_t length;
 
-                if (left < 2) {
-                        log_lldp("TLV lacks header, ignoring.");
-                        return -EBADMSG;
-                }
+                if (left < 2)
+                        return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                              "TLV lacks header, ignoring.");
 
                 type = p[0] >> 1;
                 length = p[1] + (((uint16_t) (p[0] & 1)) << 8);
                 p += 2, left -= 2;
 
-                if (left < length) {
-                        log_lldp("TLV truncated, ignoring datagram.");
-                        return -EBADMSG;
-                }
+                if (left < length)
+                        return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                              "TLV truncated, ignoring datagram.");
 
                 switch (type) {
 
                 case SD_LLDP_TYPE_END:
-                        if (length != 0) {
-                                log_lldp("End marker TLV not zero-sized, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length != 0)
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "End marker TLV not zero-sized, ignoring datagram.");
 
                         /* Note that after processing the SD_LLDP_TYPE_END left could still be > 0
                          * as the message may contain padding (see IEEE 802.1AB-2016, sec. 8.5.12) */
@@ -216,98 +210,93 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
                         goto end_marker;
 
                 case SD_LLDP_TYPE_CHASSIS_ID:
-                        if (length < 2 || length > 256) { /* includes the chassis subtype, hence one extra byte */
-                                log_lldp("Chassis ID field size out of range, ignoring datagram.");
-                                return -EBADMSG;
-                        }
-                        if (n->id.chassis_id) {
-                                log_lldp("Duplicate chassis ID field, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length < 2 || length > 256)
+                                /* includes the chassis subtype, hence one extra byte */
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "Chassis ID field size out of range, ignoring datagram.");
+
+                        if (n->id.chassis_id)
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "Duplicate chassis ID field, ignoring datagram.");
 
                         n->id.chassis_id = memdup(p, length);
                         if (!n->id.chassis_id)
-                                return -ENOMEM;
+                                return log_oom_debug();
 
                         n->id.chassis_id_size = length;
                         break;
 
                 case SD_LLDP_TYPE_PORT_ID:
-                        if (length < 2 || length > 256) { /* includes the port subtype, hence one extra byte */
-                                log_lldp("Port ID field size out of range, ignoring datagram.");
-                                return -EBADMSG;
-                        }
-                        if (n->id.port_id) {
-                                log_lldp("Duplicate port ID field, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length < 2 || length > 256)
+                                /* includes the port subtype, hence one extra byte */
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "Port ID field size out of range, ignoring datagram.");
+
+                        if (n->id.port_id)
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "Duplicate port ID field, ignoring datagram.");
 
                         n->id.port_id = memdup(p, length);
                         if (!n->id.port_id)
-                                return -ENOMEM;
+                                return log_oom_debug();
 
                         n->id.port_id_size = length;
                         break;
 
                 case SD_LLDP_TYPE_TTL:
-                        if (length != 2) {
-                                log_lldp("TTL field has wrong size, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length != 2)
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "TTL field has wrong size, ignoring datagram.");
 
-                        if (n->has_ttl) {
-                                log_lldp("Duplicate TTL field, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (n->has_ttl)
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "Duplicate TTL field, ignoring datagram.");
 
                         n->ttl = unaligned_read_be16(p);
                         n->has_ttl = true;
                         break;
 
                 case SD_LLDP_TYPE_PORT_DESCRIPTION:
-                        r = parse_string(&n->port_description, p, length);
+                        r = parse_string(n->lldp, &n->port_description, p, length);
                         if (r < 0)
                                 return r;
                         break;
 
                 case SD_LLDP_TYPE_SYSTEM_NAME:
-                        r = parse_string(&n->system_name, p, length);
+                        r = parse_string(n->lldp, &n->system_name, p, length);
                         if (r < 0)
                                 return r;
                         break;
 
                 case SD_LLDP_TYPE_SYSTEM_DESCRIPTION:
-                        r = parse_string(&n->system_description, p, length);
+                        r = parse_string(n->lldp, &n->system_description, p, length);
                         if (r < 0)
                                 return r;
                         break;
 
                 case SD_LLDP_TYPE_SYSTEM_CAPABILITIES:
                         if (length != 4)
-                                log_lldp("System capabilities field has wrong size, ignoring.");
-                        else {
-                                n->system_capabilities = unaligned_read_be16(p);
-                                n->enabled_capabilities = unaligned_read_be16(p + 2);
-                                n->has_capabilities = true;
-                        }
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "System capabilities field has wrong size.");
 
+                        n->system_capabilities = unaligned_read_be16(p);
+                        n->enabled_capabilities = unaligned_read_be16(p + 2);
+                        n->has_capabilities = true;
                         break;
 
-                case SD_LLDP_TYPE_PRIVATE: {
+                case SD_LLDP_TYPE_PRIVATE:
                         if (length < 4)
-                                log_lldp("Found private TLV that is too short, ignoring.");
-                        else {
-                                /* RFC 8520: MUD URL */
-                                if (memcmp(p, SD_LLDP_OUI_MUD, sizeof(SD_LLDP_OUI_MUD)) == 0 &&
-                                    p[sizeof(SD_LLDP_OUI_MUD)] == SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION) {
-                                        r = parse_string(&n->mud_url, p + sizeof(SD_LLDP_OUI_MUD) + 1,
-                                                         length - 1 - sizeof(SD_LLDP_OUI_MUD));
-                                        if (r < 0)
-                                                return r;
-                                }
+                                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                                      "Found private TLV that is too short, ignoring.");
+
+                        /* RFC 8520: MUD URL */
+                        if (memcmp(p, SD_LLDP_OUI_MUD, sizeof(SD_LLDP_OUI_MUD)) == 0 &&
+                            p[sizeof(SD_LLDP_OUI_MUD)] == SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION) {
+                                r = parse_string(n->lldp, &n->mud_url, p + sizeof(SD_LLDP_OUI_MUD) + 1,
+                                                 length - 1 - sizeof(SD_LLDP_OUI_MUD));
+                                if (r < 0)
+                                        return r;
                         }
-                }
-
                         break;
                 }
 
@@ -315,11 +304,9 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
         }
 
 end_marker:
-        if (!n->id.chassis_id || !n->id.port_id || !n->has_ttl) {
-                log_lldp("One or more mandatory TLV missing in datagram. Ignoring.");
-                return -EBADMSG;
-
-        }
+        if (!n->id.chassis_id || !n->id.port_id || !n->has_ttl)
+                return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+                                      "One or more mandatory TLV missing in datagram. Ignoring.");
 
         n->rindex = sizeof(struct ether_header);
 
index 9616cb6250bba70d9f51f8d30b974fd6191178e5..43141b2d7956e3bff1bca89d5d0712d65c2ec7c2 100644 (file)
@@ -22,7 +22,7 @@ int lldp_network_bind_raw_socket(int ifindex) {
                 BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ethhdr, h_proto)),     /* A <- protocol */
                 BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_LLDP, 1, 0),                /* A != ETHERTYPE_LLDP */
                 BPF_STMT(BPF_RET + BPF_K, 0),                                             /* drop packet */
-                BPF_STMT(BPF_RET + BPF_K, (uint32_t) -1),                                 /* accept packet */
+                BPF_STMT(BPF_RET + BPF_K, UINT32_MAX),                                    /* accept packet */
         };
 
         static const struct sock_fprog fprog = {
index 6bc4a3f54b56a632735fbf97b038455e9f9c9a1b..ca3393eff367425d4908f56cb35b92c7a9c7f653 100644 (file)
@@ -16,6 +16,8 @@ sources = files('''
         sd-ipv4acd.c
         arp-util.h
         arp-util.c
+        network-common.c
+        network-common.h
         network-internal.c
         network-internal.h
         sd-ndisc.c
index 70b254867bbf81bd5ec9c63989d4f55688430e57..44a7e76c21e38b0ef425c35e49a8c3819cc3bd62 100644 (file)
@@ -5,11 +5,11 @@
   Copyright © 2014 Intel Corporation. All rights reserved.
 ***/
 
-#include "log.h"
-#include "time-util.h"
-
 #include "sd-ndisc.h"
 
+#include "log-link.h"
+#include "time-util.h"
+
 #define NDISC_ROUTER_SOLICITATION_INTERVAL (4U * USEC_PER_SEC)
 #define NDISC_MAX_ROUTER_SOLICITATION_INTERVAL (3600U * USEC_PER_SEC)
 #define NDISC_MAX_ROUTER_SOLICITATIONS 3U
@@ -18,6 +18,7 @@ struct sd_ndisc {
         unsigned n_ref;
 
         int ifindex;
+        char *ifname;
         int fd;
 
         sd_event *event;
@@ -37,8 +38,18 @@ struct sd_ndisc {
         void *userdata;
 };
 
-#define log_ndisc_errno(error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "NDISC: " fmt, ##__VA_ARGS__)
-#define log_ndisc(fmt, ...) log_ndisc_errno(0, fmt, ##__VA_ARGS__)
-
 const char* ndisc_event_to_string(sd_ndisc_event_t e) _const_;
 sd_ndisc_event_t ndisc_event_from_string(const char *s) _pure_;
+
+#define log_ndisc_errno(ndisc, error, fmt, ...)                         \
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_ndisc_get_ifname(ndisc),         \
+                                    LOG_DEBUG, _e, "NDISC: " fmt,       \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
+#define log_ndisc(ndisc, fmt, ...)                       \
+        log_ndisc_errno(ndisc, 0, fmt, ##__VA_ARGS__)
index c88293a9239cf5b3d05b8cf3973f2e5c70e94c4b..46f30332bbf8ffbeb82b2e2d62760bfb39047e6e 100644 (file)
@@ -43,7 +43,7 @@ _public_ int sd_ndisc_router_from_raw(sd_ndisc_router **ret, const void *raw, si
                 return -ENOMEM;
 
         memcpy(NDISC_ROUTER_RAW(rt), raw, raw_size);
-        r = ndisc_router_parse(rt);
+        r = ndisc_router_parse(NULL, rt);
         if (r < 0)
                 return r;
 
@@ -87,7 +87,7 @@ _public_ int sd_ndisc_router_get_raw(sd_ndisc_router *rt, const void **ret, size
         return 0;
 }
 
-int ndisc_router_parse(sd_ndisc_router *rt) {
+int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt) {
         struct nd_router_advert *a;
         const uint8_t *p;
         bool has_mtu = false, has_flag_extension = false;
@@ -95,23 +95,20 @@ int ndisc_router_parse(sd_ndisc_router *rt) {
 
         assert(rt);
 
-        if (rt->raw_size < sizeof(struct nd_router_advert)) {
-                log_ndisc("Too small to be a router advertisement, ignoring.");
-                return -EBADMSG;
-        }
+        if (rt->raw_size < sizeof(struct nd_router_advert))
+                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                       "Too small to be a router advertisement, ignoring.");
 
         /* Router advertisement packets are neatly aligned to 64bit boundaries, hence we can access them directly */
         a = NDISC_ROUTER_RAW(rt);
 
-        if (a->nd_ra_type != ND_ROUTER_ADVERT) {
-                log_ndisc("Received ND packet that is not a router advertisement, ignoring.");
-                return -EBADMSG;
-        }
+        if (a->nd_ra_type != ND_ROUTER_ADVERT)
+                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                       "Received ND packet that is not a router advertisement, ignoring.");
 
-        if (a->nd_ra_code != 0) {
-                log_ndisc("Received ND packet with wrong RA code, ignoring.");
-                return -EBADMSG;
-        }
+        if (a->nd_ra_code != 0)
+                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                       "Received ND packet with wrong RA code, ignoring.");
 
         rt->hop_limit = a->nd_ra_curhoplimit;
         rt->flags = a->nd_ra_flags_reserved; /* the first 8bit */
@@ -131,36 +128,31 @@ int ndisc_router_parse(sd_ndisc_router *rt) {
                 if (left == 0)
                         break;
 
-                if (left < 2) {
-                        log_ndisc("Option lacks header, ignoring datagram.");
-                        return -EBADMSG;
-                }
+                if (left < 2)
+                        return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                               "Option lacks header, ignoring datagram.");
 
                 type = p[0];
                 length = p[1] * 8;
 
-                if (length == 0) {
-                        log_ndisc("Zero-length option, ignoring datagram.");
-                        return -EBADMSG;
-                }
-                if (left < length) {
-                        log_ndisc("Option truncated, ignoring datagram.");
-                        return -EBADMSG;
-                }
+                if (length == 0)
+                        return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                               "Zero-length option, ignoring datagram.");
+                if (left < length)
+                        return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                               "Option truncated, ignoring datagram.");
 
                 switch (type) {
 
                 case SD_NDISC_OPTION_PREFIX_INFORMATION:
 
-                        if (length != 4*8) {
-                                log_ndisc("Prefix option of invalid size, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length != 4*8)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "Prefix option of invalid size, ignoring datagram.");
 
-                        if (p[2] > 128) {
-                                log_ndisc("Bad prefix length, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (p[2] > 128)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "Bad prefix length, ignoring datagram.");
 
                         break;
 
@@ -168,14 +160,13 @@ int ndisc_router_parse(sd_ndisc_router *rt) {
                         uint32_t m;
 
                         if (has_mtu) {
-                                log_ndisc("MTU option specified twice, ignoring.");
+                                log_ndisc(nd, "MTU option specified twice, ignoring.");
                                 break;
                         }
 
-                        if (length != 8) {
-                                log_ndisc("MTU option of invalid size, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length != 8)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "MTU option of invalid size, ignoring datagram.");
 
                         m = be32toh(*(uint32_t*) (p + 4));
                         if (m >= IPV6_MIN_MTU) /* ignore invalidly small MTUs */
@@ -186,37 +177,32 @@ int ndisc_router_parse(sd_ndisc_router *rt) {
                 }
 
                 case SD_NDISC_OPTION_ROUTE_INFORMATION:
-                        if (length < 1*8 || length > 3*8) {
-                                log_ndisc("Route information option of invalid size, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (length < 1*8 || length > 3*8)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "Route information option of invalid size, ignoring datagram.");
 
-                        if (p[2] > 128) {
-                                log_ndisc("Bad route prefix length, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+                        if (p[2] > 128)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "Bad route prefix length, ignoring datagram.");
 
                         break;
 
                 case SD_NDISC_OPTION_RDNSS:
-                        if (length < 3*8 || (length % (2*8)) != 1*8) {
-                                log_ndisc("RDNSS option has invalid size.");
-                                return -EBADMSG;
-                        }
+                        if (length < 3*8 || (length % (2*8)) != 1*8)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), "RDNSS option has invalid size.");
 
                         break;
 
                 case SD_NDISC_OPTION_FLAGS_EXTENSION:
 
                         if (has_flag_extension) {
-                                log_ndisc("Flags extension option specified twice, ignoring.");
+                                log_ndisc(nd, "Flags extension option specified twice, ignoring.");
                                 break;
                         }
 
-                        if (length < 1*8) {
-                                log_ndisc("Flags extension option has invalid size.");
-                                return -EBADMSG;
-                        }
+                        if (length < 1*8)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "Flags extension option has invalid size.");
 
                         /* Add in the additional flags bits */
                         rt->flags |=
@@ -231,10 +217,9 @@ int ndisc_router_parse(sd_ndisc_router *rt) {
                         break;
 
                 case SD_NDISC_OPTION_DNSSL:
-                        if (length < 2*8) {
-                                log_ndisc("DNSSL option has invalid size.");
-                                return -EBADMSG;
-                        }
+                        if (length < 2*8)
+                                return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+                                                       "DNSSL option has invalid size.");
 
                         break;
                 }
@@ -437,7 +422,7 @@ _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret)
         flags = pi->nd_opt_pi_flags_reserved;
 
         if ((flags & ND_OPT_PI_FLAG_AUTO) && (pi->nd_opt_pi_prefix_len != 64)) {
-                log_ndisc("Invalid prefix length, ignoring prefix for stateless autoconfiguration.");
+                log_ndisc(NULL, "Invalid prefix length, ignoring prefix for stateless autoconfiguration.");
                 flags &= ~ND_OPT_PI_FLAG_AUTO;
         }
 
index cb3a56452be69f7ad3a2b45225ed19ad6b3ff377..f5293c96e01df8d4c0eebc7e05a4079b3610cf33 100644 (file)
@@ -45,4 +45,4 @@ static inline size_t NDISC_ROUTER_OPTION_LENGTH(const sd_ndisc_router *rt) {
 }
 
 sd_ndisc_router *ndisc_router_new(size_t raw_size);
-int ndisc_router_parse(sd_ndisc_router *rt);
+int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt);
diff --git a/src/libsystemd-network/network-common.c b/src/libsystemd-network/network-common.c
new file mode 100644 (file)
index 0000000..9bc0da9
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "format-util.h"
+#include "network-common.h"
+#include "string-util.h"
+
+const char *get_ifname(int ifindex, char **ifname) {
+        char buf[IF_NAMESIZE + 1];
+
+        assert(ifname);
+
+        /* This sets ifname only when it is not set yet. */
+
+        if (*ifname)
+                return *ifname;
+
+        if (ifindex <= 0)
+                return NULL;
+
+        if (!format_ifname(ifindex, buf))
+                return NULL;
+
+        return *ifname = strdup(buf);
+}
diff --git a/src/libsystemd-network/network-common.h b/src/libsystemd-network/network-common.h
new file mode 100644 (file)
index 0000000..76a6c4a
--- /dev/null
@@ -0,0 +1,4 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+const char *get_ifname(int ifindex, char **ifname);
index 3dbeffe0c65a5a3e147f7bcee04a0786b49af33b..fe5d74fda41042fce17842446e2539d46de839d1 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "sd-radv.h"
 
-#include "log.h"
+#include "log-link.h"
 #include "list.h"
 #include "sparse-endian.h"
 
@@ -41,6 +41,7 @@ struct sd_radv {
         RAdvState state;
 
         int ifindex;
+        char *ifname;
 
         sd_event *event;
         int event_priority;
@@ -124,6 +125,15 @@ struct sd_radv_route_prefix {
         LIST_FIELDS(struct sd_radv_route_prefix, prefix);
 };
 
-#define log_radv_full(level, error, fmt, ...) log_internal(level, error, PROJECT_FILE, __LINE__, __func__, "RADV: " fmt, ##__VA_ARGS__)
-#define log_radv_errno(error, fmt, ...) log_radv_full(LOG_DEBUG, error, fmt, ##__VA_ARGS__)
-#define log_radv(fmt, ...) log_radv_errno(0, fmt, ##__VA_ARGS__)
+#define log_radv_errno(radv, error, fmt, ...)                           \
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_radv_get_ifname(radv),           \
+                                    LOG_DEBUG, _e, "RADV: " fmt,        \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
+#define log_radv(radv, fmt, ...)                       \
+        log_radv_errno(radv, 0, fmt, ##__VA_ARGS__)
index dd9cbf6ea5f1716f49cd7762caea7a403872f797..d516162266a4145bcbaa1382bc60a4c2e200db21 100644 (file)
@@ -24,6 +24,7 @@
 #include "hostname-util.h"
 #include "io-util.h"
 #include "memory-util.h"
+#include "network-common.h"
 #include "random-util.h"
 #include "set.h"
 #include "sort-util.h"
@@ -76,6 +77,7 @@ struct sd_dhcp_client {
         int event_priority;
         sd_event_source *timeout_resend;
         int ifindex;
+        char *ifname;
         int fd;
         uint16_t port;
         union sockaddr_union link;
@@ -282,6 +284,23 @@ int sd_dhcp_client_set_ifindex(sd_dhcp_client *client, int ifindex) {
         return 0;
 }
 
+int sd_dhcp_client_set_ifname(sd_dhcp_client *client, const char *ifname) {
+        assert_return(client, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&client->ifname, ifname);
+}
+
+const char *sd_dhcp_client_get_ifname(sd_dhcp_client *client) {
+        if (!client)
+                return NULL;
+
+        return get_ifname(client->ifindex, &client->ifname);
+}
+
 int sd_dhcp_client_set_mac(
                 sd_dhcp_client *client,
                 const uint8_t *addr,
@@ -2205,6 +2224,7 @@ static sd_dhcp_client *dhcp_client_free(sd_dhcp_client *client) {
         client->user_class = strv_free(client->user_class);
         ordered_hashmap_free(client->extra_options);
         ordered_hashmap_free(client->vendor_options);
+        free(client->ifname);
         return mfree(client);
 }
 
@@ -2229,7 +2249,7 @@ int sd_dhcp_client_new(sd_dhcp_client **ret, int anonymize) {
                 .mtu = DHCP_DEFAULT_MIN_SIZE,
                 .port = DHCP_PORT_CLIENT,
                 .anonymize = !!anonymize,
-                .max_attempts = (uint64_t) -1,
+                .max_attempts = UINT64_MAX,
                 .ip_service_type = -1,
         };
         /* NOTE: this could be moved to a function. */
index 1c0b43116557da54b53e69a727008e9afeddde7f..6d88c88e6bb794c6ac3e9360c80f4b0bdec65653 100644 (file)
@@ -869,7 +869,7 @@ int dhcp_lease_new(sd_dhcp_lease **ret) {
 }
 
 int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
-        _cleanup_free_ char *temp_path = NULL;
+        _cleanup_(unlink_and_freep) char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
         struct sd_dhcp_raw_option *option;
         struct in_addr address;
@@ -889,7 +889,7 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
 
         r = fopen_temporary(lease_file, &f, &temp_path);
         if (r < 0)
-                goto fail;
+                return r;
 
         (void) fchmod(fileno(f), 0644);
 
@@ -992,10 +992,8 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
                 _cleanup_free_ char *client_id_hex = NULL;
 
                 client_id_hex = hexmem(client_id, client_id_len);
-                if (!client_id_hex) {
-                        r = -ENOMEM;
-                        goto fail;
-                }
+                if (!client_id_hex)
+                        return -ENOMEM;
                 fprintf(f, "CLIENTID=%s\n", client_id_hex);
         }
 
@@ -1004,10 +1002,8 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
                 _cleanup_free_ char *option_hex = NULL;
 
                 option_hex = hexmem(data, data_len);
-                if (!option_hex) {
-                        r = -ENOMEM;
-                        goto fail;
-                }
+                if (!option_hex)
+                        return -ENOMEM;
                 fprintf(f, "VENDOR_SPECIFIC=%s\n", option_hex);
         }
 
@@ -1017,28 +1013,23 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
                 xsprintf(key, "OPTION_%" PRIu8, option->tag);
                 r = serialize_dhcp_option(f, key, option->data, option->length);
                 if (r < 0)
-                        goto fail;
+                        return r;
         }
 
         r = fflush_and_check(f);
         if (r < 0)
-                goto fail;
+                return r;
 
         r = conservative_rename(temp_path, lease_file);
         if (r < 0)
-                goto fail;
-
-        return 0;
+                return r;
 
-fail:
-        if (temp_path)
-                (void) unlink(temp_path);
+        temp_path = mfree(temp_path);
 
-        return log_error_errno(r, "Failed to save lease data %s: %m", lease_file);
+        return 0;
 }
 
 int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
-
         _cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL;
         _cleanup_free_ char
                 *address = NULL,
@@ -1266,13 +1257,13 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
         }
 
         if (client_id_hex) {
-                r = unhexmem(client_id_hex, (size_t) -1, &lease->client_id, &lease->client_id_len);
+                r = unhexmem(client_id_hex, SIZE_MAX, &lease->client_id, &lease->client_id_len);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse client ID %s, ignoring: %m", client_id_hex);
         }
 
         if (vendor_specific_hex) {
-                r = unhexmem(vendor_specific_hex, (size_t) -1, &lease->vendor_specific, &lease->vendor_specific_len);
+                r = unhexmem(vendor_specific_hex, SIZE_MAX, &lease->vendor_specific, &lease->vendor_specific_len);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse vendor specific data %s, ignoring: %m", vendor_specific_hex);
         }
@@ -1284,7 +1275,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
                 if (!options[i])
                         continue;
 
-                r = unhexmem(options[i], (size_t) -1, &data, &len);
+                r = unhexmem(options[i], SIZE_MAX, &data, &len);
                 if (r < 0) {
                         log_debug_errno(r, "Failed to parse private DHCP option %s, ignoring: %m", options[i]);
                         continue;
index d0e249b104b9cdedb0c495b456b10c9486090392..0036cddbf93cd031e601e486eb978ecb759cfc53 100644 (file)
@@ -15,6 +15,7 @@
 #include "fd-util.h"
 #include "in-addr-util.h"
 #include "io-util.h"
+#include "network-common.h"
 #include "ordered-set.h"
 #include "siphash24.h"
 #include "string-util.h"
@@ -158,6 +159,8 @@ static sd_dhcp_server *dhcp_server_free(sd_dhcp_server *server) {
         ordered_set_free(server->vendor_options);
 
         free(server->bound_leases);
+
+        free(server->ifname);
         return mfree(server);
 }
 
@@ -169,29 +172,47 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
         assert_return(ret, -EINVAL);
         assert_return(ifindex > 0, -EINVAL);
 
-        server = new0(sd_dhcp_server, 1);
+        server = new(sd_dhcp_server, 1);
         if (!server)
                 return -ENOMEM;
 
-        server->n_ref = 1;
-        server->fd_raw = -1;
-        server->fd = -1;
-        server->address = htobe32(INADDR_ANY);
-        server->netmask = htobe32(INADDR_ANY);
-        server->ifindex = ifindex;
+        *server = (sd_dhcp_server) {
+                .n_ref = 1,
+                .fd_raw = -1,
+                .fd = -1,
+                .address = htobe32(INADDR_ANY),
+                .netmask = htobe32(INADDR_ANY),
+                .ifindex = ifindex,
+                .default_lease_time = DIV_ROUND_UP(DHCP_DEFAULT_LEASE_TIME_USEC, USEC_PER_SEC),
+                .max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC),
+        };
 
         server->leases_by_client_id = hashmap_new(&dhcp_lease_hash_ops);
         if (!server->leases_by_client_id)
                 return -ENOMEM;
 
-        server->default_lease_time = DIV_ROUND_UP(DHCP_DEFAULT_LEASE_TIME_USEC, USEC_PER_SEC);
-        server->max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC);
-
         *ret = TAKE_PTR(server);
 
         return 0;
 }
 
+int sd_dhcp_server_set_ifname(sd_dhcp_server *server, const char *ifname) {
+        assert_return(server, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&server->ifname, ifname);
+}
+
+const char *sd_dhcp_server_get_ifname(sd_dhcp_server *server) {
+        if (!server)
+                return NULL;
+
+        return get_ifname(server->ifindex, &server->ifname);
+}
+
 int sd_dhcp_server_attach_event(sd_dhcp_server *server, sd_event *event, int64_t priority) {
         int r;
 
@@ -425,66 +446,23 @@ static int server_message_init(sd_dhcp_server *server, DHCPPacket **ret,
         return 0;
 }
 
-static int server_send_offer(sd_dhcp_server *server, DHCPRequest *req,
-                             be32_t address) {
-        _cleanup_free_ DHCPPacket *packet = NULL;
-        size_t offset;
-        be32_t lease_time;
-        int r;
-
-        r = server_message_init(server, &packet, DHCP_OFFER, &offset, req);
-        if (r < 0)
-                return r;
-
-        packet->dhcp.yiaddr = address;
-
-        lease_time = htobe32(req->lifetime);
-        r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
-                               SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, 4,
-                               &lease_time);
-        if (r < 0)
-                return r;
-
-        r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
-                               SD_DHCP_OPTION_SUBNET_MASK, 4, &server->netmask);
-        if (r < 0)
-                return r;
-
-        if (server->emit_router) {
-                r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
-                                       SD_DHCP_OPTION_ROUTER, 4, &server->address);
-                if (r < 0)
-                        return r;
-        }
-
-        r = dhcp_server_send_packet(server, req, packet, DHCP_OFFER, offset);
-        if (r < 0)
-                return r;
-
-        return 0;
-}
-
-static int server_send_ack(
+static int server_send_offer_or_ack(
                 sd_dhcp_server *server,
                 DHCPRequest *req,
-                be32_t address) {
-
-        static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
-                [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
-                [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
-                [SD_DHCP_LEASE_SIP] = SD_DHCP_OPTION_SIP_SERVER,
-                [SD_DHCP_LEASE_POP3] = SD_DHCP_OPTION_POP3_SERVER,
-                [SD_DHCP_LEASE_SMTP] = SD_DHCP_OPTION_SMTP_SERVER,
-                [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
-        };
+                be32_t address,
+                uint8_t type) {
 
         _cleanup_free_ DHCPPacket *packet = NULL;
-        be32_t lease_time;
         sd_dhcp_option *j;
+        be32_t lease_time;
         size_t offset;
         int r;
 
-        r = server_message_init(server, &packet, DHCP_ACK, &offset, req);
+        assert(server);
+        assert(req);
+        assert(IN_SET(type, DHCP_OFFER, DHCP_ACK));
+
+        r = server_message_init(server, &packet, type, &offset, req);
         if (r < 0)
                 return r;
 
@@ -509,27 +487,38 @@ static int server_send_ack(
                         return r;
         }
 
-        for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
-
-                if (server->servers[k].size <= 0)
-                        continue;
-
-                r = dhcp_option_append(
-                                &packet->dhcp, req->max_optlen, &offset, 0,
-                                option_map[k],
-                                sizeof(struct in_addr) * server->servers[k].size, server->servers[k].addr);
-                if (r < 0)
-                        return r;
-        }
+        if (type == DHCP_ACK) {
+                static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
+                        [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
+                        [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
+                        [SD_DHCP_LEASE_SIP] = SD_DHCP_OPTION_SIP_SERVER,
+                        [SD_DHCP_LEASE_POP3] = SD_DHCP_OPTION_POP3_SERVER,
+                        [SD_DHCP_LEASE_SMTP] = SD_DHCP_OPTION_SMTP_SERVER,
+                        [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
+                };
+
+                for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
+                        if (server->servers[k].size <= 0)
+                                continue;
+
+                        r = dhcp_option_append(
+                                        &packet->dhcp, req->max_optlen, &offset, 0,
+                                        option_map[k],
+                                        sizeof(struct in_addr) * server->servers[k].size,
+                                        server->servers[k].addr);
+                        if (r < 0)
+                                return r;
+                }
 
 
-        if (server->timezone) {
-                r = dhcp_option_append(
-                                &packet->dhcp, req->max_optlen, &offset, 0,
-                                SD_DHCP_OPTION_NEW_TZDB_TIMEZONE,
-                                strlen(server->timezone), server->timezone);
-                if (r < 0)
-                        return r;
+                if (server->timezone) {
+                        r = dhcp_option_append(
+                                        &packet->dhcp, req->max_optlen, &offset, 0,
+                                        SD_DHCP_OPTION_NEW_TZDB_TIMEZONE,
+                                        strlen(server->timezone), server->timezone);
+                        if (r < 0)
+                                return r;
+                }
         }
 
         ORDERED_SET_FOREACH(j, server->extra_options) {
@@ -548,7 +537,7 @@ static int server_send_ack(
                         return r;
         }
 
-        r = dhcp_server_send_packet(server, req, packet, DHCP_ACK, offset);
+        r = dhcp_server_send_packet(server, req, packet, type, offset);
         if (r < 0)
                 return r;
 
@@ -783,7 +772,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
                         /* no free addresses left */
                         return 0;
 
-                r = server_send_offer(server, req, address);
+                r = server_send_offer_or_ack(server, req, address, DHCP_OFFER);
                 if (r < 0)
                         /* this only fails on critical errors */
                         return log_dhcp_server_errno(server, r, "Could not send offer: %m");
@@ -886,7 +875,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
 
                         lease->expiration = req->lifetime * USEC_PER_SEC + time_now;
 
-                        r = server_send_ack(server, req, address);
+                        r = server_send_offer_or_ack(server, req, address, DHCP_ACK);
                         if (r < 0) {
                                 /* this only fails on critical errors */
                                 log_dhcp_server_errno(server, r, "Could not send ack: %m");
index 410bfda10eaaab91f96f466c3e55be7a40eea771..c8a4c79ffe6e52f21c4cc2d34b387ee7b60ba347 100644 (file)
@@ -21,6 +21,7 @@
 #include "hexdecoct.h"
 #include "hostname-util.h"
 #include "in-addr-util.h"
+#include "network-common.h"
 #include "random-util.h"
 #include "socket-util.h"
 #include "string-table.h"
@@ -47,6 +48,7 @@ struct sd_dhcp6_client {
         sd_event *event;
         int event_priority;
         int ifindex;
+        char *ifname;
         DHCP6Address hint_pd_prefix;
         struct in6_addr local_address;
         uint8_t mac_addr[MAX_MAC_ADDR_LEN];
@@ -165,6 +167,23 @@ int sd_dhcp6_client_set_ifindex(sd_dhcp6_client *client, int ifindex) {
         return 0;
 }
 
+int sd_dhcp6_client_set_ifname(sd_dhcp6_client *client, const char *ifname) {
+        assert_return(client, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&client->ifname, ifname);
+}
+
+const char *sd_dhcp6_client_get_ifname(sd_dhcp6_client *client) {
+        if (!client)
+                return NULL;
+
+        return get_ifname(client->ifindex, &client->ifname);
+}
+
 int sd_dhcp6_client_set_local_address(
                 sd_dhcp6_client *client,
                 const struct in6_addr *local_address) {
@@ -1172,7 +1191,7 @@ static int client_parse_message(
                                 break;
                         }
 
-                        r = dhcp6_option_parse_ia(option, &lease->ia, &ia_na_status);
+                        r = dhcp6_option_parse_ia(client, option, &lease->ia, &ia_na_status);
                         if (r < 0 && r != -ENOMSG)
                                 return r;
 
@@ -1205,7 +1224,7 @@ static int client_parse_message(
                                 break;
                         }
 
-                        r = dhcp6_option_parse_ia(option, &lease->pd, &ia_pd_status);
+                        r = dhcp6_option_parse_ia(client, option, &lease->pd, &ia_pd_status);
                         if (r < 0 && r != -ENOMSG)
                                 return r;
 
@@ -1787,6 +1806,7 @@ static sd_dhcp6_client *dhcp6_client_free(sd_dhcp6_client *client) {
         ordered_hashmap_free(client->extra_options);
         strv_free(client->user_class);
         strv_free(client->vendor_class);
+        free(client->ifname);
 
         return mfree(client);
 }
index d6f0708c942a81220485288113bd692195d06091..aca2c1f7e072546929bf5a2d7beb3965bb0cab85 100644 (file)
@@ -206,7 +206,7 @@ int dhcp6_lease_set_dns(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) {
                                         lease->dns_count,
                                         &lease->dns_allocated);
         if (r < 0)
-                return log_dhcp6_client_errno(client, r, "Invalid DNS server option: %m");
+                return r;
 
         lease->dns_count = r;
 
@@ -321,19 +321,16 @@ int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen)
         if (!optlen)
                 return 0;
 
-        if (lease->ntp || lease->ntp_fqdn) {
-                log_dhcp6_client(client, "NTP information already provided");
+        if (lease->ntp || lease->ntp_fqdn)
+                return -EEXIST;
 
-                return 0;
-        }
-
-        log_dhcp6_client(client, "Using deprecated SNTP information");
+        /* Using deprecated SNTP information */
 
         r = dhcp6_option_parse_ip6addrs(optval, optlen, &lease->ntp,
                                         lease->ntp_count,
                                         &lease->ntp_allocated);
         if (r < 0)
-                return log_dhcp6_client_errno(client, r, "Invalid SNTP server option: %m");
+                return r;
 
         lease->ntp_count = r;
 
index defd23d85a76201d0b424aea308e6b31b62a80c4..643bdc4ba9ca34dec946f7fe10ef1cdd257e72d9 100644 (file)
@@ -16,9 +16,9 @@
 #include "ether-addr-util.h"
 #include "event-util.h"
 #include "fd-util.h"
-#include "format-util.h"
 #include "in-addr-util.h"
 #include "log-link.h"
+#include "network-common.h"
 #include "random-util.h"
 #include "siphash24.h"
 #include "string-table.h"
@@ -56,7 +56,7 @@ struct sd_ipv4acd {
         int ifindex;
         int fd;
 
-        char ifname[IF_NAMESIZE + 1];
+        char *ifname;
         unsigned n_iteration;
         unsigned n_conflict;
 
@@ -76,7 +76,15 @@ struct sd_ipv4acd {
 };
 
 #define log_ipv4acd_errno(acd, error, fmt, ...)                         \
-        log_interface_full_errno(sd_ipv4acd_get_ifname(acd), LOG_DEBUG, error, "IPV4ACD: " fmt, ##__VA_ARGS__)
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_ipv4acd_get_ifname(acd),         \
+                                    LOG_DEBUG, _e, "IPv4ACD: " fmt,     \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
 #define log_ipv4acd(acd, fmt, ...)                      \
         log_ipv4acd_errno(acd, 0, fmt, ##__VA_ARGS__)
 
@@ -125,7 +133,7 @@ static sd_ipv4acd *ipv4acd_free(sd_ipv4acd *acd) {
 
         ipv4acd_reset(acd);
         sd_ipv4acd_detach_event(acd);
-
+        free(acd->ifname);
         return mfree(acd);
 }
 
@@ -398,16 +406,10 @@ fail:
 }
 
 int sd_ipv4acd_set_ifindex(sd_ipv4acd *acd, int ifindex) {
-        char ifname[IF_NAMESIZE + 1];
-
         assert_return(acd, -EINVAL);
         assert_return(ifindex > 0, -EINVAL);
         assert_return(acd->state == IPV4ACD_STATE_INIT, -EBUSY);
 
-        if (!format_ifname(ifindex, ifname))
-                return -ENODEV;
-
-        strcpy(acd->ifname, ifname);
         acd->ifindex = ifindex;
 
         return 0;
@@ -420,11 +422,21 @@ int sd_ipv4acd_get_ifindex(sd_ipv4acd *acd) {
         return acd->ifindex;
 }
 
+int sd_ipv4acd_set_ifname(sd_ipv4acd *acd, const char *ifname) {
+        assert_return(acd, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&acd->ifname, ifname);
+}
+
 const char *sd_ipv4acd_get_ifname(sd_ipv4acd *acd) {
         if (!acd)
                 return NULL;
 
-        return empty_to_null(acd->ifname);
+        return get_ifname(acd->ifindex, &acd->ifname);
 }
 
 int sd_ipv4acd_set_mac(sd_ipv4acd *acd, const struct ether_addr *addr) {
index a83c9b06de50d7557286449e58b95cc287866183..49e9350fba51363c9c7bbd98f8ca19ed92eab633 100644 (file)
@@ -50,7 +50,15 @@ struct sd_ipv4ll {
 };
 
 #define log_ipv4ll_errno(ll, error, fmt, ...)                           \
-        log_interface_full_errno(sd_ipv4ll_get_ifname(ll), LOG_DEBUG, error, "IPV4LL: " fmt, ##__VA_ARGS__)
+        ({                                                              \
+                int _e = (error);                                       \
+                if (DEBUG_LOGGING)                                      \
+                        log_interface_full_errno(                       \
+                                    sd_ipv4ll_get_ifname(ll),           \
+                                    LOG_DEBUG, _e, "IPv4LL: " fmt,      \
+                                    ##__VA_ARGS__);                     \
+                -ERRNO_VALUE(_e);                                       \
+        })
 #define log_ipv4ll(ll, fmt, ...)                        \
         log_ipv4ll_errno(ll, 0, fmt, ##__VA_ARGS__)
 
@@ -112,6 +120,13 @@ int sd_ipv4ll_get_ifindex(sd_ipv4ll *ll) {
         return sd_ipv4acd_get_ifindex(ll->acd);
 }
 
+int sd_ipv4ll_set_ifname(sd_ipv4ll *ll, const char *ifname) {
+        assert_return(ll, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        return sd_ipv4acd_set_ifname(ll->acd, ifname);
+}
+
 const char *sd_ipv4ll_get_ifname(sd_ipv4ll *ll) {
         if (!ll)
                 return NULL;
index d3848ebf91cdddfbc733303065b1f929d0136b1a..49aa876a530f2714b2ecc83505a1b68cd3f670cf 100644 (file)
@@ -14,6 +14,7 @@
 #include "lldp-neighbor.h"
 #include "lldp-network.h"
 #include "memory-util.h"
+#include "network-common.h"
 #include "socket-util.h"
 #include "sort-util.h"
 #include "string-table.h"
@@ -39,12 +40,10 @@ static void lldp_callback(sd_lldp *lldp, sd_lldp_event_t event, sd_lldp_neighbor
         assert(lldp);
         assert(event >= 0 && event < _SD_LLDP_EVENT_MAX);
 
-        if (!lldp->callback) {
-                log_lldp("Received '%s' event.", lldp_event_to_string(event));
-                return;
-        }
+        if (!lldp->callback)
+                return (void) log_lldp(lldp, "Received '%s' event.", lldp_event_to_string(event));
 
-        log_lldp("Invoking callback for '%s' event.", lldp_event_to_string(event));
+        log_lldp(lldp, "Invoking callback for '%s' event.", lldp_event_to_string(event));
         lldp->callback(lldp, event, n, lldp->userdata);
 }
 
@@ -186,11 +185,11 @@ static int lldp_handle_datagram(sd_lldp *lldp, sd_lldp_neighbor *n) {
 
         r = lldp_add_neighbor(lldp, n);
         if (r < 0) {
-                log_lldp_errno(r, "Failed to add datagram. Ignoring.");
+                log_lldp_errno(lldp, r, "Failed to add datagram. Ignoring.");
                 return 0;
         }
 
-        log_lldp("Successfully processed LLDP datagram.");
+        log_lldp(lldp, "Successfully processed LLDP datagram.");
         return 0;
 }
 
@@ -204,8 +203,10 @@ static int lldp_receive_datagram(sd_event_source *s, int fd, uint32_t revents, v
         assert(lldp);
 
         space = next_datagram_size_fd(fd);
-        if (space < 0)
-                return log_lldp_errno(space, "Failed to determine datagram size to read: %m");
+        if (space < 0) {
+                log_lldp_errno(lldp, space, "Failed to determine datagram size to read, ignoring: %m");
+                return 0;
+        }
 
         n = lldp_neighbor_new(space);
         if (!n)
@@ -216,12 +217,13 @@ static int lldp_receive_datagram(sd_event_source *s, int fd, uint32_t revents, v
                 if (IN_SET(errno, EAGAIN, EINTR))
                         return 0;
 
-                return log_lldp_errno(errno, "Failed to read LLDP datagram: %m");
+                log_lldp_errno(lldp, errno, "Failed to read LLDP datagram, ignoring: %m");
+                return 0;
         }
 
         if ((size_t) length != n->raw_size) {
-                log_lldp("Packet size mismatch.");
-                return -EINVAL;
+                log_lldp(lldp, "Packet size mismatch, ignoring");
+                return 0;
         }
 
         /* Try to get the timestamp of this packet if it is known */
@@ -267,7 +269,7 @@ _public_ int sd_lldp_start(sd_lldp *lldp) {
 
         (void) sd_event_source_set_description(lldp->io_event_source, "lldp-io");
 
-        log_lldp("Started LLDP client");
+        log_lldp(lldp, "Started LLDP client");
         return 1;
 
 fail:
@@ -282,7 +284,7 @@ _public_ int sd_lldp_stop(sd_lldp *lldp) {
         if (lldp->fd < 0)
                 return 0;
 
-        log_lldp("Stopping LLDP client");
+        log_lldp(lldp, "Stopping LLDP client");
 
         lldp_reset(lldp);
         lldp_flush_neighbors(lldp);
@@ -343,6 +345,23 @@ _public_ int sd_lldp_set_ifindex(sd_lldp *lldp, int ifindex) {
         return 0;
 }
 
+int sd_lldp_set_ifname(sd_lldp *lldp, const char *ifname) {
+        assert_return(lldp, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&lldp->ifname, ifname);
+}
+
+const char *sd_lldp_get_ifname(sd_lldp *lldp) {
+        if (!lldp)
+                return NULL;
+
+        return get_ifname(lldp->ifindex, &lldp->ifname);
+}
+
 static sd_lldp* lldp_free(sd_lldp *lldp) {
         assert(lldp);
 
@@ -354,6 +373,7 @@ static sd_lldp* lldp_free(sd_lldp *lldp) {
 
         hashmap_free(lldp->neighbor_by_id);
         prioq_free(lldp->neighbor_by_expiry);
+        free(lldp->ifname);
         return mfree(lldp);
 }
 
@@ -373,7 +393,7 @@ _public_ int sd_lldp_new(sd_lldp **ret) {
                 .n_ref = 1,
                 .fd = -1,
                 .neighbors_max = LLDP_DEFAULT_NEIGHBORS_MAX,
-                .capability_mask = (uint16_t) -1,
+                .capability_mask = UINT16_MAX,
         };
 
         lldp->neighbor_by_id = hashmap_new(&lldp_neighbor_hash_ops);
@@ -398,12 +418,16 @@ static int on_timer_event(sd_event_source *s, uint64_t usec, void *userdata) {
         int r;
 
         r = lldp_make_space(lldp, 0);
-        if (r < 0)
-                return log_lldp_errno(r, "Failed to make space: %m");
+        if (r < 0) {
+                log_lldp_errno(lldp, r, "Failed to make space, ignoring: %m");
+                return 0;
+        }
 
         r = lldp_start_timer(lldp, NULL);
-        if (r < 0)
-                return log_lldp_errno(r, "Failed to restart timer: %m");
+        if (r < 0) {
+                log_lldp_errno(lldp, r, "Failed to restart timer, ignoring: %m");
+                return 0;
+        }
 
         return 0;
 }
index 8f04001755ac4c85e61962f3c44a204ac8cb798d..4d5f1b54cd4d5f01a50604a3d3cba9c5ffd446fa 100644 (file)
@@ -16,6 +16,7 @@
 #include "memory-util.h"
 #include "ndisc-internal.h"
 #include "ndisc-router.h"
+#include "network-common.h"
 #include "random-util.h"
 #include "socket-util.h"
 #include "string-table.h"
@@ -34,12 +35,10 @@ static void ndisc_callback(sd_ndisc *ndisc, sd_ndisc_event_t event, sd_ndisc_rou
         assert(ndisc);
         assert(event >= 0 && event < _SD_NDISC_EVENT_MAX);
 
-        if (!ndisc->callback) {
-                log_ndisc("Received '%s' event.", ndisc_event_to_string(event));
-                return;
-        }
+        if (!ndisc->callback)
+                return (void) log_ndisc(ndisc, "Received '%s' event.", ndisc_event_to_string(event));
 
-        log_ndisc("Invoking callback for '%s' event.", ndisc_event_to_string(event));
+        log_ndisc(ndisc, "Invoking callback for '%s' event.", ndisc_event_to_string(event));
         ndisc->callback(ndisc, event, rt, ndisc->userdata);
 }
 
@@ -65,6 +64,23 @@ _public_ int sd_ndisc_set_ifindex(sd_ndisc *nd, int ifindex) {
         return 0;
 }
 
+int sd_ndisc_set_ifname(sd_ndisc *nd, const char *ifname) {
+        assert_return(nd, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&nd->ifname, ifname);
+}
+
+const char *sd_ndisc_get_ifname(sd_ndisc *nd) {
+        if (!nd)
+                return NULL;
+
+        return get_ifname(nd->ifindex, &nd->ifname);
+}
+
 _public_ int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr) {
         assert_return(nd, -EINVAL);
 
@@ -129,6 +145,7 @@ static sd_ndisc *ndisc_free(sd_ndisc *nd) {
 
         ndisc_reset(nd);
         sd_ndisc_detach_event(nd);
+        free(nd->ifname);
         return mfree(nd);
 }
 
@@ -181,7 +198,7 @@ static int ndisc_handle_datagram(sd_ndisc *nd, sd_ndisc_router *rt) {
         assert(nd);
         assert(rt);
 
-        r = ndisc_router_parse(rt);
+        r = ndisc_router_parse(nd, rt);
         if (r == -EBADMSG) /* Bad packet */
                 return 0;
         if (r < 0)
@@ -193,7 +210,7 @@ static int ndisc_handle_datagram(sd_ndisc *nd, sd_ndisc_router *rt) {
         if (rt->hop_limit > 0)
                 nd->hop_limit = rt->hop_limit;
 
-        log_ndisc("Received Router Advertisement: flags %s preference %s lifetime %" PRIu16 " sec",
+        log_ndisc(nd, "Received Router Advertisement: flags %s preference %s lifetime %" PRIu16 " sec",
                   rt->flags & ND_RA_FLAG_MANAGED ? "MANAGED" : rt->flags & ND_RA_FLAG_OTHER ? "OTHER" : "none",
                   rt->preference == SD_NDISC_PREFERENCE_HIGH ? "high" : rt->preference == SD_NDISC_PREFERENCE_LOW ? "low" : "medium",
                   rt->lifetime);
@@ -214,8 +231,10 @@ static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userda
         assert(nd->event);
 
         buflen = next_datagram_size_fd(fd);
-        if (buflen < 0)
-                return log_ndisc_errno(buflen, "Failed to determine datagram size to read: %m");
+        if (buflen < 0) {
+                log_ndisc_errno(nd, buflen, "Failed to determine datagram size to read, ignoring: %m");
+                return 0;
+        }
 
         rt = ndisc_router_new(buflen);
         if (!rt)
@@ -226,22 +245,22 @@ static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userda
                 switch (r) {
                 case -EADDRNOTAVAIL:
                         (void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &rt->address, &addr);
-                        log_ndisc("Received RA from non-link-local address %s. Ignoring", addr);
+                        log_ndisc(nd, "Received RA from non-link-local address %s. Ignoring", addr);
                         break;
 
                 case -EMULTIHOP:
-                        log_ndisc("Received RA with invalid hop limit. Ignoring.");
+                        log_ndisc(nd, "Received RA with invalid hop limit. Ignoring.");
                         break;
 
                 case -EPFNOSUPPORT:
-                        log_ndisc("Received invalid source address from ICMPv6 socket. Ignoring.");
+                        log_ndisc(nd, "Received invalid source address from ICMPv6 socket. Ignoring.");
                         break;
 
                 case -EAGAIN: /* ignore spurious wakeups */
                         break;
 
                 default:
-                        log_ndisc_errno(r, "Unexpected error while reading from ICMPv6, ignoring: %m");
+                        log_ndisc_errno(nd, r, "Unexpected error while reading from ICMPv6, ignoring: %m");
                         break;
                 }
 
@@ -290,11 +309,11 @@ static int ndisc_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
 
         r = icmp6_send_router_solicitation(nd->fd, &nd->mac_addr);
         if (r < 0) {
-                log_ndisc_errno(r, "Error sending Router Solicitation: %m");
+                log_ndisc_errno(nd, r, "Error sending Router Solicitation: %m");
                 goto fail;
         }
 
-        log_ndisc("Sent Router Solicitation, next solicitation in %s",
+        log_ndisc(nd, "Sent Router Solicitation, next solicitation in %s",
                   format_timespan(time_string, FORMAT_TIMESPAN_MAX,
                                   nd->retransmit_time, USEC_PER_SEC));
 
@@ -311,7 +330,7 @@ static int ndisc_timeout_no_ra(sd_event_source *s, uint64_t usec, void *userdata
         assert(s);
         assert(nd);
 
-        log_ndisc("No RA received before link confirmation timeout");
+        log_ndisc(nd, "No RA received before link confirmation timeout");
 
         (void) event_source_disable(nd->timeout_no_ra);
         ndisc_callback(nd, SD_NDISC_EVENT_TIMEOUT, NULL);
@@ -326,7 +345,7 @@ _public_ int sd_ndisc_stop(sd_ndisc *nd) {
         if (nd->fd < 0)
                 return 0;
 
-        log_ndisc("Stopping IPv6 Router Solicitation client");
+        log_ndisc(nd, "Stopping IPv6 Router Solicitation client");
 
         ndisc_reset(nd);
         return 1;
@@ -379,7 +398,7 @@ _public_ int sd_ndisc_start(sd_ndisc *nd) {
         if (r < 0)
                 goto fail;
 
-        log_ndisc("Started IPv6 Router Solicitation client");
+        log_ndisc(nd, "Started IPv6 Router Solicitation client");
         return 1;
 
 fail:
index 164b24c6847f40ea49e2bf035fad4b61414a594b..857401bf6e06df3245ad54769c5153681782250e 100644 (file)
@@ -19,6 +19,7 @@
 #include "io-util.h"
 #include "macro.h"
 #include "memory-util.h"
+#include "network-common.h"
 #include "radv-internal.h"
 #include "random-util.h"
 #include "socket-util.h"
@@ -122,6 +123,7 @@ static sd_radv *radv_free(sd_radv *ra) {
         sd_radv_detach_event(ra);
 
         ra->fd = safe_close(ra->fd);
+        free(ra->ifname);
 
         return mfree(ra);
 }
@@ -245,22 +247,22 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
                 switch (r) {
                 case -EADDRNOTAVAIL:
                         (void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &src, &addr);
-                        log_radv("Received RS from non-link-local address %s. Ignoring", addr);
+                        log_radv(ra, "Received RS from non-link-local address %s. Ignoring", addr);
                         break;
 
                 case -EMULTIHOP:
-                        log_radv("Received RS with invalid hop limit. Ignoring.");
+                        log_radv(ra, "Received RS with invalid hop limit. Ignoring.");
                         break;
 
                 case -EPFNOSUPPORT:
-                        log_radv("Received invalid source address from ICMPv6 socket. Ignoring.");
+                        log_radv(ra, "Received invalid source address from ICMPv6 socket. Ignoring.");
                         break;
 
                 case -EAGAIN: /* ignore spurious wakeups */
                         break;
 
                 default:
-                        log_radv_errno(r, "Unexpected error receiving from ICMPv6 socket: %m");
+                        log_radv_errno(ra, r, "Unexpected error receiving from ICMPv6 socket, Ignoring: %m");
                         break;
                 }
 
@@ -268,7 +270,7 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
         }
 
         if ((size_t) buflen < sizeof(struct nd_router_solicit)) {
-                log_radv("Too short packet received");
+                log_radv(ra, "Too short packet received, ignoring");
                 return 0;
         }
 
@@ -276,9 +278,9 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
 
         r = radv_send(ra, &src, ra->lifetime);
         if (r < 0)
-                log_radv_errno(r, "Unable to send solicited Router Advertisement to %s: %m", strnull(addr));
+                log_radv_errno(ra, r, "Unable to send solicited Router Advertisement to %s, ignoring: %m", strnull(addr));
         else
-                log_radv("Sent solicited Router Advertisement to %s", strnull(addr));
+                log_radv(ra, "Sent solicited Router Advertisement to %s", strnull(addr));
 
         return 0;
 }
@@ -311,7 +313,7 @@ static int radv_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
 
         r = radv_send(ra, NULL, ra->lifetime);
         if (r < 0)
-                log_radv_errno(r, "Unable to send Router Advertisement: %m");
+                log_radv_errno(ra, r, "Unable to send Router Advertisement: %m");
 
         /* RFC 4861, Section 6.2.4, sending initial Router Advertisements */
         if (ra->ra_sent < SD_RADV_MAX_INITIAL_RTR_ADVERTISEMENTS) {
@@ -328,7 +330,7 @@ static int radv_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
 
         timeout = radv_compute_timeout(min_timeout, max_timeout);
 
-        log_radv("Next Router Advertisement in %s",
+        log_radv(ra, "Next Router Advertisement in %s",
                  format_timespan(time_string, FORMAT_TIMESPAN_MAX,
                                  timeout, USEC_PER_SEC));
 
@@ -359,13 +361,13 @@ _public_ int sd_radv_stop(sd_radv *ra) {
         if (ra->state == SD_RADV_STATE_IDLE)
                 return 0;
 
-        log_radv("Stopping IPv6 Router Advertisement daemon");
+        log_radv(ra, "Stopping IPv6 Router Advertisement daemon");
 
         /* RFC 4861, Section 6.2.5, send at least one Router Advertisement
            with zero lifetime  */
         r = radv_send(ra, NULL, 0);
         if (r < 0)
-                log_radv_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
+                log_radv_errno(ra, r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
 
         radv_reset(ra);
         ra->fd = safe_close(ra->fd);
@@ -410,7 +412,7 @@ _public_ int sd_radv_start(sd_radv *ra) {
 
         ra->state = SD_RADV_STATE_ADVERTISING;
 
-        log_radv("Started IPv6 Router Advertisement daemon");
+        log_radv(ra, "Started IPv6 Router Advertisement daemon");
 
         return 0;
 
@@ -432,6 +434,23 @@ _public_ int sd_radv_set_ifindex(sd_radv *ra, int ifindex) {
         return 0;
 }
 
+int sd_radv_set_ifname(sd_radv *ra, const char *ifname) {
+        assert_return(ra, -EINVAL);
+        assert_return(ifname, -EINVAL);
+
+        if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+                return -EINVAL;
+
+        return free_and_strdup(&ra->ifname, ifname);
+}
+
+const char *sd_radv_get_ifname(sd_radv *ra) {
+        if (!ra)
+                return NULL;
+
+        return get_ifname(ra->ifindex, &ra->ifname);
+}
+
 _public_ int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr) {
         assert_return(ra, -EINVAL);
 
@@ -562,10 +581,9 @@ _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {
                 (void) in_addr_prefix_to_string(AF_INET6,
                                                 (const union in_addr_union*) &cur->opt.in6_addr,
                                                 cur->opt.prefixlen, &addr_cur);
-                log_radv("IPv6 prefix %s already configured, ignoring %s",
-                         strna(addr_cur), strna(addr_p));
-
-                return -EEXIST;
+                return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST),
+                                      "IPv6 prefix %s already configured, ignoring %s",
+                                      strna(addr_cur), strna(addr_p));
         }
 
         p = sd_radv_prefix_ref(p);
@@ -575,7 +593,7 @@ _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {
         ra->n_prefixes++;
 
         if (!dynamic) {
-                log_radv("Added prefix %s", strna(addr_p));
+                log_radv(ra, "Added prefix %s", strna(addr_p));
                 return 0;
         }
 
@@ -585,9 +603,9 @@ _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {
         if (ra->ra_sent > 0) {
                 r = radv_send(ra, NULL, ra->lifetime);
                 if (r < 0)
-                        log_radv_errno(r, "Unable to send Router Advertisement for added prefix: %m");
+                        log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix: %m");
                 else
-                        log_radv("Sent Router Advertisement for added prefix");
+                        log_radv(ra, "Sent Router Advertisement for added prefix");
         }
 
  update:
@@ -608,7 +626,7 @@ _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {
         cur->valid_until = valid_until;
         cur->preferred_until = preferred_until;
 
-        log_radv("Updated prefix %s preferred %s valid %s",
+        log_radv(ra, "Updated prefix %s preferred %s valid %s",
                  strna(addr_p),
                  format_timespan(time_string_preferred, FORMAT_TIMESPAN_MAX,
                                  preferred, USEC_PER_SEC),
@@ -678,10 +696,9 @@ _public_ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p, int
                 (void) in_addr_prefix_to_string(AF_INET6,
                                                 (const union in_addr_union*) &cur->opt.in6_addr,
                                                 cur->opt.prefixlen, &addr);
-                log_radv("IPv6 route prefix %s already configured, ignoring %s",
-                         strna(addr), strna(pretty));
-
-                return -EEXIST;
+                return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST),
+                                      "IPv6 route prefix %s already configured, ignoring %s",
+                                      strna(addr), strna(pretty));
         }
 
         p = sd_radv_route_prefix_ref(p);
@@ -690,7 +707,7 @@ _public_ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p, int
         ra->n_route_prefixes++;
 
         if (!dynamic) {
-                log_radv("Added prefix %s", strna(pretty));
+                log_radv(ra, "Added prefix %s", strna(pretty));
                 return 0;
         }
 
@@ -698,9 +715,9 @@ _public_ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p, int
         if (ra->ra_sent > 0) {
                 r = radv_send(ra, NULL, ra->lifetime);
                 if (r < 0)
-                        log_radv_errno(r, "Unable to send Router Advertisement for added route prefix: %m");
+                        log_radv_errno(ra, r, "Unable to send Router Advertisement for added route prefix: %m");
                 else
-                        log_radv("Sent Router Advertisement for added route prefix");
+                        log_radv(ra, "Sent Router Advertisement for added route prefix");
         }
 
  update:
@@ -713,7 +730,7 @@ _public_ int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p, int
         if (valid_until == USEC_INFINITY)
                 return -EOVERFLOW;
 
-        log_radv("Updated route prefix %s valid %s",
+        log_radv(ra, "Updated route prefix %s valid %s",
                  strna(pretty),
                  format_timespan(time_string_valid, FORMAT_TIMESPAN_MAX, valid, USEC_PER_SEC));
 
@@ -842,7 +859,7 @@ _public_ int sd_radv_prefix_set_prefix(sd_radv_prefix *p, const struct in6_addr
 
         if (prefixlen > 64)
                 /* unusual but allowed, log it */
-                log_radv("Unusual prefix length %d greater than 64", prefixlen);
+                log_radv(NULL, "Unusual prefix length %d greater than 64", prefixlen);
 
         p->opt.in6_addr = *in6_addr;
         p->opt.prefixlen = prefixlen;
@@ -932,7 +949,7 @@ _public_ int sd_radv_prefix_set_route_prefix(sd_radv_route_prefix *p, const stru
 
         if (prefixlen > 64)
                 /* unusual but allowed, log it */
-                log_radv("Unusual prefix length %u greater than 64", prefixlen);
+                log_radv(NULL, "Unusual prefix length %u greater than 64", prefixlen);
 
         p->opt.in6_addr = *in6_addr;
         p->opt.prefixlen = prefixlen;
index d39d1f57a07ef1d53195b7fa00a01cba64e44f31..b464d3d700a3e6eeab07fb4c3c76995b7ac5a9b0 100644 (file)
@@ -308,7 +308,7 @@ static void test_discover_message(sd_event *e) {
 
         assert_se(IN_SET(res, 0, -EINPROGRESS));
 
-        sd_event_run(e, (uint64_t) -1);
+        sd_event_run(e, UINT64_MAX);
 
         sd_dhcp_client_stop(client);
         sd_dhcp_client_unref(client);
index cb363b3973ff244dc8050eed8dc819f6435ff185..5d0c5ed2a21624a4602520e80e7c2bc733585885 100644 (file)
@@ -295,17 +295,17 @@ static int test_option_status(sd_event *e) {
         option = (DHCP6Option *)option1;
         assert_se(sizeof(option1) == sizeof(DHCP6Option) + be16toh(option->len));
 
-        r = dhcp6_option_parse_ia(option, &ia, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
         assert_se(r == 0);
         assert_se(ia.addresses == NULL);
 
         option->len = htobe16(17);
-        r = dhcp6_option_parse_ia(option, &ia, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
         assert_se(r == -ENOBUFS);
         assert_se(ia.addresses == NULL);
 
         option->len = htobe16(sizeof(DHCP6Option));
-        r = dhcp6_option_parse_ia(option, &ia, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
         assert_se(r == -ENOBUFS);
         assert_se(ia.addresses == NULL);
 
@@ -313,7 +313,7 @@ static int test_option_status(sd_event *e) {
         option = (DHCP6Option *)option2;
         assert_se(sizeof(option2) == sizeof(DHCP6Option) + be16toh(option->len));
 
-        r = dhcp6_option_parse_ia(option, &ia, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
         assert_se(r >= 0);
         assert_se(ia.addresses == NULL);
 
@@ -321,7 +321,7 @@ static int test_option_status(sd_event *e) {
         option = (DHCP6Option *)option3;
         assert_se(sizeof(option3) == sizeof(DHCP6Option) + be16toh(option->len));
 
-        r = dhcp6_option_parse_ia(option, &ia, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
         assert_se(r >= 0);
         assert_se(ia.addresses != NULL);
         dhcp6_lease_free_ia(&ia);
@@ -330,7 +330,7 @@ static int test_option_status(sd_event *e) {
         option = (DHCP6Option *)option4;
         assert_se(sizeof(option4) == sizeof(DHCP6Option) + be16toh(option->len));
 
-        r = dhcp6_option_parse_ia(option, &pd, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &pd, NULL);
         assert_se(r >= 0);
         assert_se(pd.addresses != NULL);
         assert_se(memcmp(&pd.ia_pd.id, &option4[4], 4) == 0);
@@ -342,7 +342,7 @@ static int test_option_status(sd_event *e) {
         option = (DHCP6Option *)option5;
         assert_se(sizeof(option5) == sizeof(DHCP6Option) + be16toh(option->len));
 
-        r = dhcp6_option_parse_ia(option, &pd, NULL);
+        r = dhcp6_option_parse_ia(NULL, option, &pd, NULL);
         assert_se(r >= 0);
         assert_se(pd.addresses != NULL);
         dhcp6_lease_free_ia(&pd);
@@ -449,6 +449,7 @@ static int test_advertise_option(sd_event *e) {
 
                 case SD_DHCP6_OPTION_IA_NA:
                         assert_se(optlen == 94);
+                        assert_se(optval == &msg_advertise[26]);
                         assert_se(!memcmp(optval, &msg_advertise[26], optlen));
 
                         val = htobe32(0x0ecfa37d);
@@ -460,12 +461,13 @@ static int test_advertise_option(sd_event *e) {
                         val = htobe32(120);
                         assert_se(!memcmp(optval + 8, &val, sizeof(val)));
 
-                        assert_se(dhcp6_option_parse_ia(option, &lease->ia, NULL) >= 0);
+                        assert_se(dhcp6_option_parse_ia(NULL, option, &lease->ia, NULL) >= 0);
 
                         break;
 
                 case SD_DHCP6_OPTION_SERVERID:
                         assert_se(optlen == 14);
+                        assert_se(optval == &msg_advertise[179]);
                         assert_se(!memcmp(optval, &msg_advertise[179], optlen));
 
                         assert_se(dhcp6_lease_set_serverid(lease, optval,
@@ -656,7 +658,7 @@ static int test_client_verify_request(DHCP6Message *request, size_t len) {
                         assert_se(!memcmp(optval + 8, &val, sizeof(val)));
 
                         /* Then, this should refuse all addresses. */
-                        assert_se(dhcp6_option_parse_ia(option, &lease->ia, NULL) >= 0);
+                        assert_se(dhcp6_option_parse_ia(NULL, option, &lease->ia, NULL) >= 0);
 
                         break;
 
index 49e1d590be3e0bdd97b23f1f15958c2f62665347..768595969b7f94ad67afc4f49303d7a9189251c8 100644 (file)
@@ -160,25 +160,25 @@ static void test_basic_request(sd_event *e) {
         assert_se(sd_ipv4ll_set_ifindex(ll, 1) == 0);
         assert_se(sd_ipv4ll_start(ll) == 1);
 
-        sd_event_run(e, (uint64_t) -1);
+        sd_event_run(e, UINT64_MAX);
         assert_se(sd_ipv4ll_start(ll) == 0);
 
         assert_se(sd_ipv4ll_is_running(ll));
 
         /* PROBE */
-        sd_event_run(e, (uint64_t) -1);
+        sd_event_run(e, UINT64_MAX);
         assert_se(recv(test_fd[1], &arp, sizeof(struct ether_arp), 0) == sizeof(struct ether_arp));
 
         if (extended) {
                 /* PROBE */
-                sd_event_run(e, (uint64_t) -1);
+                sd_event_run(e, UINT64_MAX);
                 assert_se(recv(test_fd[1], &arp, sizeof(struct ether_arp), 0) == sizeof(struct ether_arp));
 
                 /* PROBE */
-                sd_event_run(e, (uint64_t) -1);
+                sd_event_run(e, UINT64_MAX);
                 assert_se(recv(test_fd[1], &arp, sizeof(struct ether_arp), 0) == sizeof(struct ether_arp));
 
-                sd_event_run(e, (uint64_t) -1);
+                sd_event_run(e, UINT64_MAX);
                 assert_se(basic_request_handler_bind == 1);
         }
 
index b8a9bbe22265703203c255f02a4f96b0daf3aad6..ad50815a7b6ddd289207c9f872d9799458618477 100644 (file)
@@ -315,3 +315,11 @@ if cxx_cmd != ''
                 [['src/libsystemd/sd-bus/test-bus-vtable-cc.cc']],
         ]
 endif
+
+############################################################
+
+fuzzers += [
+        [['src/libsystemd/sd-bus/fuzz-bus-message.c']],
+
+        [['src/libsystemd/sd-bus/fuzz-bus-match.c']],
+]
index 943877f0ea0b95f2033b23660f0ecdb31cd1e98f..d96b7256a1b162d173a60f223f43a50803be1c11 100644 (file)
@@ -741,7 +741,7 @@ _public_ int sd_bus_get_owner_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **r
                 mask &= ~SD_BUS_CREDS_AUGMENT;
 
         do_label = bus->label && (mask & SD_BUS_CREDS_SELINUX_CONTEXT);
-        do_groups = bus->n_groups != (size_t) -1 && (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS);
+        do_groups = bus->n_groups != SIZE_MAX && (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS);
 
         /* Avoid allocating anything if we have no chance of returning useful data */
         if (!bus->ucred_valid && !do_label && !do_groups)
index 3134d8ef1723aac663de573ab174c3ccf535b1b1..5e748fdb462b986bf4877327e0ca51886e3c6e5c 100644 (file)
@@ -1002,7 +1002,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
                 const char *p;
 
                 p = procfs_file_alloca(pid, "cmdline");
-                r = read_full_file(p, &c->cmdline, &c->cmdline_size);
+                r = read_full_virtual_file(p, &c->cmdline, &c->cmdline_size);
                 if (r == -ENOENT)
                         return -ESRCH;
                 if (r < 0) {
index 7ee6e7012f29c864fadd5a1527eb0fb8b47540ff..d5d22b0d8c64f086cd97dd28ecc7dfcde02e1103 100644 (file)
@@ -81,7 +81,7 @@ _public_ int sd_bus_message_dump(sd_bus_message *m, FILE *f, uint64_t flags) {
                         m->header->version);
 
                 /* Display synthetic message serial number in a more readable
-                 * format than (uint32_t) -1 */
+                 * format than UINT32_MAX */
                 if (BUS_MESSAGE_COOKIE(m) == 0xFFFFFFFFULL)
                         fprintf(f, " Cookie=-1");
                 else
index 557284faf8258ca9d21cdb9a93bae878c0922f5d..d981f72449ee26e07d979fe1ddb75b9ccf10e6ef 100644 (file)
@@ -28,11 +28,17 @@ int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_lis
  * the bus error table, and BUS_ERROR_MAP_ELF_USE has to be used at
  * least once per compilation unit (i.e. per library), to ensure that
  * the error map is really added to the final binary.
+ *
+ * In addition, set the retain attribute so that the section cannot be
+ * discarded by ld --gc-sections -z start-stop-gc. Older compilers would
+ * warn for the unknown attribute, so just disable -Wattributes.
  */
 
 #define BUS_ERROR_MAP_ELF_REGISTER                                      \
+        _Pragma("GCC diagnostic ignored \"-Wattributes\"")              \
         _section_("SYSTEMD_BUS_ERROR_MAP")                              \
         _used_                                                          \
+        __attribute__((retain))                                         \
         _alignptr_                                                      \
         _variable_no_sanitize_address_
 
index a331ee3f3eb627a55ee0d1b57fb46e4e83bae733..4a45507da502c5916de22a6accd5baabb97c71d6 100644 (file)
@@ -44,8 +44,8 @@ struct match_callback {
         unsigned last_iteration;
 
         /* Don't dispatch this slot with messages that arrived in any iteration before or at the this
-         * one. We use this to ensure that matches don't apply "retroactively" and thus can confuse the
-         * caller: matches will only match incoming messages from the moment on the match was installed. */
+         * one. We use this to ensure that matches don't apply "retroactively" and confuse the caller:
+         * only messages received after the match was installed will be considered. */
         uint64_t after;
 
         char *match_string;
index fd74867afa3716272326e109e473e0f2107e5c28..96b50aeaed6360d4e7275f546cee37b8b10c00dd 100644 (file)
@@ -408,12 +408,9 @@ int bus_match_run(
                         if (r != 0)
                                 return r;
                 }
-        } else {
-                struct bus_match_node *c;
-
+        } else
                 /* No hash table, so let's iterate manually... */
-
-                for (c = node->child; c; c = c->next) {
+                for (struct bus_match_node *c = node->child; c; c = c->next) {
                         if (!value_node_test(c, node->type, test_u8, test_str, test_strv, m))
                                 continue;
 
@@ -424,7 +421,6 @@ int bus_match_run(
                         if (bus && bus->match_callbacks_modified)
                                 return 0;
                 }
-        }
 
         if (bus && bus->match_callbacks_modified)
                 return 0;
@@ -440,7 +436,7 @@ static int bus_match_add_compare_value(
                 const char *value_str,
                 struct bus_match_node **ret) {
 
-        struct bus_match_node *c = NULL, *n = NULL;
+        struct bus_match_node *c, *n = NULL;
         int r;
 
         assert(where);
@@ -452,25 +448,22 @@ static int bus_match_add_compare_value(
                 ;
 
         if (c) {
-                /* Comparison node already exists? Then let's see if
-                 * the value node exists too. */
+                /* Comparison node already exists? Then let's see if the value node exists too. */
 
                 if (t == BUS_MATCH_MESSAGE_TYPE)
                         n = hashmap_get(c->compare.children, UINT_TO_PTR(value_u8));
                 else if (BUS_MATCH_CAN_HASH(t))
                         n = hashmap_get(c->compare.children, value_str);
-                else {
+                else
                         for (n = c->child; n && !value_node_same(n, t, value_u8, value_str); n = n->next)
                                 ;
-                }
 
                 if (n) {
                         *ret = n;
                         return 0;
                 }
         } else {
-                /* Comparison node, doesn't exist yet? Then let's
-                 * create it. */
+                /* Comparison node, doesn't exist yet? Then let's create it. */
 
                 c = new0(struct bus_match_node, 1);
                 if (!c) {
@@ -706,9 +699,7 @@ static int match_component_compare(const struct bus_match_component *a, const st
 }
 
 void bus_match_parse_free(struct bus_match_component *components, unsigned n_components) {
-        unsigned i;
-
-        for (i = 0; i < n_components; i++)
+        for (unsigned i = 0; i < n_components; i++)
                 free(components[i].value_str);
 
         free(components);
@@ -716,51 +707,54 @@ void bus_match_parse_free(struct bus_match_component *components, unsigned n_com
 
 int bus_match_parse(
                 const char *match,
-                struct bus_match_component **_components,
-                unsigned *_n_components) {
+                struct bus_match_component **ret_components,
+                unsigned *ret_n_components) {
 
-        const char *p = match;
         struct bus_match_component *components = NULL;
         size_t components_allocated = 0;
-        unsigned n_components = 0, i;
-        _cleanup_free_ char *value = NULL;
+        unsigned n_components = 0;
         int r;
 
         assert(match);
-        assert(_components);
-        assert(_n_components);
+        assert(ret_components);
+        assert(ret_n_components);
 
-        while (*p != 0) {
+        while (*match != '\0') {
                 const char *eq, *q;
                 enum bus_match_node_type t;
                 unsigned j = 0;
+                _cleanup_free_ char *value = NULL;
                 size_t value_allocated = 0;
                 bool escaped = false, quoted;
                 uint8_t u;
 
                 /* Avahi's match rules appear to include whitespace, skip over it */
-                p += strspn(p, " ");
+                match += strspn(match, " ");
 
-                eq = strchr(p, '=');
-                if (!eq)
-                        return -EINVAL;
+                eq = strchr(match, '=');
+                if (!eq) {
+                        r = -EINVAL;
+                        goto fail;
+                }
 
-                t = bus_match_node_type_from_string(p, eq - p);
-                if (t < 0)
-                        return -EINVAL;
+                t = bus_match_node_type_from_string(match, eq - match);
+                if (t < 0) {
+                        r = -EINVAL;
+                        goto fail;
+                }
 
                 quoted = eq[1] == '\'';
 
                 for (q = eq + 1 + quoted;; q++) {
 
-                        if (*q == 0) {
+                        if (*q == '\0') {
 
                                 if (quoted) {
                                         r = -EINVAL;
                                         goto fail;
                                 } else {
                                         if (value)
-                                                value[j] = 0;
+                                                value[j] = '\0';
                                         break;
                                 }
                         }
@@ -774,14 +768,13 @@ int bus_match_parse(
                                 if (quoted) {
                                         if (*q == '\'') {
                                                 if (value)
-                                                        value[j] = 0;
+                                                        value[j] = '\0';
                                                 break;
                                         }
                                 } else {
                                         if (*q == ',') {
                                                 if (value)
-                                                        value[j] = 0;
-
+                                                        value[j] = '\0';
                                                 break;
                                         }
                                 }
@@ -818,10 +811,11 @@ int bus_match_parse(
                         goto fail;
                 }
 
-                components[n_components].type = t;
-                components[n_components].value_str = TAKE_PTR(value);
-                components[n_components].value_u8 = u;
-                n_components++;
+                components[n_components++] = (struct bus_match_component) {
+                        .type = t,
+                        .value_str = TAKE_PTR(value),
+                        .value_u8 = u,
+                };
 
                 if (q[quoted] == 0)
                         break;
@@ -831,21 +825,21 @@ int bus_match_parse(
                         goto fail;
                 }
 
-                p = q + 1 + quoted;
+                match = q + 1 + quoted;
         }
 
         /* Order the whole thing, so that we always generate the same tree */
         typesafe_qsort(components, n_components, match_component_compare);
 
         /* Check for duplicates */
-        for (i = 0; i+1 < n_components; i++)
+        for (unsigned i = 0; i+1 < n_components; i++)
                 if (components[i].type == components[i+1].type) {
                         r = -EINVAL;
                         goto fail;
                 }
 
-        *_components = components;
-        *_n_components = n_components;
+        *ret_components = components;
+        *ret_n_components = n_components;
 
         return 0;
 
@@ -855,10 +849,8 @@ fail:
 }
 
 char *bus_match_to_string(struct bus_match_component *components, unsigned n_components) {
-        _cleanup_fclose_ FILE *f = NULL;
-        char *buffer = NULL;
+        _cleanup_free_ char *buffer = NULL;
         size_t size = 0;
-        unsigned i;
         int r;
 
         if (n_components <= 0)
@@ -866,11 +858,11 @@ char *bus_match_to_string(struct bus_match_component *components, unsigned n_com
 
         assert(components);
 
-        f = open_memstream_unlocked(&buffer, &size);
+        FILE *f = open_memstream_unlocked(&buffer, &size);
         if (!f)
                 return NULL;
 
-        for (i = 0; i < n_components; i++) {
+        for (unsigned i = 0; i < n_components; i++) {
                 char buf[32];
 
                 if (i != 0)
@@ -889,10 +881,10 @@ char *bus_match_to_string(struct bus_match_component *components, unsigned n_com
         }
 
         r = fflush_and_check(f);
+        safe_fclose(f);
         if (r < 0)
                 return NULL;
-
-        return buffer;
+        return TAKE_PTR(buffer);
 }
 
 int bus_match_add(
@@ -901,23 +893,22 @@ int bus_match_add(
                 unsigned n_components,
                 struct match_callback *callback) {
 
-        unsigned i;
-        struct bus_match_node *n;
         int r;
 
         assert(root);
         assert(callback);
 
-        n = root;
-        for (i = 0; i < n_components; i++) {
-                r = bus_match_add_compare_value(
-                                n, components[i].type,
-                                components[i].value_u8, components[i].value_str, &n);
+        for (unsigned i = 0; i < n_components; i++) {
+                r = bus_match_add_compare_value(root,
+                                                components[i].type,
+                                                components[i].value_u8,
+                                                components[i].value_str,
+                                                &root);
                 if (r < 0)
                         return r;
         }
 
-        return bus_match_add_leaf(n, callback);
+        return bus_match_add_leaf(root, callback);
 }
 
 int bus_match_remove(
@@ -1028,42 +1019,39 @@ const char* bus_match_node_type_to_string(enum bus_match_node_type t, char buf[]
         }
 }
 
-void bus_match_dump(struct bus_match_node *node, unsigned level) {
-        struct bus_match_node *c;
-        _cleanup_free_ char *pfx = NULL;
+void bus_match_dump(FILE *out, struct bus_match_node *node, unsigned level) {
         char buf[32];
 
         if (!node)
                 return;
 
-        pfx = strrep("  ", level);
-        printf("%s[%s]", strempty(pfx), bus_match_node_type_to_string(node->type, buf, sizeof(buf)));
+        fprintf(out, "%*s[%s]", 2 * level, "", bus_match_node_type_to_string(node->type, buf, sizeof(buf)));
 
         if (node->type == BUS_MATCH_VALUE) {
                 if (node->parent->type == BUS_MATCH_MESSAGE_TYPE)
-                        printf(" <%u>\n", node->value.u8);
+                        fprintf(out, " <%u>\n", node->value.u8);
                 else
-                        printf(" <%s>\n", node->value.str);
+                        fprintf(out, " <%s>\n", node->value.str);
         } else if (node->type == BUS_MATCH_ROOT)
-                puts(" root");
+                fputs(" root\n", out);
         else if (node->type == BUS_MATCH_LEAF)
-                printf(" %p/%p\n", node->leaf.callback->callback, container_of(node->leaf.callback, sd_bus_slot, match_callback)->userdata);
+                fprintf(out, " %p/%p\n", node->leaf.callback->callback,
+                        container_of(node->leaf.callback, sd_bus_slot, match_callback)->userdata);
         else
-                putchar('\n');
+                putc('\n', out);
 
         if (BUS_MATCH_CAN_HASH(node->type)) {
-
+                struct bus_match_node *c;
                 HASHMAP_FOREACH(c, node->compare.children)
-                        bus_match_dump(c, level + 1);
+                        bus_match_dump(out, c, level + 1);
         }
 
-        for (c = node->child; c; c = c->next)
-                bus_match_dump(c, level + 1);
+        for (struct bus_match_node *c = node->child; c; c = c->next)
+                bus_match_dump(out, c, level + 1);
 }
 
 enum bus_match_scope bus_match_get_scope(const struct bus_match_component *components, unsigned n_components) {
         bool found_driver = false;
-        unsigned i;
 
         if (n_components <= 0)
                 return BUS_MATCH_GENERIC;
@@ -1076,7 +1064,7 @@ enum bus_match_scope bus_match_get_scope(const struct bus_match_component *compo
          * local messages, then we check if it only matches on the
          * driver. */
 
-        for (i = 0; i < n_components; i++) {
+        for (unsigned i = 0; i < n_components; i++) {
                 const struct bus_match_component *c = components + i;
 
                 if (c->type == BUS_MATCH_SENDER) {
@@ -1095,5 +1083,4 @@ enum bus_match_scope bus_match_get_scope(const struct bus_match_component *compo
         }
 
         return found_driver ? BUS_MATCH_DRIVER : BUS_MATCH_GENERIC;
-
 }
index 577100081d59a81dfe4e0fae0ed406fa9f25de57..6042f90fbaa4bad23cea67de92f0cb4f748ddc75 100644 (file)
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
+#include <stdio.h>
+
 #include "sd-bus.h"
 
 #include "hashmap.h"
@@ -68,12 +70,12 @@ int bus_match_remove(struct bus_match_node *root, struct match_callback *callbac
 
 void bus_match_free(struct bus_match_node *node);
 
-void bus_match_dump(struct bus_match_node *node, unsigned level);
+void bus_match_dump(FILE *out, struct bus_match_node *node, unsigned level);
 
 const char* bus_match_node_type_to_string(enum bus_match_node_type t, char buf[], size_t l);
 enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n);
 
-int bus_match_parse(const char *match, struct bus_match_component **_components, unsigned *_n_components);
+int bus_match_parse(const char *match, struct bus_match_component **ret_components, unsigned *ret_n_components);
 void bus_match_parse_free(struct bus_match_component *components, unsigned n_components);
 char *bus_match_to_string(struct bus_match_component *components, unsigned n_components);
 
index 894d681260f3c233d011577cff02353191f20f5e..b25064b672147dee6c1d2b9ec1fe30cd48360148 100644 (file)
@@ -161,8 +161,7 @@ static void *message_extend_fields(sd_bus_message *m, size_t align, size_t sz, b
         start = ALIGN_TO(old_size, align);
         new_size = start + sz;
 
-        if (new_size < start ||
-            new_size > (size_t) ((uint32_t) -1))
+        if (new_size < start || new_size > UINT32_MAX)
                 goto poison;
 
         if (old_size == new_size)
@@ -1337,8 +1336,7 @@ static void *message_extend_body(
         added = padding + sz;
 
         /* Check for 32bit overflows */
-        if (end_body > (size_t) ((uint32_t) -1) ||
-            end_body < start_body) {
+        if (end_body < start_body || end_body > UINT32_MAX) {
                 m->poisoned = true;
                 return NULL;
         }
@@ -2340,13 +2338,13 @@ _public_ int sd_bus_message_appendv(
         assert_return(!m->sealed, -EPERM);
         assert_return(!m->poisoned, -ESTALE);
 
-        n_array = (unsigned) -1;
+        n_array = UINT_MAX;
         n_struct = strlen(types);
 
         for (;;) {
                 const char *t;
 
-                if (n_array == 0 || (n_array == (unsigned) -1 && n_struct == 0)) {
+                if (n_array == 0 || (n_array == UINT_MAX && n_struct == 0)) {
                         r = type_stack_pop(stack, ELEMENTSOF(stack), &stack_ptr, &types, &n_struct, &n_array);
                         if (r < 0)
                                 return r;
@@ -2361,7 +2359,7 @@ _public_ int sd_bus_message_appendv(
                 }
 
                 t = types;
-                if (n_array != (unsigned) -1)
+                if (n_array != UINT_MAX)
                         n_array--;
                 else {
                         types++;
@@ -2445,7 +2443,7 @@ _public_ int sd_bus_message_appendv(
                                         return r;
                         }
 
-                        if (n_array == (unsigned) -1) {
+                        if (n_array == UINT_MAX) {
                                 types += k;
                                 n_struct -= k;
                         }
@@ -2478,7 +2476,7 @@ _public_ int sd_bus_message_appendv(
 
                         types = s;
                         n_struct = strlen(s);
-                        n_array = (unsigned) -1;
+                        n_array = UINT_MAX;
 
                         break;
                 }
@@ -2502,7 +2500,7 @@ _public_ int sd_bus_message_appendv(
                                         return r;
                         }
 
-                        if (n_array == (unsigned) -1) {
+                        if (n_array == UINT_MAX) {
                                 types += k - 1;
                                 n_struct -= k - 1;
                         }
@@ -2513,7 +2511,7 @@ _public_ int sd_bus_message_appendv(
 
                         types = t + 1;
                         n_struct = k - 2;
-                        n_array = (unsigned) -1;
+                        n_array = UINT_MAX;
 
                         break;
                 }
@@ -2675,7 +2673,7 @@ _public_ int sd_bus_message_append_array_memfd(
         if (r < 0)
                 return r;
 
-        if (offset == 0 && size == (uint64_t) -1)
+        if (offset == 0 && size == UINT64_MAX)
                 size = real_size;
         else if (offset + size > real_size)
                 return -EMSGSIZE;
@@ -2692,7 +2690,7 @@ _public_ int sd_bus_message_append_array_memfd(
         if (size % sz != 0)
                 return -EINVAL;
 
-        if (size > (uint64_t) (uint32_t) -1)
+        if (size > (uint64_t) UINT32_MAX)
                 return -EINVAL;
 
         r = sd_bus_message_open_container(m, SD_BUS_TYPE_ARRAY, CHAR_TO_STR(type));
@@ -2750,7 +2748,7 @@ _public_ int sd_bus_message_append_string_memfd(
         if (r < 0)
                 return r;
 
-        if (offset == 0 && size == (uint64_t) -1)
+        if (offset == 0 && size == UINT64_MAX)
                 size = real_size;
         else if (offset + size > real_size)
                 return -EMSGSIZE;
@@ -2759,7 +2757,7 @@ _public_ int sd_bus_message_append_string_memfd(
         if (size == 0)
                 return -EINVAL;
 
-        if (size > (uint64_t) (uint32_t) -1)
+        if (size > (uint64_t) UINT32_MAX)
                 return -EINVAL;
 
         c = message_get_last_container(m);
@@ -4430,7 +4428,7 @@ _public_ int sd_bus_message_readv(
          * in a single stackframe. We hence implement our own
          * home-grown stack in an array. */
 
-        n_array = (unsigned) -1; /* length of current array entries */
+        n_array = UINT_MAX; /* length of current array entries */
         n_struct = strlen(types); /* length of current struct contents signature */
 
         for (;;) {
@@ -4438,7 +4436,7 @@ _public_ int sd_bus_message_readv(
 
                 n_loop++;
 
-                if (n_array == 0 || (n_array == (unsigned) -1 && n_struct == 0)) {
+                if (n_array == 0 || (n_array == UINT_MAX && n_struct == 0)) {
                         r = type_stack_pop(stack, ELEMENTSOF(stack), &stack_ptr, &types, &n_struct, &n_array);
                         if (r < 0)
                                 return r;
@@ -4453,7 +4451,7 @@ _public_ int sd_bus_message_readv(
                 }
 
                 t = types;
-                if (n_array != (unsigned) -1)
+                if (n_array != UINT_MAX)
                         n_array--;
                 else {
                         types++;
@@ -4514,7 +4512,7 @@ _public_ int sd_bus_message_readv(
                                 }
                         }
 
-                        if (n_array == (unsigned) -1) {
+                        if (n_array == UINT_MAX) {
                                 types += k;
                                 n_struct -= k;
                         }
@@ -4553,7 +4551,7 @@ _public_ int sd_bus_message_readv(
 
                         types = s;
                         n_struct = strlen(s);
-                        n_array = (unsigned) -1;
+                        n_array = UINT_MAX;
 
                         break;
                 }
@@ -4581,7 +4579,7 @@ _public_ int sd_bus_message_readv(
                                 }
                         }
 
-                        if (n_array == (unsigned) -1) {
+                        if (n_array == UINT_MAX) {
                                 types += k - 1;
                                 n_struct -= k - 1;
                         }
@@ -4592,7 +4590,7 @@ _public_ int sd_bus_message_readv(
 
                         types = t + 1;
                         n_struct = k - 2;
-                        n_array = (unsigned) -1;
+                        n_array = UINT_MAX;
 
                         break;
                 }
@@ -5034,7 +5032,7 @@ static int message_skip_fields(
                 char t;
                 size_t l;
 
-                if (array_size != (uint32_t) -1 &&
+                if (array_size != UINT32_MAX &&
                     array_size <= *ri - original_index)
                         return 0;
 
@@ -5122,7 +5120,7 @@ static int message_skip_fields(
                         if (r < 0)
                                 return r;
 
-                        r = message_skip_fields(m, ri, (uint32_t) -1, (const char**) &s);
+                        r = message_skip_fields(m, ri, UINT32_MAX, (const char**) &s);
                         if (r < 0)
                                 return r;
 
@@ -5140,7 +5138,7 @@ static int message_skip_fields(
                                 strncpy(sig, *signature + 1, l);
                                 sig[l] = '\0';
 
-                                r = message_skip_fields(m, ri, (uint32_t) -1, (const char**) &s);
+                                r = message_skip_fields(m, ri, UINT32_MAX, (const char**) &s);
                                 if (r < 0)
                                         return r;
                         }
@@ -5247,7 +5245,7 @@ int bus_message_parse_fields(sd_bus_message *m) {
                 _cleanup_free_ char *sig = NULL;
                 const char *signature;
                 uint64_t field_type;
-                size_t item_size = (size_t) -1;
+                size_t item_size = SIZE_MAX;
 
                 if (BUS_MESSAGE_IS_GVARIANT(m)) {
                         uint64_t *u64;
@@ -5461,7 +5459,7 @@ int bus_message_parse_fields(sd_bus_message *m) {
 
                 default:
                         if (!BUS_MESSAGE_IS_GVARIANT(m))
-                                r = message_skip_fields(m, &ri, (uint32_t) -1, (const char **) &signature);
+                                r = message_skip_fields(m, &ri, UINT32_MAX, (const char **) &signature);
                 }
 
                 if (r < 0)
index 4881fd0d321a9b21c8f6d2d53d42162936f03bfa..832526cc1b7124969640ad827359e0b80b8cb58a 100644 (file)
@@ -620,7 +620,7 @@ static void bus_get_peercred(sd_bus *b) {
         assert(b);
         assert(!b->ucred_valid);
         assert(!b->label);
-        assert(b->n_groups == (size_t) -1);
+        assert(b->n_groups == SIZE_MAX);
 
         /* Get the peer for socketpair() sockets */
         b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
diff --git a/src/libsystemd/sd-bus/fuzz-bus-match.c b/src/libsystemd/sd-bus/fuzz-bus-match.c
new file mode 100644 (file)
index 0000000..0585338
--- /dev/null
@@ -0,0 +1,86 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "alloc-util.h"
+#include "bus-internal.h"
+#include "bus-match.h"
+#include "env-util.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fuzz.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+        _cleanup_free_ char *out = NULL; /* out should be freed after g */
+        size_t out_size;
+        _cleanup_fclose_ FILE *g = NULL;
+        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        int r;
+
+        /* We don't want to fill the logs with messages about parse errors.
+         * Disable most logging if not running standalone */
+        if (!getenv("SYSTEMD_LOG_LEVEL"))
+                log_set_max_level(LOG_CRIT);
+
+        r = sd_bus_new(&bus);
+        assert_se(r >= 0);
+
+        struct bus_match_node root = {
+                .type = BUS_MATCH_ROOT,
+        };
+
+        /* Note that we use the pointer to match_callback substructure, but the code
+         * uses container_of() to access outside of the passed-in type. */
+        sd_bus_slot slot = {
+                .type = BUS_MATCH_CALLBACK,
+                .match_callback = {},
+        };
+
+        if (getenv_bool("SYSTEMD_FUZZ_OUTPUT") <= 0)
+                assert_se(g = open_memstream_unlocked(&out, &out_size));
+
+        for (size_t offset = 0; offset < size; ) {
+                _cleanup_free_ char *line = NULL;
+                char *end;
+
+                end = memchr((char*) data + offset, '\n', size - offset);
+
+                line = memdup_suffix0((char*) data + offset,
+                                      end ? end - (char*) data - offset : size - offset);
+                if (!line)
+                        return log_oom_debug();
+
+                offset = end ? (size_t) (end - (char*) data + 1) : size;
+
+                struct bus_match_component *components;
+                unsigned n_components;
+                r = bus_match_parse(line, &components, &n_components);
+                if (IN_SET(r, -EINVAL, -ENOMEM)) {
+                        log_debug_errno(r, "Failed to parse line: %m");
+                        continue;
+                }
+                assert_se(r >= 0); /* We only expect EINVAL and ENOMEM errors, or success. */
+
+                log_debug("Parsed %u components.", n_components);
+
+                _cleanup_free_ char *again = bus_match_to_string(components, n_components);
+                if (!again) {
+                        bus_match_parse_free(components, n_components);
+                        log_oom();
+                        break;
+                }
+
+                if (g)
+                        fprintf(g, "%s\n", again);
+
+                r = bus_match_add(&root, components, n_components, &slot.match_callback);
+                bus_match_parse_free(components, n_components);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to add match: %m");
+                        break;
+                }
+        }
+
+        bus_match_dump(g ?: stdout, &root, 0); /* We do this even on failure, to check consistency after error. */
+        bus_match_free(&root);
+
+        return 0;
+}
index 6b1f25cc0286a75866f005c5502eab01ff743312..e719c74370f3f081e54f9acb9eca48c6a43b5f06 100644 (file)
@@ -2,7 +2,6 @@
 
 #include <endian.h>
 #include <netdb.h>
-#include <poll.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdlib.h>
@@ -32,6 +31,7 @@
 #include "fd-util.h"
 #include "hexdecoct.h"
 #include "hostname-util.h"
+#include "io-util.h"
 #include "macro.h"
 #include "memory-util.h"
 #include "missing_syscall.h"
@@ -247,7 +247,7 @@ _public_ int sd_bus_new(sd_bus **ret) {
                 .creds_mask = SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME,
                 .accept_fd = true,
                 .original_pid = getpid_cached(),
-                .n_groups = (size_t) -1,
+                .n_groups = SIZE_MAX,
                 .close_on_exit = true,
         };
 
@@ -1964,8 +1964,8 @@ int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
          * hence let's fill something in for synthetic messages. Since
          * synthetic messages might have a fake sender and we don't
          * want to interfere with the real sender's serial numbers we
-         * pick a fixed, artificial one. We use (uint32_t) -1 rather
-         * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
+         * pick a fixed, artificial one. We use UINT32_MAX rather
+         * than UINT64_MAX since dbus1 only had 32bit identifiers,
          * even though kdbus can do 64bit. */
         return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
 }
@@ -2205,7 +2205,9 @@ _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destinat
 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
         assert(bus);
 
-        if (usec == (uint64_t) -1)
+        assert_cc(sizeof(usec_t) == sizeof(uint64_t));
+
+        if (usec == USEC_INFINITY)
                 return 0;
 
         /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
@@ -2215,7 +2217,7 @@ static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
         if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
                 return usec;
         else
-                return now(CLOCK_MONOTONIC) + usec;
+                return usec_add(now(CLOCK_MONOTONIC), usec);
 }
 
 static int timeout_compare(const void *a, const void *b) {
@@ -2330,7 +2332,7 @@ int bus_ensure_running(sd_bus *bus) {
                 if (r > 0)
                         continue;
 
-                r = sd_bus_wait(bus, (uint64_t) -1);
+                r = sd_bus_wait(bus, UINT64_MAX);
                 if (r < 0)
                         return r;
         }
@@ -2458,7 +2460,7 @@ _public_ int sd_bus_call(
 
                         left = timeout - n;
                 } else
-                        left = (uint64_t) -1;
+                        left = UINT64_MAX;
 
                 r = bus_poll(bus, true, left);
                 if (r < 0)
@@ -2578,12 +2580,12 @@ _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
 
                 c = prioq_peek(bus->reply_callbacks_prioq);
                 if (!c) {
-                        *timeout_usec = (uint64_t) -1;
+                        *timeout_usec = UINT64_MAX;
                         return 0;
                 }
 
                 if (c->timeout_usec == 0) {
-                        *timeout_usec = (uint64_t) -1;
+                        *timeout_usec = UINT64_MAX;
                         return 0;
                 }
 
@@ -2596,7 +2598,7 @@ _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
 
         case BUS_WATCH_BIND:
         case BUS_OPENING:
-                *timeout_usec = (uint64_t) -1;
+                *timeout_usec = UINT64_MAX;
                 return 0;
 
         default:
@@ -3255,9 +3257,8 @@ _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_messa
 
 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
         struct pollfd p[2] = {};
-        int r, n;
-        struct timespec ts;
         usec_t m = USEC_INFINITY;
+        int r, n;
 
         assert(bus);
 
@@ -3309,19 +3310,12 @@ static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
                 }
         }
 
-        if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
+        if (timeout_usec != UINT64_MAX && (m == USEC_INFINITY || timeout_usec < m))
                 m = timeout_usec;
 
-        r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
-        if (r < 0)
-                return -errno;
-        if (r == 0)
-                return 0;
-
-        if (p[0].revents & POLLNVAL)
-                return -EBADF;
-        if (n >= 2 && (p[1].revents & POLLNVAL))
-                return -EBADF;
+        r = ppoll_usec(p, n, m);
+        if (r <= 0)
+                return r;
 
         return 1;
 }
@@ -3382,7 +3376,7 @@ _public_ int sd_bus_flush(sd_bus *bus) {
                 if (bus->wqueue_size <= 0)
                         return 0;
 
-                r = bus_poll(bus, false, (uint64_t) -1);
+                r = bus_poll(bus, false, UINT64_MAX);
                 if (r < 0)
                         return r;
         }
index a1d7ba173f8e24d9df66583c73668f547ec61495..df6dd62151d9e27faee4f4f43a49579eb68e483a 100644 (file)
@@ -101,7 +101,7 @@ static int server_init(sd_bus **_bus) {
                 goto fail;
         }
 
-        bus_match_dump(&bus->match_callbacks, 0);
+        bus_match_dump(stdout, &bus->match_callbacks, 0);
 
         *_bus = bus;
         return 0;
@@ -127,7 +127,7 @@ static int server(sd_bus *bus) {
                 }
 
                 if (r == 0) {
-                        r = sd_bus_wait(bus, (uint64_t) -1);
+                        r = sd_bus_wait(bus, UINT64_MAX);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to wait: %m");
                                 goto fail;
@@ -472,7 +472,7 @@ static void* client2(void *p) {
                         goto finish;
                 }
                 if (r == 0) {
-                        r = sd_bus_wait(bus, (uint64_t) -1);
+                        r = sd_bus_wait(bus, UINT64_MAX);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to wait: %m");
                                 goto finish;
index 031e42ff46bebb1998c2ac31d250fd112bdd1898..7a20a6c3c432ac6693d66216f56f5ef352e8f783 100644 (file)
@@ -37,13 +37,12 @@ static bool mask_contains(unsigned a[], unsigned n) {
 }
 
 static int match_add(sd_bus_slot *slots, struct bus_match_node *root, const char *match, int value) {
-        struct bus_match_component *components = NULL;
-        unsigned n_components = 0;
+        struct bus_match_component *components;
+        unsigned n_components;
         sd_bus_slot *s;
         int r;
 
         s = slots + value;
-        zero(*s);
 
         r = bus_match_parse(match, &components, &n_components);
         if (r < 0)
@@ -74,8 +73,7 @@ int main(int argc, char *argv[]) {
 
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        enum bus_match_node_type i;
-        sd_bus_slot slots[19];
+        sd_bus_slot slots[19] = {};
         int r;
 
         test_setup_logging(LOG_INFO);
@@ -105,7 +103,7 @@ int main(int argc, char *argv[]) {
         assert_se(match_add(slots, &root, "arg4has='po'", 17) >= 0);
         assert_se(match_add(slots, &root, "arg4='pi'", 18) >= 0);
 
-        bus_match_dump(&root, 0);
+        bus_match_dump(stdout, &root, 0);
 
         assert_se(sd_bus_message_new_signal(bus, &m, "/foo/bar", "bar.x", "waldo") >= 0);
         assert_se(sd_bus_message_append(m, "ssssas", "one", "two", "/prefix/three", "prefix.four", 3, "pi", "pa", "po") >= 0);
@@ -118,13 +116,13 @@ int main(int argc, char *argv[]) {
         assert_se(bus_match_remove(&root, &slots[8].match_callback) >= 0);
         assert_se(bus_match_remove(&root, &slots[13].match_callback) >= 0);
 
-        bus_match_dump(&root, 0);
+        bus_match_dump(stdout, &root, 0);
 
         zero(mask);
         assert_se(bus_match_run(NULL, &root, m) == 0);
         assert_se(mask_contains((unsigned[]) { 9, 5, 10, 12, 14, 7, 15, 16, 17 }, 9));
 
-        for (i = 0; i < _BUS_MATCH_NODE_TYPE_MAX; i++) {
+        for (enum bus_match_node_type i = 0; i < _BUS_MATCH_NODE_TYPE_MAX; i++) {
                 char buf[32];
                 const char *x;
 
index 5ef3f30c70dced1e0165f2b22b3b75637c076684..a71add4342e6ec67845113fc6d3ea07199450936 100644 (file)
@@ -255,7 +255,7 @@ static void *server(void *p) {
                 }
 
                 if (r == 0) {
-                        r = sd_bus_wait(bus, (uint64_t) -1);
+                        r = sd_bus_wait(bus, UINT64_MAX);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to wait: %m");
                                 goto fail;
index e7a14716bcc50ce6269c93768eed5f1989d37b7b..ab4045ee15b189751e0ee0bdfdfab7a67f37328a 100644 (file)
@@ -47,7 +47,7 @@ static void *server(void *p) {
                 }
 
                 if (r == 0) {
-                        r = sd_bus_wait(bus, (uint64_t) -1);
+                        r = sd_bus_wait(bus, UINT64_MAX);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to wait: %m");
                                 goto fail;
index c98b029af23c84c26373e8fed865aa9d63afae71..2434fb625e58dbccdedc909097eb88e01a8124ca 100644 (file)
@@ -116,6 +116,8 @@ _public_ int sd_device_enumerator_add_match_sysattr(sd_device_enumerator *enumer
         else
                 hashmap = &enumerator->nomatch_sysattr;
 
+        /* Do not use string_has_ops_free_free or hashmap_put_strdup() here, as this may be called
+         * multiple times with the same sysattr but different value. */
         r = hashmap_put_strdup_full(hashmap, &trivial_hash_ops_free_free, sysattr, value);
         if (r <= 0)
                 return r;
@@ -131,6 +133,8 @@ _public_ int sd_device_enumerator_add_match_property(sd_device_enumerator *enume
         assert_return(enumerator, -EINVAL);
         assert_return(property, -EINVAL);
 
+        /* Do not use string_has_ops_free_free or hashmap_put_strdup() here, as this may be called
+         * multiple times with the same property but different value. */
         r = hashmap_put_strdup_full(&enumerator->match_property, &trivial_hash_ops_free_free, property, value);
         if (r <= 0)
                 return r;
index 203106ab44929546f2f5404761d923a15aeb0a4d..3948e862a9f81be01cda8e70e90f4c07b09b78c8 100644 (file)
@@ -83,8 +83,8 @@ static int monitor_set_nl_address(sd_device_monitor *m) {
 }
 
 int device_monitor_allow_unicast_sender(sd_device_monitor *m, sd_device_monitor *sender) {
-        assert_return(m, -EINVAL);
-        assert_return(sender, -EINVAL);
+        assert(m);
+        assert(sender);
 
         m->snl_trusted_sender.nl.nl_pid = sender->snl.nl.nl_pid;
         return 0;
@@ -104,7 +104,7 @@ int device_monitor_disconnect(sd_device_monitor *m) {
 }
 
 int device_monitor_get_fd(sd_device_monitor *m) {
-        assert_return(m, -EINVAL);
+        assert(m);
 
         return m->sock;
 }
@@ -114,8 +114,8 @@ int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group,
         _cleanup_close_ int sock = -1;
         int r;
 
+        assert(group >= 0 && group < _MONITOR_NETLINK_GROUP_MAX);
         assert_return(ret, -EINVAL);
-        assert_return(group >= 0 && group < _MONITOR_NETLINK_GROUP_MAX, -EINVAL);
 
         if (group == MONITOR_GROUP_UDEV &&
             access("/run/udev/control", F_OK) < 0 &&
@@ -304,7 +304,7 @@ _public_ sd_event_source *sd_device_monitor_get_event_source(sd_device_monitor *
 int device_monitor_enable_receiving(sd_device_monitor *m) {
         int r;
 
-        assert_return(m, -EINVAL);
+        assert(m);
 
         r = sd_device_monitor_filter_update(m);
         if (r < 0)
@@ -334,8 +334,8 @@ static sd_device_monitor *device_monitor_free(sd_device_monitor *m) {
 
         (void) sd_device_monitor_detach_event(m);
 
-        hashmap_free_free_free(m->subsystem_filter);
-        set_free_free(m->tag_filter);
+        hashmap_free(m->subsystem_filter);
+        set_free(m->tag_filter);
 
         return mfree(m);
 }
@@ -346,8 +346,8 @@ static int passes_filter(sd_device_monitor *m, sd_device *device) {
         const char *tag, *subsystem, *devtype, *s, *d = NULL;
         int r;
 
-        assert_return(m, -EINVAL);
-        assert_return(device, -EINVAL);
+        assert(m);
+        assert(device);
 
         if (hashmap_isempty(m->subsystem_filter))
                 goto tag;
@@ -413,6 +413,7 @@ int device_monitor_receive_device(sd_device_monitor *m, sd_device **ret) {
         bool is_initialized = false;
         int r;
 
+        assert(m);
         assert(ret);
 
         buflen = recvmsg(m->sock, &smsg, 0);
@@ -507,10 +508,10 @@ static uint64_t string_bloom64(const char *str) {
         uint64_t bits = 0;
         uint32_t hash = string_hash32(str);
 
-        bits |= 1LLU << (hash & 63);
-        bits |= 1LLU << ((hash >> 6) & 63);
-        bits |= 1LLU << ((hash >> 12) & 63);
-        bits |= 1LLU << ((hash >> 18) & 63);
+        bits |= UINT64_C(1) << (hash & 63);
+        bits |= UINT64_C(1) << ((hash >> 6) & 63);
+        bits |= UINT64_C(1) << ((hash >> 12) & 63);
+        bits |= UINT64_C(1) << ((hash >> 18) & 63);
         return bits;
 }
 
@@ -717,41 +718,32 @@ _public_ int sd_device_monitor_filter_update(sd_device_monitor *m) {
 }
 
 _public_ int sd_device_monitor_filter_add_match_subsystem_devtype(sd_device_monitor *m, const char *subsystem, const char *devtype) {
-        _cleanup_free_ char *s = NULL, *d = NULL;
         int r;
 
         assert_return(m, -EINVAL);
         assert_return(subsystem, -EINVAL);
 
-        s = strdup(subsystem);
-        if (!s)
-                return -ENOMEM;
-
-        if (devtype) {
-                d = strdup(devtype);
-                if (!d)
-                        return -ENOMEM;
-        }
-
-        r = hashmap_ensure_put(&m->subsystem_filter, NULL, s, d);
-        if (r < 0)
+        /* Do not use string_has_ops_free_free or hashmap_put_strdup() here, as this may be called
+         * multiple times with the same subsystem but different devtypes. */
+        r = hashmap_put_strdup_full(&m->subsystem_filter, &trivial_hash_ops_free_free, subsystem, devtype);
+        if (r <= 0)
                 return r;
 
-        TAKE_PTR(s);
-        TAKE_PTR(d);
-
         m->filter_uptodate = false;
-
-        return 0;
+        return r;
 }
 
 _public_ int sd_device_monitor_filter_add_match_tag(sd_device_monitor *m, const char *tag) {
+        int r;
+
         assert_return(m, -EINVAL);
         assert_return(tag, -EINVAL);
 
-        int r = set_put_strdup(&m->tag_filter, tag);
-        if (r > 0)
-                m->filter_uptodate = false;
+        r = set_put_strdup(&m->tag_filter, tag);
+        if (r <= 0)
+                return r;
+
+        m->filter_uptodate = false;
         return r;
 }
 
@@ -760,8 +752,8 @@ _public_ int sd_device_monitor_filter_remove(sd_device_monitor *m) {
 
         assert_return(m, -EINVAL);
 
-        m->subsystem_filter = hashmap_free_free_free(m->subsystem_filter);
-        m->tag_filter = set_free_free(m->tag_filter);
+        m->subsystem_filter = hashmap_free(m->subsystem_filter);
+        m->tag_filter = set_free(m->tag_filter);
 
         if (setsockopt(m->sock, SOL_SOCKET, SO_DETACH_FILTER, &filter, sizeof(filter)) < 0)
                 return -errno;
index b14f43aae53444913e792c15e8f6b6d56f6de20d..7a7204b145b4397a47ce3fdf48be00baeffe7c50 100644 (file)
@@ -98,7 +98,7 @@ int device_get_devnode_mode(sd_device *device, mode_t *mode) {
         if (r < 0)
                 return r;
 
-        if (device->devmode == (mode_t) -1)
+        if (device->devmode == MODE_INVALID)
                 return -ENOENT;
 
         if (mode)
@@ -116,7 +116,7 @@ int device_get_devnode_uid(sd_device *device, uid_t *uid) {
         if (r < 0)
                 return r;
 
-        if (device->devuid == (uid_t) -1)
+        if (device->devuid == UID_INVALID)
                 return -ENOENT;
 
         if (uid)
@@ -154,7 +154,7 @@ int device_get_devnode_gid(sd_device *device, gid_t *gid) {
         if (r < 0)
                 return r;
 
-        if (device->devgid == (gid_t) -1)
+        if (device->devgid == GID_INVALID)
                 return -ENOENT;
 
         if (gid)
index 1ef7f4d69c540d80af6d09c0e944da70dfec6f97..e556a6f838ca9237913c5b747296c8b8d0ae40d7 100644 (file)
@@ -26,6 +26,7 @@
 #include "string-util.h"
 #include "strv.h"
 #include "strxcpyx.h"
+#include "user-util.h"
 #include "util.h"
 
 int device_new_aux(sd_device **ret) {
@@ -40,9 +41,9 @@ int device_new_aux(sd_device **ret) {
         *device = (sd_device) {
                 .n_ref = 1,
                 .watch_handle = -1,
-                .devmode = (mode_t) -1,
-                .devuid = (uid_t) -1,
-                .devgid = (gid_t) -1,
+                .devmode = MODE_INVALID,
+                .devuid = UID_INVALID,
+                .devgid = GID_INVALID,
                 .action = _SD_DEVICE_ACTION_INVALID,
         };
 
@@ -512,7 +513,7 @@ int device_read_uevent_file(sd_device *device) {
 
         path = strjoina(syspath, "/uevent");
 
-        r = read_full_file(path, &uevent, &uevent_len);
+        r = read_full_virtual_file(path, &uevent, &uevent_len);
         if (r == -EACCES) {
                 /* empty uevent files may be write-only */
                 device->uevent_loaded = true;
index 763e98c114d837b1d356475e5afb6d4e0c336def..644f3c2aeeec87c8411892863fe0a774d07a7063 100644 (file)
@@ -30,8 +30,6 @@ int main(int argc, char *argv[]) {
         const char *key, *value;
         int r;
 
-        unsetenv("SYSTEMD_MEMPOOL");
-
         r = sd_device_new_from_syspath(&loopback, "/sys/class/net/lo");
         if (r < 0)
                 return handle_error_errno(r, "Failed to create loopback device object");
index 35c4cb67eb0e1e7ba729b6001a30fae722c3c78f..b76b0623fe3562f80f8751ac3a0ec177931dbc3b 100644 (file)
@@ -1039,7 +1039,7 @@ static int source_set_pending(sd_event_source *s, bool b) {
                 }
         }
 
-        return 0;
+        return 1;
 }
 
 static sd_event_source *source_new(sd_event *e, bool floating, EventSourceType type) {
@@ -1236,7 +1236,7 @@ _public_ int sd_event_add_time(
 
         assert_return(e, -EINVAL);
         assert_return(e = event_resolve(e), -ENOPKG);
-        assert_return(accuracy != (uint64_t) -1, -EINVAL);
+        assert_return(accuracy != UINT64_MAX, -EINVAL);
         assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
         assert_return(!event_pid_changed(e), -ECHILD);
 
@@ -2594,10 +2594,11 @@ _public_ int sd_event_source_set_time_relative(sd_event_source *s, uint64_t usec
         if (r < 0)
                 return r;
 
-        if (usec >= USEC_INFINITY - t)
+        usec = usec_add(t, usec);
+        if (usec == USEC_INFINITY)
                 return -EOVERFLOW;
 
-        return sd_event_source_set_time(s, t + usec);
+        return sd_event_source_set_time(s, usec);
 }
 
 _public_ int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec) {
@@ -2614,7 +2615,7 @@ _public_ int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec
         int r;
 
         assert_return(s, -EINVAL);
-        assert_return(usec != (uint64_t) -1, -EINVAL);
+        assert_return(usec != UINT64_MAX, -EINVAL);
         assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
         assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
         assert_return(!event_pid_changed(s->event), -ECHILD);
@@ -3115,11 +3116,19 @@ static int process_timer(
         return 0;
 }
 
-static int process_child(sd_event *e) {
+static int process_child(sd_event *e, int64_t threshold, int64_t *ret_min_priority) {
+        int64_t min_priority = threshold;
+        bool something_new = false;
         sd_event_source *s;
         int r;
 
         assert(e);
+        assert(ret_min_priority);
+
+        if (!e->need_process_child) {
+                *ret_min_priority = min_priority;
+                return 0;
+        }
 
         e->need_process_child = false;
 
@@ -3144,6 +3153,9 @@ static int process_child(sd_event *e) {
         HASHMAP_FOREACH(s, e->child_sources) {
                 assert(s->type == SOURCE_CHILD);
 
+                if (s->priority > threshold)
+                        continue;
+
                 if (s->pending)
                         continue;
 
@@ -3180,10 +3192,15 @@ static int process_child(sd_event *e) {
                         r = source_set_pending(s, true);
                         if (r < 0)
                                 return r;
+                        if (r > 0) {
+                                something_new = true;
+                                min_priority = MIN(min_priority, s->priority);
+                        }
                 }
         }
 
-        return 0;
+        *ret_min_priority = min_priority;
+        return something_new;
 }
 
 static int process_pidfd(sd_event *e, sd_event_source *s, uint32_t revents) {
@@ -3213,13 +3230,13 @@ static int process_pidfd(sd_event *e, sd_event_source *s, uint32_t revents) {
         return source_set_pending(s, true);
 }
 
-static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
-        bool read_one = false;
+static int process_signal(sd_event *e, struct signal_data *d, uint32_t events, int64_t *min_priority) {
         int r;
 
         assert(e);
         assert(d);
         assert_return(events == EPOLLIN, -EIO);
+        assert(min_priority);
 
         /* If there's a signal queued on this priority and SIGCHLD is
            on this priority too, then make sure to recheck the
@@ -3245,7 +3262,7 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
                 n = read(d->fd, &si, sizeof(si));
                 if (n < 0) {
                         if (IN_SET(errno, EAGAIN, EINTR))
-                                return read_one;
+                                return 0;
 
                         return -errno;
                 }
@@ -3255,8 +3272,6 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
 
                 assert(SIGNAL_VALID(si.ssi_signo));
 
-                read_one = true;
-
                 if (e->signal_sources)
                         s = e->signal_sources[si.ssi_signo];
                 if (!s)
@@ -3270,12 +3285,16 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
                 r = source_set_pending(s, true);
                 if (r < 0)
                         return r;
+                if (r > 0 && *min_priority >= s->priority) {
+                        *min_priority = s->priority;
+                        return 1; /* an event source with smaller priority is queued. */
+                }
 
-                return 1;
+                return 0;
         }
 }
 
-static int event_inotify_data_read(sd_event *e, struct inotify_data *d, uint32_t revents) {
+static int event_inotify_data_read(sd_event *e, struct inotify_data *d, uint32_t revents, int64_t threshold) {
         ssize_t n;
 
         assert(e);
@@ -3291,6 +3310,9 @@ static int event_inotify_data_read(sd_event *e, struct inotify_data *d, uint32_t
         if (d->buffer_filled > 0)
                 return 0;
 
+        if (d->priority > threshold)
+                return 0;
+
         n = read(d->fd, &d->buffer, sizeof(d->buffer));
         if (n < 0) {
                 if (IN_SET(errno, EAGAIN, EINTR))
@@ -3786,10 +3808,15 @@ static int epoll_wait_usec(
                 int maxevents,
                 usec_t timeout) {
 
-        static bool epoll_pwait2_absent = false;
         int r, msec;
+#if 0
+        static bool epoll_pwait2_absent = false;
 
-        /* A wrapper that uses epoll_pwait2() if available, and falls back to epoll_wait() if not */
+        /* A wrapper that uses epoll_pwait2() if available, and falls back to epoll_wait() if not.
+         *
+         * FIXME: this is temporarily disabled until epoll_pwait2() becomes more widely available.
+         * See https://github.com/systemd/systemd/pull/18973 and
+         * https://github.com/systemd/systemd/issues/19052. */
 
         if (!epoll_pwait2_absent && timeout != USEC_INFINITY) {
                 struct timespec ts;
@@ -3801,12 +3828,13 @@ static int epoll_wait_usec(
                                  NULL);
                 if (r >= 0)
                         return r;
-                if (!ERRNO_IS_NOT_SUPPORTED(r) && !ERRNO_IS_PRIVILEGE(r))
+                if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno))
                         return -errno; /* Only fallback to old epoll_wait() if the syscall is masked or not
                                         * supported. */
 
                 epoll_pwait2_absent = true;
         }
+#endif
 
         if (timeout == USEC_INFINITY)
                 msec = -1;
@@ -3830,20 +3858,14 @@ static int epoll_wait_usec(
         return r;
 }
 
-_public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
+static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t *ret_min_priority) {
+        int64_t min_priority = threshold;
+        bool something_new = false;
         size_t n_event_queue, m;
         int r;
 
-        assert_return(e, -EINVAL);
-        assert_return(e = event_resolve(e), -ENOPKG);
-        assert_return(!event_pid_changed(e), -ECHILD);
-        assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
-        assert_return(e->state == SD_EVENT_ARMED, -EBUSY);
-
-        if (e->exit_requested) {
-                e->state = SD_EVENT_PENDING;
-                return 1;
-        }
+        assert(e);
+        assert(ret_min_priority);
 
         n_event_queue = MAX(e->n_sources, 1u);
         if (!GREEDY_REALLOC(e->event_queue, e->event_queue_allocated, n_event_queue))
@@ -3855,12 +3877,8 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
 
         for (;;) {
                 r = epoll_wait_usec(e->epoll_fd, e->event_queue, e->event_queue_allocated, timeout);
-                if (r == -EINTR) {
-                        e->state = SD_EVENT_PENDING;
-                        return 1;
-                }
                 if (r < 0)
-                        goto finish;
+                        return r;
 
                 m = (size_t) r;
 
@@ -3876,7 +3894,9 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
                 timeout = 0;
         }
 
-        triple_timestamp_get(&e->timestamp);
+        /* Set timestamp only when this is called first time. */
+        if (threshold == INT64_MAX)
+                triple_timestamp_get(&e->timestamp);
 
         for (size_t i = 0; i < m; i++) {
 
@@ -3892,6 +3912,11 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
 
                                 assert(s);
 
+                                if (s->priority > threshold)
+                                        continue;
+
+                                min_priority = MIN(min_priority, s->priority);
+
                                 switch (s->type) {
 
                                 case SOURCE_IO:
@@ -3919,19 +3944,75 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
                         }
 
                         case WAKEUP_SIGNAL_DATA:
-                                r = process_signal(e, e->event_queue[i].data.ptr, e->event_queue[i].events);
+                                r = process_signal(e, e->event_queue[i].data.ptr, e->event_queue[i].events, &min_priority);
                                 break;
 
                         case WAKEUP_INOTIFY_DATA:
-                                r = event_inotify_data_read(e, e->event_queue[i].data.ptr, e->event_queue[i].events);
+                                r = event_inotify_data_read(e, e->event_queue[i].data.ptr, e->event_queue[i].events, threshold);
                                 break;
 
                         default:
                                 assert_not_reached("Invalid wake-up pointer");
                         }
                 }
+                if (r < 0)
+                        return r;
+                if (r > 0)
+                        something_new = true;
+        }
+
+        *ret_min_priority = min_priority;
+        return something_new;
+}
+
+_public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
+        int r;
+
+        assert_return(e, -EINVAL);
+        assert_return(e = event_resolve(e), -ENOPKG);
+        assert_return(!event_pid_changed(e), -ECHILD);
+        assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
+        assert_return(e->state == SD_EVENT_ARMED, -EBUSY);
+
+        if (e->exit_requested) {
+                e->state = SD_EVENT_PENDING;
+                return 1;
+        }
+
+        for (int64_t threshold = INT64_MAX; ; threshold--) {
+                int64_t epoll_min_priority, child_min_priority;
+
+                /* There may be a possibility that new epoll (especially IO) and child events are
+                 * triggered just after process_epoll() call but before process_child(), and the new IO
+                 * events may have higher priority than the child events. To salvage these events,
+                 * let's call epoll_wait() again, but accepts only events with higher priority than the
+                 * previous. See issue https://github.com/systemd/systemd/issues/18190 and comments
+                 * https://github.com/systemd/systemd/pull/18750#issuecomment-785801085
+                 * https://github.com/systemd/systemd/pull/18922#issuecomment-792825226 */
+
+                r = process_epoll(e, timeout, threshold, &epoll_min_priority);
+                if (r == -EINTR) {
+                        e->state = SD_EVENT_PENDING;
+                        return 1;
+                }
                 if (r < 0)
                         goto finish;
+                if (r == 0 && threshold < INT64_MAX)
+                        /* No new epoll event. */
+                        break;
+
+                r = process_child(e, threshold, &child_min_priority);
+                if (r < 0)
+                        goto finish;
+                if (r == 0)
+                        /* No new child event. */
+                        break;
+
+                threshold = MIN(epoll_min_priority, child_min_priority);
+                if (threshold == INT64_MIN)
+                        break;
+
+                timeout = 0;
         }
 
         r = process_watchdog(e);
@@ -3958,19 +4039,12 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
         if (r < 0)
                 goto finish;
 
-        if (e->need_process_child) {
-                r = process_child(e);
-                if (r < 0)
-                        goto finish;
-        }
-
         r = process_inotify(e);
         if (r < 0)
                 goto finish;
 
         if (event_next_pending(e)) {
                 e->state = SD_EVENT_PENDING;
-
                 return 1;
         }
 
@@ -4082,7 +4156,7 @@ _public_ int sd_event_loop(sd_event *e) {
         _unused_ _cleanup_(sd_event_unrefp) sd_event *ref = NULL;
 
         while (e->state != SD_EVENT_FINISHED) {
-                r = sd_event_run(e, (uint64_t) -1);
+                r = sd_event_run(e, UINT64_MAX);
                 if (r < 0)
                         return r;
         }
index 851418c96042ac2ef041383538267ecc2933ca5f..0bc2f507aa78850b868291285753134f6544c388 100644 (file)
@@ -13,6 +13,7 @@
 #include "parse-util.h"
 #include "path-util.h"
 #include "process-util.h"
+#include "random-util.h"
 #include "rm-rf.h"
 #include "signal-util.h"
 #include "stdio-util.h"
@@ -201,6 +202,8 @@ static void test_basic(bool with_pidfd) {
         uint64_t event_now;
         int64_t priority;
 
+        log_info("/* %s(pidfd=%s) */", __func__, yes_no(with_pidfd));
+
         assert_se(setenv("SYSTEMD_PIDFD", yes_no(with_pidfd), 1) >= 0);
 
         assert_se(pipe(a) >= 0);
@@ -217,7 +220,7 @@ static void test_basic(bool with_pidfd) {
         got_unref = false;
         assert_se(sd_event_add_io(e, &t, k[0], EPOLLIN, unref_handler, NULL) >= 0);
         assert_se(write(k[1], &ch, 1) == 1);
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(got_unref);
 
         got_a = false, got_b = false, got_c = false, got_d = 0;
@@ -227,10 +230,10 @@ static void test_basic(bool with_pidfd) {
         assert_se(sd_event_add_io(e, &w, d[0], EPOLLIN, io_handler, INT_TO_PTR('d')) >= 0);
         assert_se(sd_event_source_set_enabled(w, SD_EVENT_ONESHOT) >= 0);
         assert_se(write(d[1], &ch, 1) >= 0);
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(got_d == 1);
         assert_se(write(d[1], &ch, 1) >= 0);
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(got_d == 2);
 
         assert_se(sd_event_add_io(e, &x, a[0], EPOLLIN, io_handler, INT_TO_PTR('a')) >= 0);
@@ -258,15 +261,15 @@ static void test_basic(bool with_pidfd) {
 
         assert_se(!got_a && !got_b && !got_c);
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
 
         assert_se(!got_a && got_b && !got_c);
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
 
         assert_se(!got_a && got_b && got_c);
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
 
         assert_se(got_a && got_b && got_c);
 
@@ -302,6 +305,8 @@ static void test_sd_event_now(void) {
         _cleanup_(sd_event_unrefp) sd_event *e = NULL;
         uint64_t event_now;
 
+        log_info("/* %s */", __func__);
+
         assert_se(sd_event_new(&e) >= 0);
         assert_se(sd_event_now(e, CLOCK_MONOTONIC, &event_now) > 0);
         assert_se(sd_event_now(e, CLOCK_REALTIME, &event_now) > 0);
@@ -339,6 +344,8 @@ static void test_rtqueue(void) {
         sd_event_source *u = NULL, *v = NULL, *s = NULL;
         sd_event *e = NULL;
 
+        log_info("/* %s */", __func__);
+
         assert_se(sd_event_default(&e) >= 0);
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN+2, SIGRTMIN+3, SIGUSR2, -1) >= 0);
@@ -357,19 +364,19 @@ static void test_rtqueue(void) {
         assert_se(n_rtqueue == 0);
         assert_se(last_rtqueue_sigval == 0);
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(n_rtqueue == 1);
         assert_se(last_rtqueue_sigval == 2); /* first SIGRTMIN+3 */
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(n_rtqueue == 2);
         assert_se(last_rtqueue_sigval == 4); /* second SIGRTMIN+3 */
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(n_rtqueue == 3);
         assert_se(last_rtqueue_sigval == 3); /* first SIGUSR2 */
 
-        assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+        assert_se(sd_event_run(e, UINT64_MAX) >= 1);
         assert_se(n_rtqueue == 4);
         assert_se(last_rtqueue_sigval == 1); /* SIGRTMIN+2 */
 
@@ -479,6 +486,8 @@ static void test_inotify(unsigned n_create_events) {
         const char *q;
         unsigned i;
 
+        log_info("/* %s(%u) */", __func__, n_create_events);
+
         assert_se(sd_event_default(&e) >= 0);
 
         assert_se(mkdtemp_malloc("/tmp/test-inotify-XXXXXX", &p) >= 0);
@@ -545,6 +554,8 @@ static void test_pidfd(void) {
         int pidfd;
         pid_t pid, pid2;
 
+        log_info("/* %s */", __func__);
+
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
 
         pid = fork();
@@ -619,6 +630,8 @@ static void test_ratelimit(void) {
         uint64_t interval;
         unsigned count, burst;
 
+        log_info("/* %s */", __func__);
+
         assert_se(sd_event_default(&e) >= 0);
         assert_se(pipe2(p, O_CLOEXEC|O_NONBLOCK) >= 0);
 
@@ -681,9 +694,30 @@ static void test_ratelimit(void) {
         assert_se(count == 20);
 }
 
+static void test_simple_timeout(void) {
+        _cleanup_(sd_event_unrefp) sd_event *e = NULL;
+        usec_t f, t, some_time;
+
+        some_time = random_u64_range(2 * USEC_PER_SEC);
+
+        assert_se(sd_event_default(&e) >= 0);
+
+        assert_se(sd_event_prepare(e) == 0);
+
+        f = now(CLOCK_MONOTONIC);
+        assert_se(sd_event_wait(e, some_time) >= 0);
+        t = now(CLOCK_MONOTONIC);
+
+        /* The event loop may sleep longer than the specified time (timer accuracy, scheduling latencies, …),
+         * but never shorter. Let's check that. */
+        assert_se(t >= usec_add(f, some_time));
+}
+
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
+        test_simple_timeout();
+
         test_basic(true);   /* test with pidfd */
         test_basic(false);  /* test without pidfd */
 
index 3ea3328c1e4320a85af1f9b5f91180fbadd95362..bdcf47a25bf4b87abf8e174eeccaf6c52f2563a7 100644 (file)
@@ -176,7 +176,7 @@ int decompress_blob_xz(const void *src, uint64_t src_size,
         if (ret != LZMA_OK)
                 return -ENOMEM;
 
-        space = MIN(src_size * 2, dst_max ?: (size_t) -1);
+        space = MIN(src_size * 2, dst_max ?: SIZE_MAX);
         if (!greedy_realloc(dst, dst_alloc_size, space, 1))
                 return -ENOMEM;
 
@@ -202,7 +202,7 @@ int decompress_blob_xz(const void *src, uint64_t src_size,
                         return -ENOBUFS;
 
                 used = space - s.avail_out;
-                space = MIN(2 * space, dst_max ?: (size_t) -1);
+                space = MIN(2 * space, dst_max ?: SIZE_MAX);
                 if (!greedy_realloc(dst, dst_alloc_size, space, 1))
                         return -ENOMEM;
 
@@ -554,7 +554,7 @@ int compress_stream_xz(int fdf, int fdt, uint64_t max_bytes) {
                         size_t m = sizeof(buf);
                         ssize_t n;
 
-                        if (max_bytes != (uint64_t) -1 && (uint64_t) m > max_bytes)
+                        if (max_bytes != UINT64_MAX && (uint64_t) m > max_bytes)
                                 m = (size_t) max_bytes;
 
                         n = read(fdf, buf, m);
@@ -566,7 +566,7 @@ int compress_stream_xz(int fdf, int fdt, uint64_t max_bytes) {
                                 s.next_in = buf;
                                 s.avail_in = n;
 
-                                if (max_bytes != (uint64_t) -1) {
+                                if (max_bytes != UINT64_MAX) {
                                         assert(max_bytes >= (uint64_t) n);
                                         max_bytes -= n;
                                 }
@@ -664,7 +664,7 @@ int compress_stream_lz4(int fdf, int fdt, uint64_t max_bytes) {
                 offset += n;
                 total_out += n;
 
-                if (max_bytes != (uint64_t) -1 && total_out > (size_t) max_bytes) {
+                if (max_bytes != UINT64_MAX && total_out > (size_t) max_bytes) {
                         r = log_debug_errno(SYNTHETIC_ERRNO(EFBIG),
                                             "Compressed stream longer than %" PRIu64 " bytes", max_bytes);
                         goto cleanup;
@@ -752,7 +752,7 @@ int decompress_stream_xz(int fdf, int fdt, uint64_t max_bytes) {
 
                         n = sizeof(out) - s.avail_out;
 
-                        if (max_bytes != (uint64_t) -1) {
+                        if (max_bytes != UINT64_MAX) {
                                 if (max_bytes < (uint64_t) n)
                                         return -EFBIG;
 
@@ -816,7 +816,7 @@ int decompress_stream_lz4(int in, int out, uint64_t max_bytes) {
                 total_in += used;
                 total_out += produced;
 
-                if (max_bytes != (uint64_t) -1 && total_out > (size_t) max_bytes) {
+                if (max_bytes != UINT64_MAX && total_out > (size_t) max_bytes) {
                         log_debug("Decompressed stream longer than %"PRIu64" bytes", max_bytes);
                         r = -EFBIG;
                         goto cleanup;
index 0bb9133e0cc50c60e19350551278dae97eb1302a..f8bb708e582bbbfb5e4bac582708b65b099e02d3 100644 (file)
@@ -1561,7 +1561,7 @@ bool journal_field_valid(const char *p, size_t l, bool allow_protected) {
 
            http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap08.html */
 
-        if (l == (size_t) -1)
+        if (l == SIZE_MAX)
                 l = strlen(p);
 
         /* No empty field names */
@@ -2352,7 +2352,7 @@ static int generic_array_bisect(
                 uint64_t *ret_offset,
                 uint64_t *ret_idx) {
 
-        uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = (uint64_t) -1;
+        uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = UINT64_MAX;
         bool subtract_one = false;
         Object *o, *array = NULL;
         int r;
@@ -2422,7 +2422,7 @@ static int generic_array_bisect(
                         left = 0;
                         right -= 1;
 
-                        if (last_index != (uint64_t) -1) {
+                        if (last_index != UINT64_MAX) {
                                 assert(last_index <= right);
 
                                 /* If we cached the last index we
@@ -2522,7 +2522,7 @@ static int generic_array_bisect(
 
                 n -= k;
                 t += k;
-                last_index = (uint64_t) -1;
+                last_index = UINT64_MAX;
                 a = le64toh(array->entry_array.next_entry_array_offset);
         }
 
@@ -2533,7 +2533,7 @@ found:
                 return 0;
 
         /* Let's cache this item for the next invocation */
-        chain_cache_put(f->chain_cache, ci, first, a, le64toh(array->entry_array.items[0]), t, subtract_one ? (i > 0 ? i-1 : (uint64_t) -1) : i);
+        chain_cache_put(f->chain_cache, ci, first, a, le64toh(array->entry_array.items[0]), t, subtract_one ? (i > 0 ? i-1 : UINT64_MAX) : i);
 
         if (subtract_one && i == 0)
                 p = last_p;
@@ -3447,7 +3447,7 @@ int journal_file_open(
 #elif HAVE_XZ
                 .compress_xz = compress,
 #endif
-                .compress_threshold_bytes = compress_threshold_bytes == (uint64_t) -1 ?
+                .compress_threshold_bytes = compress_threshold_bytes == UINT64_MAX ?
                                             DEFAULT_COMPRESS_THRESHOLD :
                                             MAX(MIN_COMPRESS_THRESHOLD, compress_threshold_bytes),
 #if HAVE_GCRYPT
@@ -3964,12 +3964,12 @@ void journal_reset_metrics(JournalMetrics *m) {
         /* Set everything to "pick automatic values". */
 
         *m = (JournalMetrics) {
-                .min_use = (uint64_t) -1,
-                .max_use = (uint64_t) -1,
-                .min_size = (uint64_t) -1,
-                .max_size = (uint64_t) -1,
-                .keep_free = (uint64_t) -1,
-                .n_max_files = (uint64_t) -1,
+                .min_use = UINT64_MAX,
+                .max_use = UINT64_MAX,
+                .min_size = UINT64_MAX,
+                .max_size = UINT64_MAX,
+                .keep_free = UINT64_MAX,
+                .n_max_files = UINT64_MAX,
         };
 }
 
@@ -3986,7 +3986,7 @@ void journal_default_metrics(JournalMetrics *m, int fd) {
         else
                 log_debug_errno(errno, "Failed to determine disk size: %m");
 
-        if (m->max_use == (uint64_t) -1) {
+        if (m->max_use == UINT64_MAX) {
 
                 if (fs_size > 0)
                         m->max_use = CLAMP(PAGE_ALIGN(fs_size / 10), /* 10% of file system size */
@@ -4000,7 +4000,7 @@ void journal_default_metrics(JournalMetrics *m, int fd) {
                         m->max_use = JOURNAL_FILE_SIZE_MIN*2;
         }
 
-        if (m->min_use == (uint64_t) -1) {
+        if (m->min_use == UINT64_MAX) {
                 if (fs_size > 0)
                         m->min_use = CLAMP(PAGE_ALIGN(fs_size / 50), /* 2% of file system size */
                                            MIN_USE_LOW, MIN_USE_HIGH);
@@ -4011,7 +4011,7 @@ void journal_default_metrics(JournalMetrics *m, int fd) {
         if (m->min_use > m->max_use)
                 m->min_use = m->max_use;
 
-        if (m->max_size == (uint64_t) -1)
+        if (m->max_size == UINT64_MAX)
                 m->max_size = MIN(PAGE_ALIGN(m->max_use / 8), /* 8 chunks */
                                   MAX_SIZE_UPPER);
         else
@@ -4025,14 +4025,14 @@ void journal_default_metrics(JournalMetrics *m, int fd) {
                         m->max_use = m->max_size*2;
         }
 
-        if (m->min_size == (uint64_t) -1)
+        if (m->min_size == UINT64_MAX)
                 m->min_size = JOURNAL_FILE_SIZE_MIN;
         else
                 m->min_size = CLAMP(PAGE_ALIGN(m->min_size),
                                     JOURNAL_FILE_SIZE_MIN,
                                     m->max_size ?: UINT64_MAX);
 
-        if (m->keep_free == (uint64_t) -1) {
+        if (m->keep_free == UINT64_MAX) {
                 if (fs_size > 0)
                         m->keep_free = MIN(PAGE_ALIGN(fs_size / 20), /* 5% of file system size */
                                            KEEP_FREE_UPPER);
@@ -4040,7 +4040,7 @@ void journal_default_metrics(JournalMetrics *m, int fd) {
                         m->keep_free = DEFAULT_KEEP_FREE;
         }
 
-        if (m->n_max_files == (uint64_t) -1)
+        if (m->n_max_files == UINT64_MAX)
                 m->n_max_files = DEFAULT_N_MAX_FILES;
 
         log_debug("Fixed min_use=%s max_use=%s max_size=%s min_size=%s keep_free=%s n_max_files=%" PRIu64,
index ff26f5d7e7929bad87ff19209253885f54c4fcb4..be92f803c95fd33d641b161b93f995ff0e6c0efd 100644 (file)
@@ -2542,7 +2542,7 @@ _public_ int sd_journal_get_timeout(sd_journal *j, uint64_t *timeout_usec) {
                 return fd;
 
         if (!j->on_network) {
-                *timeout_usec = (uint64_t) -1;
+                *timeout_usec = UINT64_MAX;
                 return 0;
         }
 
@@ -2724,13 +2724,10 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
         if (r < 0)
                 return r;
 
-        if (t != (uint64_t) -1) {
-                usec_t n;
+        if (t != UINT64_MAX) {
+                t = usec_sub_unsigned(t, now(CLOCK_MONOTONIC));
 
-                n = now(CLOCK_MONOTONIC);
-                t = t > n ? t - n : 0;
-
-                if (timeout_usec == (uint64_t) -1 || timeout_usec > t)
+                if (timeout_usec == UINT64_MAX || timeout_usec > t)
                         timeout_usec = t;
         }
 
index 8c78c3bbf03030c48ceb6fb55f9a8a1b22edee63..62db2266c7ba96fb4cbae5be20f7264d564d7047 100644 (file)
@@ -35,7 +35,7 @@ _noreturn_ static void log_assert_errno(const char *text, int error, const char
 
 static JournalFile *test_open(const char *name) {
         JournalFile *f;
-        assert_ret(journal_file_open(-1, name, O_RDWR|O_CREAT, 0644, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f));
+        assert_ret(journal_file_open(-1, name, O_RDWR|O_CREAT, 0644, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &f));
         return f;
 }
 
@@ -206,7 +206,7 @@ static void test_sequence_numbers(void) {
         mkdtemp_chdir_chattr(t);
 
         assert_se(journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, 0644,
-                                    true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &one) == 0);
+                                    true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &one) == 0);
 
         append_number(one, 1, &seqnum);
         printf("seqnum=%"PRIu64"\n", seqnum);
@@ -223,7 +223,7 @@ static void test_sequence_numbers(void) {
         memcpy(&seqnum_id, &one->header->seqnum_id, sizeof(sd_id128_t));
 
         assert_se(journal_file_open(-1, "two.journal", O_RDWR|O_CREAT, 0644,
-                                    true, (uint64_t) -1, false, NULL, NULL, NULL, one, &two) == 0);
+                                    true, UINT64_MAX, false, NULL, NULL, NULL, one, &two) == 0);
 
         assert_se(two->header->state == STATE_ONLINE);
         assert_se(!sd_id128_equal(two->header->file_id, one->header->file_id));
@@ -254,7 +254,7 @@ static void test_sequence_numbers(void) {
         seqnum = 0;
 
         assert_se(journal_file_open(-1, "two.journal", O_RDWR, 0,
-                                    true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &two) == 0);
+                                    true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &two) == 0);
 
         assert_se(sd_id128_equal(two->header->seqnum_id, seqnum_id));
 
index a121859e08feb3d56db359e5e279675aa8fa31b4..ca1eaaebfc4a58220e355d8dcea52658e4398f9b 100644 (file)
@@ -73,9 +73,9 @@ static void run_test(void) {
         assert_se(chdir(t) >= 0);
         (void) chattr_path(t, FS_NOCOW_FL, FS_NOCOW_FL, NULL);
 
-        assert_se(journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &one) == 0);
-        assert_se(journal_file_open(-1, "two.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &two) == 0);
-        assert_se(journal_file_open(-1, "three.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &three) == 0);
+        assert_se(journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &one) == 0);
+        assert_se(journal_file_open(-1, "two.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &two) == 0);
+        assert_se(journal_file_open(-1, "three.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &three) == 0);
 
         for (i = 0; i < N_ENTRIES; i++) {
                 char *p, *q;
index d208e4650c209a8ec70ca29566f357f30a52e0b3..e9abfef0fc9376b2cbc00e87d0bb92076ba42318 100644 (file)
@@ -41,7 +41,7 @@ static int raw_verify(const char *fn, const char *verification_key) {
         JournalFile *f;
         int r;
 
-        r = journal_file_open(-1, fn, O_RDONLY, 0666, true, (uint64_t) -1, !!verification_key, NULL, NULL, NULL, NULL, &f);
+        r = journal_file_open(-1, fn, O_RDONLY, 0666, true, UINT64_MAX, !!verification_key, NULL, NULL, NULL, NULL, &f);
         if (r < 0)
                 return r;
 
@@ -75,7 +75,7 @@ int main(int argc, char *argv[]) {
 
         log_info("Generating...");
 
-        assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
+        assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
 
         for (n = 0; n < N_ENTRIES; n++) {
                 struct iovec iovec;
@@ -97,7 +97,7 @@ int main(int argc, char *argv[]) {
 
         log_info("Verifying...");
 
-        assert_se(journal_file_open(-1, "test.journal", O_RDONLY, 0666, true, (uint64_t) -1, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
+        assert_se(journal_file_open(-1, "test.journal", O_RDONLY, 0666, true, UINT64_MAX, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
         /* journal_file_print_header(f); */
         journal_file_dump(f);
 
index f8f08b5afc8b09c8915e2c451fdeefd746840564..fd3c4d99501d29d62a57405c7c7c6bfe75cb8a74 100644 (file)
@@ -37,7 +37,7 @@ static void test_non_empty(void) {
 
         mkdtemp_chdir_chattr(t);
 
-        assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f) == 0);
+        assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, true, NULL, NULL, NULL, NULL, &f) == 0);
 
         assert_se(dual_timestamp_get(&ts));
         assert_se(sd_id128_randomize(&fake_boot_id) == 0);
@@ -98,8 +98,8 @@ static void test_non_empty(void) {
 
         assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
 
-        journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
-        journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
+        journal_file_rotate(&f, true, UINT64_MAX, true, NULL);
+        journal_file_rotate(&f, true, UINT64_MAX, true, NULL);
 
         (void) journal_file_close(f);
 
@@ -124,13 +124,13 @@ static void test_empty(void) {
 
         mkdtemp_chdir_chattr(t);
 
-        assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, false, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f1) == 0);
+        assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, false, UINT64_MAX, false, NULL, NULL, NULL, NULL, &f1) == 0);
 
-        assert_se(journal_file_open(-1, "test-compress.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f2) == 0);
+        assert_se(journal_file_open(-1, "test-compress.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &f2) == 0);
 
-        assert_se(journal_file_open(-1, "test-seal.journal", O_RDWR|O_CREAT, 0666, false, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f3) == 0);
+        assert_se(journal_file_open(-1, "test-seal.journal", O_RDWR|O_CREAT, 0666, false, UINT64_MAX, true, NULL, NULL, NULL, NULL, &f3) == 0);
 
-        assert_se(journal_file_open(-1, "test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f4) == 0);
+        assert_se(journal_file_open(-1, "test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, true, NULL, NULL, NULL, NULL, &f4) == 0);
 
         journal_file_print_header(f1);
         puts("");
@@ -224,8 +224,8 @@ static void test_min_compress_size(void) {
          * carefully */
 
         /* DEFAULT_MIN_COMPRESS_SIZE is 512 */
-        assert_se(!check_compressed((uint64_t) -1, 255));
-        assert_se(check_compressed((uint64_t) -1, 513));
+        assert_se(!check_compressed(UINT64_MAX, 255));
+        assert_se(check_compressed(UINT64_MAX, 513));
 
         /* compress everything */
         assert_se(check_compressed(0, 96));
index d15dafbd95641b16c6a72fa9cc92961a895c232b..a3da2e3f24dbc43e129b09e3ce7bb383231e754e 100644 (file)
@@ -1043,9 +1043,9 @@ _public_ int sd_login_monitor_get_timeout(sd_login_monitor *m, uint64_t *timeout
         assert_return(m, -EINVAL);
         assert_return(timeout_usec, -EINVAL);
 
-        /* For now we will only return (uint64_t) -1, since we don't
+        /* For now we will only return UINT64_MAX, since we don't
          * need any timeout. However, let's have this API to keep our
          * options open should we later on need it. */
-        *timeout_usec = (uint64_t) -1;
+        *timeout_usec = UINT64_MAX;
         return 0;
 }
index d850323ba39b9ce58eddfebd54dbe0ba424c6a81..3fc394d5ee4dc937ae5b4d7d968d33b5c716ddca 100644 (file)
@@ -277,7 +277,7 @@ static void test_monitor(void) {
                 nw = now(CLOCK_MONOTONIC);
 
                 r = poll(&pollfd, 1,
-                         timeout == (uint64_t) -1 ? -1 :
+                         timeout == UINT64_MAX ? -1 :
                          timeout > nw ? (int) ((timeout - nw) / 1000) :
                          0);
 
index 9710ed0f16319e5838bf252ffd7ae8bac646b5af..cd5a0104a6c90e26a4186a271d5c7c68b68a473d 100644 (file)
@@ -32,7 +32,6 @@ static int genl_message_new(sd_netlink *nl, sd_genl_family_t family, uint16_t nl
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         const NLType *genl_cmd_type, *nl_type;
         const NLTypeSystem *type_system;
-        struct genlmsghdr *genl;
         size_t size;
         int r;
 
@@ -63,9 +62,11 @@ static int genl_message_new(sd_netlink *nl, sd_genl_family_t family, uint16_t nl
         m->hdr->nlmsg_type = nlmsg_type;
 
         type_get_type_system(nl_type, &m->containers[0].type_system);
-        genl = NLMSG_DATA(m->hdr);
-        genl->cmd = cmd;
-        genl->version = genl_families[family].version;
+
+        *(struct genlmsghdr *) NLMSG_DATA(m->hdr) = (struct genlmsghdr) {
+                .cmd = cmd,
+                .version = genl_families[family].version,
+        };
 
         *ret = TAKE_PTR(m);
 
index 34c74f99dc1e0af7bb40df7bba36a9ceb125457a..90915fd15574cf68e035c70c3b0fe9413c4b9ef3 100644 (file)
@@ -144,7 +144,6 @@ static int add_rtattr(sd_netlink_message *m, unsigned short type, const void *da
         size_t message_length;
         struct nlmsghdr *new_hdr;
         struct rtattr *rta;
-        unsigned i;
         int offset;
 
         assert(m);
@@ -172,7 +171,7 @@ static int add_rtattr(sd_netlink_message *m, unsigned short type, const void *da
         rtattr_append_attribute_internal(rta, type, data, data_length);
 
         /* if we are inside containers, extend them */
-        for (i = 0; i < m->n_containers; i++)
+        for (unsigned i = 0; i < m->n_containers; i++)
                 GET_CONTAINER(m, i)->rta_len += RTA_SPACE(data_length);
 
         /* update message size */
@@ -643,7 +642,6 @@ int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type) {
 }
 
 int sd_netlink_message_cancel_array(sd_netlink_message *m) {
-        unsigned i;
         uint32_t rta_len;
 
         assert_return(m, -EINVAL);
@@ -652,7 +650,7 @@ int sd_netlink_message_cancel_array(sd_netlink_message *m) {
 
         rta_len = GET_CONTAINER(m, (m->n_containers - 1))->rta_len;
 
-        for (i = 0; i < m->n_containers; i++)
+        for (unsigned i = 0; i < m->n_containers; i++)
                 GET_CONTAINER(m, i)->rta_len -= rta_len;
 
         m->hdr->nlmsg_len -= rta_len;
@@ -1283,7 +1281,6 @@ int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl) {
         const NLType *nl_type;
         uint16_t type;
         size_t size;
-        unsigned i;
         int r;
 
         assert_return(m, -EINVAL);
@@ -1293,7 +1290,7 @@ int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl) {
         if (!m->sealed)
                 rtnl_message_seal(m);
 
-        for (i = 1; i <= m->n_containers; i++)
+        for (unsigned i = 1; i <= m->n_containers; i++)
                 m->containers[i].attributes = mfree(m->containers[i].attributes);
 
         m->n_containers = 0;
index 9e8dff1a72c9dd1140e6a4f4f891405abe8615b8..7af9a94e3e1d14d8850d474ff0ee3675f257eea6 100644 (file)
@@ -29,7 +29,6 @@ int socket_open(int family) {
 static int broadcast_groups_get(sd_netlink *nl) {
         _cleanup_free_ uint32_t *groups = NULL;
         socklen_t len = 0, old_len;
-        unsigned i, j;
         int r;
 
         assert(nl);
@@ -37,11 +36,11 @@ static int broadcast_groups_get(sd_netlink *nl) {
 
         r = getsockopt(nl->fd, SOL_NETLINK, NETLINK_LIST_MEMBERSHIPS, NULL, &len);
         if (r < 0) {
-                if (errno == ENOPROTOOPT) {
-                        nl->broadcast_group_dont_leave = true;
-                        return 0;
-                } else
+                if (errno != ENOPROTOOPT)
                         return -errno;
+
+                nl->broadcast_group_dont_leave = true;
+                return 0;
         }
 
         if (len == 0)
@@ -64,23 +63,15 @@ static int broadcast_groups_get(sd_netlink *nl) {
         if (r < 0)
                 return r;
 
-        for (i = 0; i < len; i++) {
-                for (j = 0; j < sizeof(uint32_t) * 8; j++) {
-                        uint32_t offset;
-                        unsigned group;
+        for (unsigned i = 0; i < len; i++)
+                for (unsigned j = 0; j < sizeof(uint32_t) * 8; j++)
+                        if (groups[i] & (1U << j)) {
+                                unsigned group = i * sizeof(uint32_t) * 8 + j + 1;
 
-                        offset = 1U << j;
-
-                        if (!(groups[i] & offset))
-                                continue;
-
-                        group = i * sizeof(uint32_t) * 8 + j + 1;
-
-                        r = hashmap_put(nl->broadcast_group_refs, UINT_TO_PTR(group), UINT_TO_PTR(1));
-                        if (r < 0)
-                                return r;
-                }
-        }
+                                r = hashmap_put(nl->broadcast_group_refs, UINT_TO_PTR(group), UINT_TO_PTR(1));
+                                if (r < 0)
+                                        return r;
+                        }
 
         return 0;
 }
@@ -104,11 +95,7 @@ int socket_bind(sd_netlink *nl) {
         if (r < 0)
                 return -errno;
 
-        r = broadcast_groups_get(nl);
-        if (r < 0)
-                return r;
-
-        return 0;
+        return broadcast_groups_get(nl);
 }
 
 static unsigned broadcast_group_get_ref(sd_netlink *nl, unsigned group) {
@@ -130,17 +117,12 @@ static int broadcast_group_set_ref(sd_netlink *nl, unsigned group, unsigned n_re
 }
 
 static int broadcast_group_join(sd_netlink *nl, unsigned group) {
-        int r;
-
         assert(nl);
         assert(nl->fd >= 0);
         assert(group > 0);
 
-        r = setsockopt(nl->fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &group, sizeof(group));
-        if (r < 0)
-                return -errno;
-
-        return 0;
+        /* group is "unsigned", but netlink(7) says the argument for NETLINK_ADD_MEMBERSHIP is "int" */
+        return setsockopt_int(nl->fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, group);
 }
 
 int socket_broadcast_group_ref(sd_netlink *nl, unsigned group) {
@@ -173,8 +155,6 @@ int socket_broadcast_group_ref(sd_netlink *nl, unsigned group) {
 }
 
 static int broadcast_group_leave(sd_netlink *nl, unsigned group) {
-        int r;
-
         assert(nl);
         assert(nl->fd >= 0);
         assert(group > 0);
@@ -182,11 +162,8 @@ static int broadcast_group_leave(sd_netlink *nl, unsigned group) {
         if (nl->broadcast_group_dont_leave)
                 return 0;
 
-        r = setsockopt(nl->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, &group, sizeof(group));
-        if (r < 0)
-                return -errno;
-
-        return 0;
+        /* group is "unsigned", but netlink(7) says the argument for NETLINK_DROP_MEMBERSHIP is "int" */
+        return setsockopt_int(nl->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, group);
 }
 
 int socket_broadcast_group_unref(sd_netlink *nl, unsigned group) {
@@ -240,8 +217,6 @@ int socket_write_message(sd_netlink *nl, sd_netlink_message *m) {
 
 int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcount) {
         _cleanup_free_ struct iovec *iovs = NULL;
-        ssize_t k;
-        size_t i;
 
         assert(nl);
         assert(m);
@@ -251,13 +226,13 @@ int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcoun
         if (!iovs)
                 return -ENOMEM;
 
-        for (i = 0; i < msgcount; i++) {
+        for (size_t i = 0; i < msgcount; i++) {
                 assert(m[i]->hdr != NULL);
                 assert(m[i]->hdr->nlmsg_len > 0);
                 iovs[i] = IOVEC_MAKE(m[i]->hdr, m[i]->hdr->nlmsg_len);
         }
 
-        k = writev(nl->fd, iovs, msgcount);
+        ssize_t k = writev(nl->fd, iovs, msgcount);
         if (k < 0)
                 return -errno;
 
@@ -325,7 +300,6 @@ int socket_read_message(sd_netlink *rtnl) {
         struct iovec iov = {};
         uint32_t group = 0;
         bool multi_part = false, done = false;
-        struct nlmsghdr *new_msg;
         size_t len;
         int r;
         unsigned i = 0;
@@ -372,7 +346,7 @@ int socket_read_message(sd_netlink *rtnl) {
                 }
         }
 
-        for (new_msg = rtnl->rbuffer; NLMSG_OK(new_msg, len) && !done; new_msg = NLMSG_NEXT(new_msg, len)) {
+        for (struct nlmsghdr *new_msg = rtnl->rbuffer; NLMSG_OK(new_msg, len) && !done; new_msg = NLMSG_NEXT(new_msg, len)) {
                 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
                 const NLType *nl_type;
 
index 47e107a3134e0c6536010c2999a25e8bfd5bbd4a..5f669f750b63b1b8bd289c3a6ec07397711edeea 100644 (file)
@@ -19,7 +19,6 @@
 
 static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int family, uint16_t type, uint16_t flags) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
-        struct nfgenmsg *nfh;
         const NLType *nl_type;
         size_t size;
         int r;
@@ -57,10 +56,11 @@ static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int famil
         m->hdr->nlmsg_len = size;
         m->hdr->nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | type;
 
-        nfh = NLMSG_DATA(m->hdr);
-        nfh->nfgen_family = family;
-        nfh->version = NFNETLINK_V0;
-        nfh->res_id = nfnl->serial;
+        *(struct nfgenmsg*) NLMSG_DATA(m->hdr) = (struct nfgenmsg) {
+                .nfgen_family = family,
+                .version = NFNETLINK_V0,
+                .res_id = nfnl->serial,
+        };
 
         *ret = TAKE_PTR(m);
         return 0;
@@ -68,17 +68,17 @@ static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int famil
 
 static int sd_nfnl_message_batch(sd_netlink *nfnl, sd_netlink_message **ret, int v) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
-        struct nfgenmsg *nfh;
         int r;
 
         r = message_new(nfnl, &m, v);
         if (r < 0)
                 return r;
 
-        nfh = NLMSG_DATA(m->hdr);
-        nfh->nfgen_family = AF_UNSPEC;
-        nfh->version = NFNETLINK_V0;
-        nfh->res_id = NFNL_SUBSYS_NFTABLES;
+        *(struct nfgenmsg*) NLMSG_DATA(m->hdr) = (struct nfgenmsg) {
+                .nfgen_family = AF_UNSPEC,
+                .version = NFNETLINK_V0,
+                .res_id = NFNL_SUBSYS_NFTABLES,
+        };
 
         *ret = TAKE_PTR(m);
         return r;
index f754d08ef44057706827e87484191cc15ceea382..f862d48253ef27d359b3628725b7966b3dfaf897 100644 (file)
@@ -512,13 +512,13 @@ int sd_netlink_process(sd_netlink *rtnl, sd_netlink_message **ret) {
 }
 
 static usec_t calc_elapse(uint64_t usec) {
-        if (usec == (uint64_t) -1)
+        if (usec == UINT64_MAX)
                 return 0;
 
         if (usec == 0)
                 usec = RTNL_DEFAULT_TIMEOUT;
 
-        return now(CLOCK_MONOTONIC) + usec;
+        return usec_add(now(CLOCK_MONOTONIC), usec);
 }
 
 static int rtnl_poll(sd_netlink *rtnl, bool need_more, uint64_t timeout_usec) {
@@ -550,7 +550,7 @@ static int rtnl_poll(sd_netlink *rtnl, bool need_more, uint64_t timeout_usec) {
                 }
         }
 
-        if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
+        if (timeout_usec != UINT64_MAX && (m == USEC_INFINITY || timeout_usec < m))
                 m = timeout_usec;
 
         r = fd_wait_for_event(rtnl->fd, e, m);
@@ -606,7 +606,7 @@ int sd_netlink_call_async(
         if (r < 0)
                 return r;
 
-        if (usec != (uint64_t) -1) {
+        if (usec != UINT64_MAX) {
                 r = prioq_ensure_allocated(&nl->reply_callbacks_prioq, timeout_compare);
                 if (r < 0)
                         return r;
@@ -714,7 +714,7 @@ int sd_netlink_read(sd_netlink *rtnl,
 
                         left = timeout - n;
                 } else
-                        left = (uint64_t) -1;
+                        left = UINT64_MAX;
 
                 r = rtnl_poll(rtnl, true, left);
                 if (r < 0)
@@ -766,7 +766,7 @@ int sd_netlink_get_timeout(const sd_netlink *rtnl, uint64_t *timeout_usec) {
 
         c = prioq_peek(rtnl->reply_callbacks_prioq);
         if (!c) {
-                *timeout_usec = (uint64_t) -1;
+                *timeout_usec = UINT64_MAX;
                 return 0;
         }
 
index 060d84ae96627e0a8bfb6598c95b4e32cc5e6eb0..ccdfde9137e7b1a3072e894d9852f957e1231cb0 100644 (file)
@@ -461,9 +461,9 @@ _public_ int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *tim
         assert_return(m, -EINVAL);
         assert_return(timeout_usec, -EINVAL);
 
-        /* For now we will only return (uint64_t) -1, since we don't
+        /* For now we will only return UINT64_MAX, since we don't
          * need any timeout. However, let's have this API to keep our
          * options open should we later on need it. */
-        *timeout_usec = (uint64_t) -1;
+        *timeout_usec = UINT64_MAX;
         return 0;
 }
index 6dae398acbc414d8d41e0a6df6cd4672d7183d06..ee973c0692278444cfb45b868819ed659da879f4 100644 (file)
@@ -621,7 +621,7 @@ _public_ int sd_resolve_get_timeout(sd_resolve *resolve, uint64_t *usec) {
         assert_return(usec, -EINVAL);
         assert_return(!resolve_pid_changed(resolve), -ECHILD);
 
-        *usec = (uint64_t) -1;
+        *usec = UINT64_MAX;
         return 0;
 }
 
index a93adbd7a2e977cf49484c8981363ff70ba2cac5..4ddcf95d05f57300c7b62b75e2c245a304de3515 100644 (file)
@@ -206,12 +206,10 @@ static int udev_monitor_receive_sd_device(struct udev_monitor *udev_monitor, sd_
                 for (;;) {
                         /* Wait for next message */
                         r = fd_wait_for_event(device_monitor_get_fd(udev_monitor->monitor), POLLIN, 0);
-                        if (r < 0) {
-                                if (IN_SET(r, -EINTR, -EAGAIN))
-                                        continue;
-
+                        if (r == -EINTR)
+                                continue;
+                        if (r < 0)
                                 return r;
-                        }
                         if (r == 0)
                                 return -EAGAIN;
 
index 3f0341a698a41d690c41150f3c30555b1d5db3c9..c082fdca46843e03fc078df71b254e5854f3b43d 100644 (file)
@@ -28,8 +28,6 @@ int main(int argc, char *argv[]) {
         pthread_t t;
         int r;
 
-        unsetenv("SYSTEMD_MEMPOOL");
-
         loopback = udev_device_new_from_syspath(NULL, "/sys/class/net/lo");
         if (!loopback)
                 return handle_error_errno(errno, "Failed to create loopback device object");
index 9c97313edcad6457fd3f44a5655a6eb8726e2fda..f44c0bab2a9e46e016ad1efc3fed1a8a963ae038 100644 (file)
@@ -19,6 +19,7 @@
 #include "bus-polkit.h"
 #include "def.h"
 #include "dlfcn-util.h"
+#include "kbd-util.h"
 #include "keymap-util.h"
 #include "locale-util.h"
 #include "macro.h"
@@ -474,7 +475,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er
 
 static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_error *error) {
         Context *c = userdata;
-        const char *keymap, *keymap_toggle;
+        const char *name, *keymap, *keymap_toggle;
         int convert, interactive, r;
 
         assert(m);
@@ -490,17 +491,23 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro
         r = vconsole_read_data(c, m);
         if (r < 0) {
                 log_error_errno(r, "Failed to read virtual console keymap data: %m");
-                return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Failed to read virtual console keymap data");
+                return sd_bus_error_set_errnof(error, r, "Failed to read virtual console keymap data: %m");
+        }
+
+        FOREACH_STRING(name, keymap ?: keymap_toggle, keymap ? keymap_toggle : NULL) {
+                r = keymap_exists(name); /* This also verifies that the keymap name is kosher. */
+                if (r < 0) {
+                        log_error_errno(r, "Failed to check keymap %s: %m", name);
+                        return sd_bus_error_set_errnof(error, r, "Failed to check keymap %s: %m", name);
+                }
+                if (r == 0)
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Keymap %s is not installed.", name);
         }
 
         if (streq_ptr(keymap, c->vc_keymap) &&
             streq_ptr(keymap_toggle, c->vc_keymap_toggle))
                 return sd_bus_reply_method_return(m, NULL);
 
-        if ((keymap && (!filename_is_valid(keymap) || !string_is_safe(keymap))) ||
-            (keymap_toggle && (!filename_is_valid(keymap_toggle) || !string_is_safe(keymap_toggle))))
-                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Received invalid keymap data");
-
         r = bus_verify_polkit_async(
                         m,
                         CAP_SYS_ADMIN,
index 98bc21eb2dfc950f314411bb120c4d7143e0c0fa..e871628b9a5d8ade9004580a03b9e6502de146cc 100644 (file)
@@ -131,7 +131,7 @@ static int print_inhibitors(sd_bus *bus) {
                 return bus_log_parse_error(r);
 
         if (table_get_rows(table) > 1) {
-                r = table_set_sort(table, (size_t) 1, (size_t) 0, (size_t) 5, (size_t) 6, (size_t) -1);
+                r = table_set_sort(table, (size_t) 1, (size_t) 0, (size_t) 5, (size_t) 6);
                 if (r < 0)
                         return table_log_sort_error(r);
 
index 3e135858a83c5d0b311779eda85b4852fbfce3d4..4ece3fda5862c7bd2a5e1264a8f94fbb57a9ef76 100644 (file)
@@ -90,7 +90,7 @@ static int show_table(Table *table, const char *word) {
         assert(word);
 
         if (table_get_rows(table) > 1 || OUTPUT_MODE_IS_JSON(arg_output)) {
-                r = table_set_sort(table, (size_t) 0, (size_t) -1);
+                r = table_set_sort(table, (size_t) 0);
                 if (r < 0)
                         return table_log_sort_error(r);
 
index 5eb3534f530df187d47785d24893e97e97d2b187..d6b9289ea68ca055a7188c601e8790952bf66d6e 100644 (file)
@@ -137,7 +137,7 @@ static int brightness_writer_fork(BrightnessWriter *w) {
         assert(w->child == 0);
         assert(!w->child_event_source);
 
-        r = safe_fork("(sd-bright)", FORK_DEATHSIG|FORK_NULL_STDIO|FORK_CLOSE_ALL_FDS|FORK_LOG, &w->child);
+        r = safe_fork("(sd-bright)", FORK_DEATHSIG|FORK_NULL_STDIO|FORK_CLOSE_ALL_FDS|FORK_LOG|FORK_REOPEN_LOG, &w->child);
         if (r < 0)
                 return r;
         if (r == 0) {
index b9b2524822acabad36375fa25858b3edc9b46bd0..a539a2e9797d2e2a78336d32dbc52fa489a09434 100644 (file)
@@ -1637,7 +1637,7 @@ static int execute_shutdown_or_sleep(
         m->action_what = w;
 
         /* Make sure the lid switch is ignored for a while */
-        manager_set_lid_switch_ignore(m, now(CLOCK_MONOTONIC) + m->holdoff_timeout_usec);
+        manager_set_lid_switch_ignore(m, usec_add(now(CLOCK_MONOTONIC), m->holdoff_timeout_usec));
 
         return 0;
 
@@ -4084,7 +4084,7 @@ int manager_start_scope(
                 return r;
 
         /* disable TasksMax= for the session scope, rely on the slice setting for it */
-        r = sd_bus_message_append(m, "(sv)", "TasksMax", "t", (uint64_t)-1);
+        r = sd_bus_message_append(m, "(sv)", "TasksMax", "t", UINT64_MAX);
         if (r < 0)
                 return bus_log_create_error(r);
 
index 56235230cf7d5d34083feb460b9ceead76c50632..4887889facb482d61f3f36b8ad39d624428c486c 100644 (file)
@@ -1148,7 +1148,7 @@ static int manager_run(Manager *m) {
                 if (r > 0)
                         continue;
 
-                r = sd_event_run(m->event, (uint64_t) -1);
+                r = sd_event_run(m->event, UINT64_MAX);
                 if (r < 0)
                         return r;
         }
index 800c452a60f6de606ed17bef14f084a28b0f071f..76f529c176be017003b5961b50340e208a69d0a8 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/logind.conf' to display the full config.
+#
 # See logind.conf(5) for details.
 
 [Login]
index ac14942ba9722cfa50b31cdb906b6abfded62ab5..95d2ef0f0633e63dcb47e794d847093a789d550f 100644 (file)
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="PowerOff"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="PowerOffWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="Reboot"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="RebootWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="Halt"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="HaltWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="Suspend"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="SuspendWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="Hibernate"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="HibernateWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="HybridSleep"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="HybridSleepWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="SuspendThenHibernate"/>
 
+                <allow send_destination="org.freedesktop.login1"
+                       send_interface="org.freedesktop.login1.Manager"
+                       send_member="SuspendThenHibernateWithFlags"/>
+
                 <allow send_destination="org.freedesktop.login1"
                        send_interface="org.freedesktop.login1.Manager"
                        send_member="CanPowerOff"/>
index a23200b3b579b17dbd3d7c8d3a1109aa546a295c..2021c31bd5227e3ce28c86daf057f2253e89f45a 100644 (file)
@@ -328,7 +328,7 @@ static int append_session_memory_max(pam_handle_t *handle, sd_bus_message *m, co
                 return PAM_SUCCESS;
 
         if (streq(limit, "infinity")) {
-                r = sd_bus_message_append(m, "(sv)", "MemoryMax", "t", (uint64_t)-1);
+                r = sd_bus_message_append(m, "(sv)", "MemoryMax", "t", UINT64_MAX);
                 if (r < 0)
                         return pam_bus_log_create_error(handle, r);
 
index 5a19dbfeff951d4ee5992da9208f730a0b037491..5c3af06cac6e74497d95311b276ae314d946ed46 100644 (file)
@@ -32,7 +32,7 @@ static int show_sysfs_one(
         assert(prefix);
 
         if (flags & OUTPUT_FULL_WIDTH)
-                max_width = (size_t) -1;
+                max_width = SIZE_MAX;
         else if (n_columns < 10)
                 max_width = 10;
         else
@@ -113,7 +113,7 @@ static int show_sysfs_one(
                                 return -ENOMEM;
 
                         r = show_sysfs_one(seat, dev_list, i_dev, n_dev, sysfs, p,
-                                           n_columns == (unsigned) -1 || n_columns < 2 ? n_columns : n_columns - 2,
+                                           n_columns == UINT_MAX || n_columns < 2 ? n_columns : n_columns - 2,
                                            flags);
                         if (r < 0)
                                 return r;
index 7d6e1c716341fedde629cf25b9d639795b4a2f9a..e7c4ed3c7c17cdfef73b28e4edf482bd4ac1fd76 100644 (file)
@@ -394,7 +394,7 @@ int bus_machine_method_get_os_release(sd_bus_message *message, void *userdata, s
                         if (r < 0)
                                 _exit(EXIT_FAILURE);
 
-                        r = copy_bytes(fd, pair[1], (uint64_t) -1, 0);
+                        r = copy_bytes(fd, pair[1], UINT64_MAX, 0);
                         if (r < 0)
                                 _exit(EXIT_FAILURE);
 
index e5befe50e113cfd76689bcfa84cbc30afa97c3bc..d7849973b855c44291f49cb2db28516100d687ee 100644 (file)
@@ -239,7 +239,7 @@ static int show_table(Table *table, const char *word) {
         assert(word);
 
         if (table_get_rows(table) > 1 || OUTPUT_MODE_IS_JSON(arg_output)) {
-                r = table_set_sort(table, (size_t) 0, (size_t) -1);
+                r = table_set_sort(table, (size_t) 0);
                 if (r < 0)
                         return table_log_sort_error(r);
 
@@ -964,8 +964,8 @@ static int show_pool_info(sd_bus *bus) {
         };
 
         PoolStatusInfo info = {
-                .usage = (uint64_t) -1,
-                .limit = (uint64_t) -1,
+                .usage = UINT64_MAX,
+                .limit = UINT64_MAX,
         };
 
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -2384,7 +2384,7 @@ static int set_limit(int argc, char *argv[], void *userdata) {
         polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
 
         if (STR_IN_SET(argv[argc-1], "-", "none", "infinity"))
-                limit = (uint64_t) -1;
+                limit = UINT64_MAX;
         else {
                 r = parse_size(argv[argc-1], 1024, &limit);
                 if (r < 0)
index bb6a2bc5761ba09779046104ce98e12c18539692..0a6ae96bc6eeee50176195476b755808d558761a 100644 (file)
@@ -45,7 +45,7 @@ static int property_get_pool_usage(
                 sd_bus_error *error) {
 
         _cleanup_close_ int fd = -1;
-        uint64_t usage = (uint64_t) -1;
+        uint64_t usage = UINT64_MAX;
 
         assert(bus);
         assert(reply);
@@ -71,7 +71,7 @@ static int property_get_pool_limit(
                 sd_bus_error *error) {
 
         _cleanup_close_ int fd = -1;
-        uint64_t size = (uint64_t) -1;
+        uint64_t size = UINT64_MAX;
 
         assert(bus);
         assert(reply);
index 4a8f46761a6c17805ec1b58ba044c8969c605daf..8c36dec12a6cef0da5127726356f84ccaafee183 100644 (file)
@@ -1383,7 +1383,7 @@ static int list_devices(void) {
         if (arg_full)
                 table_set_width(table, 0);
 
-        r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX);
+        r = table_set_sort(table, (size_t) 0);
         if (r < 0)
                 return log_error_errno(r, "Failed to set sort index: %m");
 
index 3ff04467b0d16ccc3adb94c8d84a1acfd2306b71..4fca3106dc9431ad32f0af3fed74a34d194346ad 100644 (file)
@@ -113,6 +113,8 @@ sources = files('''
         networkd-speed-meter.h
         networkd-sriov.c
         networkd-sriov.h
+        networkd-state-file.c
+        networkd-state-file.h
         networkd-sysctl.c
         networkd-sysctl.h
         networkd-util.c
index 86cd1f19b372713922451e66f0f43ed7cc49acda..1f899e90f67abff9d02873608bb2f59e206b3df4 100644 (file)
@@ -84,11 +84,10 @@ int config_parse_badadv_bandwidth (
                 return 0;
         }
 
-        if (k/1000/100 > UINT32_MAX) {
+        if (k/1000/100 > UINT32_MAX)
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "The value of '%s=', is outside of 0...429496729500000 range: %s",
                            lvalue, rvalue);
-        }
 
         *bandwidth = k/1000/100;
 
index fb0353486932596363ae00d4ed3ae6f72ba02275..b31f0fa81ab23f7c77fc604a28e37edd28c29635 100644 (file)
@@ -656,7 +656,6 @@ int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callb
 
 int netdev_load_one(Manager *manager, const char *filename) {
         _cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL;
-        _cleanup_fclose_ FILE *file = NULL;
         const char *dropin_dirname;
         bool independent = false;
         int r;
@@ -664,15 +663,12 @@ int netdev_load_one(Manager *manager, const char *filename) {
         assert(manager);
         assert(filename);
 
-        file = fopen(filename, "re");
-        if (!file) {
-                if (errno == ENOENT)
-                        return 0;
-
-                return -errno;
-        }
-
-        if (null_or_empty_fd(fileno(file))) {
+        r = null_or_empty_path(filename);
+        if (r == -ENOENT)
+                return 0;
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 log_debug("Skipping empty file: %s", filename);
                 return 0;
         }
@@ -714,10 +710,6 @@ int netdev_load_one(Manager *manager, const char *filename) {
                 return 0;
         }
 
-        r = fseek(file, 0, SEEK_SET);
-        if (r < 0)
-                return -errno;
-
         netdev = malloc0(NETDEV_VTABLE(netdev_raw)->object_size);
         if (!netdev)
                 return log_oom();
index 2fab269397f5ab121ef6fd7b2b425a9da63cb50a..23718081b90bc5c513fae83c6afd44061ec3243a 100644 (file)
@@ -389,7 +389,7 @@ static int netdev_ip6tnl_fill_message_create(NetDev *netdev, Link *link, sd_netl
         if (t->allow_localremote >= 0)
                 SET_FLAG(t->flags, IP6_TNL_F_ALLOW_LOCAL_REMOTE, t->allow_localremote);
 
-        if (t->encap_limit != IPV6_DEFAULT_TNL_ENCAP_LIMIT) {
+        if (t->encap_limit != 0) {
                 r = sd_netlink_message_append_u8(m, IFLA_IPTUN_ENCAP_LIMIT, t->encap_limit);
                 if (r < 0)
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_LIMIT attribute: %m");
index 763d5ef37da99a21f6a3b8ca6fc74a21879e005d..faaa6a7b6caefec839dfe4e094a2c8fee963c959 100644 (file)
@@ -1011,7 +1011,7 @@ static int dump_address_labels(sd_netlink *rtnl) {
         if (arg_full)
                 table_set_width(table, 0);
 
-        r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX);
+        r = table_set_sort(table, (size_t) 0);
         if (r < 0)
                 return r;
 
@@ -2510,8 +2510,8 @@ static int link_up_down(int argc, char *argv[], void *userdata) {
                 if (r < 0) {
                         char ifname[IF_NAMESIZE + 1];
 
-                        return log_error_errno(r, "Failed to %s interface %s: %m",
-                                               argv[1], format_ifname_full(index, ifname, FORMAT_IFNAME_IFINDEX));
+                        return log_error_errno(r, "Failed to bring %s interface %s: %m",
+                                               argv[0], format_ifname_full(index, ifname, FORMAT_IFNAME_IFINDEX));
                 }
         }
 
index b0c783c774ac7b088461aae0ac1d18ac6b5d6dee..6f06e2218d348897461b8b66984da1fc4351d998 100644 (file)
@@ -17,6 +17,7 @@
 #include "networkd-link.h"
 #include "networkd-manager.h"
 #include "networkd-network.h"
+#include "networkd-state-file.h"
 #include "string-table.h"
 #include "strv.h"
 #include "sysctl-util.h"
@@ -1506,7 +1507,7 @@ int config_parse_dhcp_max_attempts(
         }
 
         if (streq(rvalue, "infinity")) {
-                network->dhcp_max_attempts = (uint64_t) -1;
+                network->dhcp_max_attempts = UINT64_MAX;
                 return 0;
         }
 
index 3ffe587a862f485feddee2dbf317e4eb1d9b6a7c..f57828b57da4e5f77649628ad2fef8a257aaf920 100644 (file)
@@ -13,6 +13,7 @@
 #include "networkd-link-bus.h"
 #include "networkd-link.h"
 #include "networkd-manager.h"
+#include "networkd-state-file.h"
 #include "parse-util.h"
 #include "resolve-util.h"
 #include "socket-netlink.h"
@@ -146,7 +147,7 @@ static int bus_link_method_set_dns_servers_internal(sd_bus_message *message, voi
                 goto finalize;
         }
 
-        if (l->n_dns != (unsigned) -1)
+        if (l->n_dns != UINT_MAX)
                 for (unsigned i = 0; i < l->n_dns; i++)
                         in_addr_full_free(l->dns[i]);
 
index 96d4d9235b8fd53fb0a855b6bcd1e87099fdf1d5..6868a7ccb2c227c6ff3700fd17c66e71f39713ae 100644 (file)
@@ -11,6 +11,8 @@
 #include "bond.h"
 #include "bridge.h"
 #include "bus-util.h"
+#include "device-private.h"
+#include "device-util.h"
 #include "dhcp-identifier.h"
 #include "dhcp-lease-internal.h"
 #include "env-file.h"
@@ -42,6 +44,7 @@
 #include "networkd-sysctl.h"
 #include "networkd-radv.h"
 #include "networkd-routing-policy-rule.h"
+#include "networkd-state-file.h"
 #include "networkd-wifi.h"
 #include "set.h"
 #include "socket-util.h"
@@ -400,7 +403,7 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
                 .ifindex = ifindex,
                 .iftype = iftype,
 
-                .n_dns = (unsigned) -1,
+                .n_dns = UINT_MAX,
                 .dns_default_route = -1,
                 .llmnr = _RESOLVE_SUPPORT_INVALID,
                 .mdns = _RESOLVE_SUPPORT_INVALID,
@@ -469,11 +472,11 @@ void link_ntp_settings_clear(Link *link) {
 }
 
 void link_dns_settings_clear(Link *link) {
-        if (link->n_dns != (unsigned) -1)
+        if (link->n_dns != UINT_MAX)
                 for (unsigned i = 0; i < link->n_dns; i++)
                         in_addr_full_free(link->dns[i]);
         link->dns = mfree(link->dns);
-        link->n_dns = (unsigned) -1;
+        link->n_dns = UINT_MAX;
 
         link->search_domains = ordered_set_free_free(link->search_domains);
         link->route_domains = ordered_set_free_free(link->route_domains);
@@ -543,8 +546,6 @@ static Link *link_free(Link *link) {
         link->ndisc_addresses = set_free(link->ndisc_addresses);
 
         link_free_engines(link);
-        free(link->lease_file);
-        free(link->lldp_file);
 
         free(link->ifname);
         strv_free(link->alternative_names);
@@ -552,8 +553,9 @@ static Link *link_free(Link *link) {
         free(link->ssid);
         free(link->driver);
 
-        (void) unlink(link->state_file);
-        free(link->state_file);
+        unlink_and_free(link->lease_file);
+        unlink_and_free(link->lldp_file);
+        unlink_and_free(link->state_file);
 
         sd_device_unref(link->sd_device);
 
@@ -1733,7 +1735,7 @@ static void link_detach_from_manager(Link *link) {
         link_unref(link);
 }
 
-void link_drop(Link *link) {
+static void link_drop(Link *link) {
         if (!link || link->state == LINK_STATE_LINGER)
                 return;
 
@@ -2380,7 +2382,7 @@ static int link_initialized_handler(sd_netlink *rtnl, sd_netlink_message *m, Lin
         return 1;
 }
 
-int link_initialized(Link *link, sd_device *device) {
+static int link_initialized(Link *link, sd_device *device) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         int r;
 
@@ -2420,7 +2422,7 @@ int link_initialized(Link *link, sd_device *device) {
         return 0;
 }
 
-int link_add(Manager *m, sd_netlink_message *message, Link **ret) {
+static int link_add(Manager *m, sd_netlink_message *message, Link **ret) {
         _cleanup_(sd_device_unrefp) sd_device *device = NULL;
         char ifindex_str[2 + DECIMAL_STR_MAX(int)];
         Link *link;
@@ -2505,6 +2507,57 @@ int link_ipv6ll_gained(Link *link, const struct in6_addr *address) {
         return 0;
 }
 
+int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata) {
+        sd_device_action_t action;
+        Manager *m = userdata;
+        Link *link = NULL;
+        int r, ifindex;
+
+        assert(m);
+        assert(device);
+
+        r = sd_device_get_action(device, &action);
+        if (r < 0) {
+                log_device_debug_errno(device, r, "Failed to get udev action, ignoring device: %m");
+                return 0;
+        }
+
+        /* Ignore the "remove" uevent — let's remove a device only if rtnetlink says so. All other uevents
+         * are "positive" events in some form, i.e. inform us about a changed or new network interface, that
+         * still exists — and we are interested in that. */
+        if (action == SD_DEVICE_REMOVE)
+                return 0;
+
+        r = sd_device_get_ifindex(device, &ifindex);
+        if (r < 0) {
+                log_device_debug_errno(device, r, "Ignoring udev %s event for device without ifindex or with invalid ifindex: %m",
+                                       device_action_to_string(action));
+                return 0;
+        }
+
+        r = device_is_renaming(device);
+        if (r < 0) {
+                log_device_error_errno(device, r, "Failed to determine the device is renamed or not, ignoring '%s' uevent: %m",
+                                       device_action_to_string(action));
+                return 0;
+        }
+        if (r > 0) {
+                log_device_debug(device, "Interface is under renaming, wait for the interface to be renamed.");
+                return 0;
+        }
+
+        r = link_get(m, ifindex, &link);
+        if (r < 0) {
+                if (r != -ENODEV)
+                        log_debug_errno(r, "Failed to get link from ifindex %i, ignoring: %m", ifindex);
+                return 0;
+        }
+
+        (void) link_initialized(link, device);
+
+        return 0;
+}
+
 static int link_carrier_gained(Link *link) {
         int r;
 
@@ -2618,13 +2671,14 @@ int link_carrier_reset(Link *link) {
         return 0;
 }
 
-/* This is called every time an interface admin state changes to up;
- * specifically, when IFF_UP flag changes from unset to set */
 static int link_admin_state_up(Link *link) {
         int r;
 
         assert(link);
 
+        /* This is called every time an interface admin state changes to up;
+         * specifically, when IFF_UP flag changes from unset to set. */
+
         if (!link->network)
                 return 0;
 
@@ -2648,7 +2702,6 @@ static int link_admin_state_up(Link *link) {
 }
 
 static int link_admin_state_down(Link *link) {
-
         assert(link);
 
         if (!link->network)
@@ -2662,7 +2715,7 @@ static int link_admin_state_down(Link *link) {
         return 0;
 }
 
-int link_update(Link *link, sd_netlink_message *m) {
+static int link_update(Link *link, sd_netlink_message *m) {
         _cleanup_strv_free_ char **s = NULL;
         hw_addr_data hw_addr;
         const char *ifname;
@@ -2806,388 +2859,91 @@ int link_update(Link *link, sd_netlink_message *m) {
         return 0;
 }
 
-static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
-        bool space = false;
-        Link *link;
-
-        assert(f);
-        assert(prefix);
-
-        if (hashmap_isempty(h))
-                return;
-
-        fputs(prefix, f);
-        HASHMAP_FOREACH(link, h) {
-                if (space)
-                        fputc(' ', f);
-
-                fprintf(f, "%i", link->ifindex);
-                space = true;
-        }
-
-        fputc('\n', f);
-}
-
-static void link_save_dns(Link *link, FILE *f, struct in_addr_full **dns, unsigned n_dns, bool *space) {
-        for (unsigned j = 0; j < n_dns; j++) {
-                const char *str;
-
-                if (dns[j]->ifindex != 0 && dns[j]->ifindex != link->ifindex)
-                        continue;
-
-                str = in_addr_full_to_string(dns[j]);
-                if (!str)
-                        continue;
-
-                if (*space)
-                        fputc(' ', f);
-                fputs(str, f);
-                *space = true;
-        }
-}
-
-static void serialize_addresses(
-                FILE *f,
-                const char *lvalue,
-                bool *space,
-                char **addresses,
-                sd_dhcp_lease *lease,
-                bool conditional,
-                sd_dhcp_lease_server_type_t what,
-                sd_dhcp6_lease *lease6,
-                bool conditional6,
-                int (*lease6_get_addr)(sd_dhcp6_lease*, const struct in6_addr**),
-                int (*lease6_get_fqdn)(sd_dhcp6_lease*, char ***)) {
-        int r;
-
-        bool _space = false;
-        if (!space)
-                space = &_space;
+int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
+        Link *link = NULL;
+        NetDev *netdev = NULL;
+        uint16_t type;
+        const char *name;
+        int r, ifindex;
 
-        if (lvalue)
-                fprintf(f, "%s=", lvalue);
-        fputstrv(f, addresses, NULL, space);
+        assert(rtnl);
+        assert(message);
+        assert(m);
 
-        if (lease && conditional) {
-                const struct in_addr *lease_addresses;
+        if (sd_netlink_message_is_error(message)) {
+                r = sd_netlink_message_get_errno(message);
+                if (r < 0)
+                        log_message_warning_errno(message, r, "rtnl: Could not receive link message, ignoring");
 
-                r = sd_dhcp_lease_get_servers(lease, what, &lease_addresses);
-                if (r > 0)
-                        serialize_in_addrs(f, lease_addresses, r, space, in4_addr_is_non_local);
+                return 0;
         }
 
-        if (lease6 && conditional6 && lease6_get_addr) {
-                const struct in6_addr *in6_addrs;
-
-                r = lease6_get_addr(lease6, &in6_addrs);
-                if (r > 0)
-                        serialize_in6_addrs(f, in6_addrs, r, space);
+        r = sd_netlink_message_get_type(message, &type);
+        if (r < 0) {
+                log_warning_errno(r, "rtnl: Could not get message type, ignoring: %m");
+                return 0;
+        } else if (!IN_SET(type, RTM_NEWLINK, RTM_DELLINK)) {
+                log_warning("rtnl: Received unexpected message type %u when processing link, ignoring.", type);
+                return 0;
         }
 
-        if (lease6 && conditional6 && lease6_get_fqdn) {
-                char **in6_hosts;
-
-                r = lease6_get_fqdn(lease6, &in6_hosts);
-                if (r > 0)
-                        fputstrv(f, in6_hosts, NULL, space);
+        r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
+        if (r < 0) {
+                log_warning_errno(r, "rtnl: Could not get ifindex from link message, ignoring: %m");
+                return 0;
+        } else if (ifindex <= 0) {
+                log_warning("rtnl: received link message with invalid ifindex %d, ignoring.", ifindex);
+                return 0;
         }
 
-        if (lvalue)
-                fputc('\n', f);
-}
-
-int link_save(Link *link) {
-        const char *admin_state, *oper_state, *carrier_state, *address_state;
-        _cleanup_free_ char *temp_path = NULL;
-        _cleanup_fclose_ FILE *f = NULL;
-        int r;
-
-        assert(link);
-        assert(link->state_file);
-        assert(link->lease_file);
-        assert(link->manager);
-
-        if (link->state == LINK_STATE_LINGER) {
-                (void) unlink(link->state_file);
+        r = sd_netlink_message_read_string(message, IFLA_IFNAME, &name);
+        if (r < 0) {
+                log_warning_errno(r, "rtnl: Received link message without ifname, ignoring: %m");
                 return 0;
         }
 
-        link_lldp_save(link);
-
-        admin_state = link_state_to_string(link->state);
-        assert(admin_state);
-
-        oper_state = link_operstate_to_string(link->operstate);
-        assert(oper_state);
-
-        carrier_state = link_carrier_state_to_string(link->carrier_state);
-        assert(carrier_state);
-
-        address_state = link_address_state_to_string(link->address_state);
-        assert(address_state);
-
-        r = fopen_temporary(link->state_file, &f, &temp_path);
-        if (r < 0)
-                goto fail;
+        (void) link_get(m, ifindex, &link);
+        (void) netdev_get(m, name, &netdev);
 
-        (void) fchmod(fileno(f), 0644);
-
-        fprintf(f,
-                "# This is private data. Do not parse.\n"
-                "ADMIN_STATE=%s\n"
-                "OPER_STATE=%s\n"
-                "CARRIER_STATE=%s\n"
-                "ADDRESS_STATE=%s\n",
-                admin_state, oper_state, carrier_state, address_state);
-
-        if (link->network) {
-                char **dhcp6_domains = NULL, **dhcp_domains = NULL;
-                const char *dhcp_domainname = NULL, *p;
-                bool space;
-
-                fprintf(f, "REQUIRED_FOR_ONLINE=%s\n",
-                        yes_no(link->network->required_for_online));
-
-                LinkOperationalStateRange st = link->network->required_operstate_for_online;
-                fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s%s%s\n",
-                        strempty(link_operstate_to_string(st.min)),
-                        st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "",
-                        st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : "");
-
-                fprintf(f, "ACTIVATION_POLICY=%s\n",
-                        activation_policy_to_string(link->network->activation_policy));
-
-                fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
-
-                /************************************************************/
-
-                fputs("DNS=", f);
-                space = false;
-                if (link->n_dns != (unsigned) -1)
-                        link_save_dns(link, f, link->dns, link->n_dns, &space);
-                else
-                        link_save_dns(link, f, link->network->dns, link->network->n_dns, &space);
-
-                serialize_addresses(f, NULL, &space,
-                                    NULL,
-                                    link->dhcp_lease,
-                                    link->network->dhcp_use_dns,
-                                    SD_DHCP_LEASE_DNS,
-                                    link->dhcp6_lease,
-                                    link->network->dhcp6_use_dns,
-                                    sd_dhcp6_lease_get_dns,
-                                    NULL);
-
-                /* Make sure to flush out old entries before we use the NDisc data */
-                ndisc_vacuum(link);
-
-                if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) {
-                        NDiscRDNSS *dd;
-
-                        SET_FOREACH(dd, link->ndisc_rdnss)
-                                serialize_in6_addrs(f, &dd->address, 1, &space);
-                }
-
-                fputc('\n', f);
-
-                /************************************************************/
-
-                serialize_addresses(f, "NTP", NULL,
-                                    link->ntp ?: link->network->ntp,
-                                    link->dhcp_lease,
-                                    link->network->dhcp_use_ntp,
-                                    SD_DHCP_LEASE_NTP,
-                                    link->dhcp6_lease,
-                                    link->network->dhcp6_use_ntp,
-                                    sd_dhcp6_lease_get_ntp_addrs,
-                                    sd_dhcp6_lease_get_ntp_fqdn);
-
-                serialize_addresses(f, "SIP", NULL,
-                                    NULL,
-                                    link->dhcp_lease,
-                                    link->network->dhcp_use_sip,
-                                    SD_DHCP_LEASE_SIP,
-                                    NULL, false, NULL, NULL);
-
-                /************************************************************/
-
-                if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
-                        if (link->dhcp_lease) {
-                                (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
-                                (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
+        switch (type) {
+        case RTM_NEWLINK:
+                if (!link) {
+                        /* link is new, so add it */
+                        r = link_add(m, message, &link);
+                        if (r < 0) {
+                                log_warning_errno(r, "Could not process new link message, ignoring: %m");
+                                return 0;
                         }
-                        if (link->dhcp6_lease)
-                                (void) sd_dhcp6_lease_get_domains(link->dhcp6_lease, &dhcp6_domains);
-                }
-
-                fputs("DOMAINS=", f);
-                space = false;
-                ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains)
-                        fputs_with_space(f, p, NULL, &space);
-
-                if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
-                        if (dhcp_domainname)
-                                fputs_with_space(f, dhcp_domainname, NULL, &space);
-                        if (dhcp_domains)
-                                fputstrv(f, dhcp_domains, NULL, &space);
-                        if (dhcp6_domains)
-                                fputstrv(f, dhcp6_domains, NULL, &space);
-                }
-
-                if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) {
-                        NDiscDNSSL *dd;
-
-                        SET_FOREACH(dd, link->ndisc_dnssl)
-                                fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
                 }
 
-                fputc('\n', f);
-
-                /************************************************************/
-
-                fputs("ROUTE_DOMAINS=", f);
-                space = false;
-                ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains)
-                        fputs_with_space(f, p, NULL, &space);
-
-                if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
-                        if (dhcp_domainname)
-                                fputs_with_space(f, dhcp_domainname, NULL, &space);
-                        if (dhcp_domains)
-                                fputstrv(f, dhcp_domains, NULL, &space);
-                        if (dhcp6_domains)
-                                fputstrv(f, dhcp6_domains, NULL, &space);
+                if (netdev) {
+                        /* netdev exists, so make sure the ifindex matches */
+                        r = netdev_set_ifindex(netdev, message);
+                        if (r < 0) {
+                                log_warning_errno(r, "Could not process new link message for netdev, ignoring: %m");
+                                return 0;
+                        }
                 }
 
-                if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) {
-                        NDiscDNSSL *dd;
-
-                        SET_FOREACH(dd, link->ndisc_dnssl)
-                                fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
+                r = link_update(link, message);
+                if (r < 0) {
+                        log_warning_errno(r, "Could not process link message, ignoring: %m");
+                        return 0;
                 }
 
-                fputc('\n', f);
-
-                /************************************************************/
-
-                fprintf(f, "LLMNR=%s\n",
-                        resolve_support_to_string(link->llmnr >= 0 ? link->llmnr : link->network->llmnr));
-
-                /************************************************************/
-
-                fprintf(f, "MDNS=%s\n",
-                        resolve_support_to_string(link->mdns >= 0 ? link->mdns : link->network->mdns));
-
-                /************************************************************/
-
-                int dns_default_route =
-                        link->dns_default_route >= 0 ? link->dns_default_route :
-                        link->network->dns_default_route;
-                if (dns_default_route >= 0)
-                        fprintf(f, "DNS_DEFAULT_ROUTE=%s\n", yes_no(dns_default_route));
-
-                /************************************************************/
-
-                DnsOverTlsMode dns_over_tls_mode =
-                        link->dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID ? link->dns_over_tls_mode :
-                        link->network->dns_over_tls_mode;
-                if (dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID)
-                        fprintf(f, "DNS_OVER_TLS=%s\n", dns_over_tls_mode_to_string(dns_over_tls_mode));
-
-                /************************************************************/
-
-                DnssecMode dnssec_mode =
-                        link->dnssec_mode != _DNSSEC_MODE_INVALID ? link->dnssec_mode :
-                        link->network->dnssec_mode;
-                if (dnssec_mode != _DNSSEC_MODE_INVALID)
-                        fprintf(f, "DNSSEC=%s\n", dnssec_mode_to_string(dnssec_mode));
-
-                /************************************************************/
+                break;
 
-                Set *nta_anchors = link->dnssec_negative_trust_anchors;
-                if (set_isempty(nta_anchors))
-                        nta_anchors = link->network->dnssec_negative_trust_anchors;
+        case RTM_DELLINK:
+                link_drop(link);
+                netdev_drop(netdev);
 
-                if (!set_isempty(nta_anchors)) {
-                        const char *n;
+                break;
 
-                        fputs("DNSSEC_NTA=", f);
-                        space = false;
-                        SET_FOREACH(n, nta_anchors)
-                                fputs_with_space(f, n, NULL, &space);
-                        fputc('\n', f);
-                }
+        default:
+                assert_not_reached("Received link message with invalid RTNL message type.");
         }
 
-        print_link_hashmap(f, "CARRIER_BOUND_TO=", link->bound_to_links);
-        print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
-
-        if (link->dhcp_lease) {
-                r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
-                if (r < 0)
-                        goto fail;
-
-                fprintf(f,
-                        "DHCP_LEASE=%s\n",
-                        link->lease_file);
-        } else
-                (void) unlink(link->lease_file);
-
-        r = link_serialize_dhcp6_client(link, f);
-        if (r < 0)
-                goto fail;
-
-        r = fflush_and_check(f);
-        if (r < 0)
-                goto fail;
-
-        r = conservative_rename(temp_path, link->state_file);
-        if (r < 0)
-                goto fail;
-
-        return 0;
-
-fail:
-        (void) unlink(link->state_file);
-        if (temp_path)
-                (void) unlink(temp_path);
-
-        return log_link_error_errno(link, r, "Failed to save link data to %s: %m", link->state_file);
-}
-
-/* The serialized state in /run is no longer up-to-date. */
-void link_dirty(Link *link) {
-        int r;
-
-        assert(link);
-
-        /* mark manager dirty as link is dirty */
-        manager_dirty(link->manager);
-
-        r = set_ensure_put(&link->manager->dirty_links, NULL, link);
-        if (r <= 0)
-                /* Ignore allocation errors and don't take another ref if the link was already dirty */
-                return;
-        link_ref(link);
-}
-
-/* The serialized state in /run is up-to-date */
-void link_clean(Link *link) {
-        assert(link);
-        assert(link->manager);
-
-        link_unref(set_remove(link->manager->dirty_links, link));
-}
-
-int link_save_and_clean(Link *link) {
-        int r;
-
-        r = link_save(link);
-        if (r < 0)
-                return r;
-
-        link_clean(link);
-        return 0;
+        return 1;
 }
 
 static const char* const link_state_table[_LINK_STATE_MAX] = {
index 8129fd2554cdf604b1222b28e055c6d7a2e6307b..d3353a1c4f20ccd928c11566de7d96d0eb55dd64 100644 (file)
@@ -203,24 +203,15 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
 DEFINE_TRIVIAL_DESTRUCTOR(link_netlink_destroy_callback, Link, link_unref);
 
 int link_get(Manager *m, int ifindex, Link **ret);
-int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
-void link_drop(Link *link);
 
 int link_down(Link *link, link_netlink_message_handler_t callback);
 
 void link_enter_failed(Link *link);
-int link_initialized(Link *link, sd_device *device);
 
 void link_set_state(Link *link, LinkState state);
 void link_check_ready(Link *link);
 
 void link_update_operstate(Link *link, bool also_update_bond_master);
-int link_update(Link *link, sd_netlink_message *message);
-
-void link_dirty(Link *link);
-void link_clean(Link *link);
-int link_save(Link *link);
-int link_save_and_clean(Link *link);
 
 int link_carrier_reset(Link *link);
 bool link_has_carrier(Link *link);
@@ -241,6 +232,9 @@ LinkState link_state_from_string(const char *s) _pure_;
 int link_configure(Link *link);
 int link_reconfigure(Link *link, bool force);
 
+int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata);
+int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);
+
 int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg);
 #define log_link_message_error_errno(link, m, err, msg)   log_link_message_full_errno(link, m, LOG_ERR, err, msg)
 #define log_link_message_warning_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_WARNING, err, msg)
index 76ff3689e17246c2ef70606e0363b48129e5b8f5..bf1dd045b870a4622737a8abd66d1c3197987d87 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "fd-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "networkd-link.h"
 #include "networkd-lldp-rx.h"
 #include "networkd-lldp-tx.h"
@@ -134,7 +135,7 @@ int link_update_lldp(Link *link) {
 }
 
 int link_lldp_save(Link *link) {
-        _cleanup_free_ char *temp_path = NULL;
+        _cleanup_(unlink_and_freep) char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
         sd_lldp_neighbor **l = NULL;
         int n = 0, r, i;
@@ -149,10 +150,10 @@ int link_lldp_save(Link *link) {
 
         r = sd_lldp_get_neighbors(link->lldp, &l);
         if (r < 0)
-                goto finish;
+                return r;
         if (r == 0) {
                 (void) unlink(link->lldp_file);
-                goto finish;
+                return 0;
         }
 
         n = r;
@@ -181,19 +182,13 @@ int link_lldp_save(Link *link) {
         if (r < 0)
                 goto finish;
 
-        if (rename(temp_path, link->lldp_file) < 0) {
-                r = -errno;
+        r = conservative_rename(temp_path, link->lldp_file);
+        if (r < 0)
                 goto finish;
-        }
 
 finish:
-        if (r < 0) {
-                (void) unlink(link->lldp_file);
-                if (temp_path)
-                        (void) unlink(temp_path);
-
+        if (r < 0)
                 log_link_error_errno(link, r, "Failed to save LLDP data to %s: %m", link->lldp_file);
-        }
 
         if (l) {
                 for (i = 0; i < n; i++)
index 08da9120ad32592f2285a3ac8232cf37d82f424a..bfdb1f8c96643574015257448cbcbb1ea7a453dd 100644 (file)
@@ -17,8 +17,6 @@
 #include "bus-util.h"
 #include "conf-parser.h"
 #include "def.h"
-#include "device-private.h"
-#include "device-util.h"
 #include "dns-domain.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -38,6 +36,7 @@
 #include "networkd-nexthop.h"
 #include "networkd-routing-policy-rule.h"
 #include "networkd-speed-meter.h"
+#include "networkd-state-file.h"
 #include "ordered-set.h"
 #include "path-lookup.h"
 #include "path-util.h"
@@ -48,7 +47,6 @@
 #include "strv.h"
 #include "sysctl-util.h"
 #include "tmpfile-util.h"
-#include "udev-util.h"
 
 /* use 128 MB for receive socket kernel queue. */
 #define RCVBUF_SIZE    (128*1024*1024)
@@ -181,57 +179,6 @@ int manager_connect_bus(Manager *m) {
         return 0;
 }
 
-static int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata) {
-        sd_device_action_t action;
-        Manager *m = userdata;
-        Link *link = NULL;
-        int r, ifindex;
-
-        assert(m);
-        assert(device);
-
-        r = sd_device_get_action(device, &action);
-        if (r < 0) {
-                log_device_debug_errno(device, r, "Failed to get udev action, ignoring device: %m");
-                return 0;
-        }
-
-        /* Ignore the "remove" uevent — let's remove a device only if rtnetlink says so. All other uevents
-         * are "positive" events in some form, i.e. inform us about a changed or new network interface, that
-         * still exists — and we are interested in that. */
-        if (action == SD_DEVICE_REMOVE)
-                return 0;
-
-        r = sd_device_get_ifindex(device, &ifindex);
-        if (r < 0) {
-                log_device_debug_errno(device, r, "Ignoring udev %s event for device without ifindex or with invalid ifindex: %m",
-                                       device_action_to_string(action));
-                return 0;
-        }
-
-        r = device_is_renaming(device);
-        if (r < 0) {
-                log_device_error_errno(device, r, "Failed to determine the device is renamed or not, ignoring '%s' uevent: %m",
-                                       device_action_to_string(action));
-                return 0;
-        }
-        if (r > 0) {
-                log_device_debug(device, "Interface is under renaming, wait for the interface to be renamed.");
-                return 0;
-        }
-
-        r = link_get(m, ifindex, &link);
-        if (r < 0) {
-                if (r != -ENODEV)
-                        log_debug_errno(r, "Failed to get link from ifindex %i, ignoring: %m", ifindex);
-                return 0;
-        }
-
-        (void) link_initialized(link, device);
-
-        return 0;
-}
-
 static int manager_connect_udev(Manager *m) {
         int r;
 
@@ -263,93 +210,6 @@ static int manager_connect_udev(Manager *m) {
         return 0;
 }
 
-static int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
-        Link *link = NULL;
-        NetDev *netdev = NULL;
-        uint16_t type;
-        const char *name;
-        int r, ifindex;
-
-        assert(rtnl);
-        assert(message);
-        assert(m);
-
-        if (sd_netlink_message_is_error(message)) {
-                r = sd_netlink_message_get_errno(message);
-                if (r < 0)
-                        log_message_warning_errno(message, r, "rtnl: Could not receive link message, ignoring");
-
-                return 0;
-        }
-
-        r = sd_netlink_message_get_type(message, &type);
-        if (r < 0) {
-                log_warning_errno(r, "rtnl: Could not get message type, ignoring: %m");
-                return 0;
-        } else if (!IN_SET(type, RTM_NEWLINK, RTM_DELLINK)) {
-                log_warning("rtnl: Received unexpected message type %u when processing link, ignoring.", type);
-                return 0;
-        }
-
-        r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
-        if (r < 0) {
-                log_warning_errno(r, "rtnl: Could not get ifindex from link message, ignoring: %m");
-                return 0;
-        } else if (ifindex <= 0) {
-                log_warning("rtnl: received link message with invalid ifindex %d, ignoring.", ifindex);
-                return 0;
-        }
-
-        r = sd_netlink_message_read_string(message, IFLA_IFNAME, &name);
-        if (r < 0) {
-                log_warning_errno(r, "rtnl: Received link message without ifname, ignoring: %m");
-                return 0;
-        }
-
-        (void) link_get(m, ifindex, &link);
-        (void) netdev_get(m, name, &netdev);
-
-        switch (type) {
-        case RTM_NEWLINK:
-                if (!link) {
-                        /* link is new, so add it */
-                        r = link_add(m, message, &link);
-                        if (r < 0) {
-                                log_warning_errno(r, "Could not process new link message, ignoring: %m");
-                                return 0;
-                        }
-                }
-
-                if (netdev) {
-                        /* netdev exists, so make sure the ifindex matches */
-                        r = netdev_set_ifindex(netdev, message);
-                        if (r < 0) {
-                                log_warning_errno(r, "Could not process new link message for netdev, ignoring: %m");
-                                return 0;
-                        }
-                }
-
-                r = link_update(link, message);
-                if (r < 0) {
-                        log_warning_errno(r, "Could not process link message, ignoring: %m");
-                        return 0;
-                }
-
-                break;
-
-        case RTM_DELLINK:
-                link_drop(link);
-                netdev_drop(netdev);
-
-                break;
-
-        default:
-                assert_not_reached("Received link message with invalid RTNL message type.");
-        }
-
-        return 1;
-}
-
 static int systemd_netlink_fd(void) {
         int n, fd, rtnl_fd = -EINVAL;
 
@@ -357,14 +217,13 @@ static int systemd_netlink_fd(void) {
         if (n <= 0)
                 return -EINVAL;
 
-        for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
+        for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
                 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
                         if (rtnl_fd >= 0)
                                 return -EINVAL;
 
                         rtnl_fd = fd;
                 }
-        }
 
         return rtnl_fd;
 }
@@ -466,301 +325,25 @@ static int manager_connect_rtnl(Manager *m) {
         return 0;
 }
 
-static int ordered_set_put_dns_server(OrderedSet *s, int ifindex, struct in_addr_full *dns) {
-        const char *p;
-        int r;
-
-        assert(s);
-        assert(dns);
-
-        if (dns->ifindex != 0 && dns->ifindex != ifindex)
-                return 0;
-
-        p = in_addr_full_to_string(dns);
-        if (!p)
-                return 0;
-
-        r = ordered_set_put_strdup(s, p);
-        if (r == -EEXIST)
-                return 0;
-
-        return r;
-}
-
-static int ordered_set_put_dns_servers(OrderedSet *s, int ifindex, struct in_addr_full **dns, unsigned n) {
-        int r, c = 0;
-
-        assert(s);
-        assert(dns || n == 0);
-
-        for (unsigned i = 0; i < n; i++) {
-                r = ordered_set_put_dns_server(s, ifindex, dns[i]);
-                if (r < 0)
-                        return r;
-
-                c += r;
-        }
-
-        return c;
-}
-
-static int ordered_set_put_in4_addr(OrderedSet *s, const struct in_addr *address) {
-        char *p;
-        int r;
-
-        assert(s);
-        assert(address);
-
-        r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
-        if (r < 0)
-                return r;
-
-        r = ordered_set_consume(s, p);
-        if (r == -EEXIST)
-                return 0;
-
-        return r;
-}
-
-static int ordered_set_put_in4_addrv(OrderedSet *s,
-                                     const struct in_addr *addresses,
-                                     size_t n,
-                                     bool (*predicate)(const struct in_addr *addr)) {
-        int r, c = 0;
-
-        assert(s);
-        assert(n == 0 || addresses);
-
-        for (size_t i = 0; i < n; i++) {
-                if (predicate && !predicate(&addresses[i]))
-                        continue;
-                r = ordered_set_put_in4_addr(s, addresses+i);
-                if (r < 0)
-                        return r;
-
-                c += r;
-        }
-
-        return c;
-}
-
-static int manager_save(Manager *m) {
-        _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *search_domains = NULL, *route_domains = NULL;
-        const char *operstate_str, *carrier_state_str, *address_state_str;
-        LinkOperationalState operstate = LINK_OPERSTATE_OFF;
-        LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
-        LinkAddressState address_state = LINK_ADDRESS_STATE_OFF;
-        _cleanup_free_ char *temp_path = NULL;
-        _cleanup_strv_free_ char **p = NULL;
-        _cleanup_fclose_ FILE *f = NULL;
+static int manager_dirty_handler(sd_event_source *s, void *userdata) {
+        Manager *m = userdata;
         Link *link;
         int r;
 
         assert(m);
-        assert(m->state_file);
-
-        /* We add all NTP and DNS server to a set, to filter out duplicates */
-        dns = ordered_set_new(&string_hash_ops);
-        if (!dns)
-                return -ENOMEM;
-
-        ntp = ordered_set_new(&string_hash_ops);
-        if (!ntp)
-                return -ENOMEM;
 
-        sip = ordered_set_new(&string_hash_ops);
-        if (!sip)
-                return -ENOMEM;
-
-        search_domains = ordered_set_new(&dns_name_hash_ops);
-        if (!search_domains)
-                return -ENOMEM;
-
-        route_domains = ordered_set_new(&dns_name_hash_ops);
-        if (!route_domains)
-                return -ENOMEM;
-
-        HASHMAP_FOREACH(link, m->links) {
-                const struct in_addr *addresses;
-
-                if (link->flags & IFF_LOOPBACK)
-                        continue;
-
-                if (link->operstate > operstate)
-                        operstate = link->operstate;
-
-                if (link->carrier_state > carrier_state)
-                        carrier_state = link->carrier_state;
-
-                if (link->address_state > address_state)
-                        address_state = link->address_state;
-
-                if (!link->network)
-                        continue;
-
-                /* First add the static configured entries */
-                if (link->n_dns != (unsigned) -1)
-                        r = ordered_set_put_dns_servers(dns, link->ifindex, link->dns, link->n_dns);
-                else
-                        r = ordered_set_put_dns_servers(dns, link->ifindex, link->network->dns, link->network->n_dns);
+        if (m->dirty) {
+                r = manager_save(m);
                 if (r < 0)
-                        return r;
-
-                r = ordered_set_put_strdupv(ntp, link->ntp ?: link->network->ntp);
-                if (r < 0)
-                        return r;
-
-                r = ordered_set_put_string_set(search_domains, link->search_domains ?: link->network->search_domains);
-                if (r < 0)
-                        return r;
-
-                r = ordered_set_put_string_set(route_domains, link->route_domains ?: link->network->route_domains);
-                if (r < 0)
-                        return r;
-
-                if (!link->dhcp_lease)
-                        continue;
-
-                /* Secondly, add the entries acquired via DHCP */
-                if (link->network->dhcp_use_dns) {
-                        r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
-                        if (r > 0) {
-                                r = ordered_set_put_in4_addrv(dns, addresses, r, in4_addr_is_non_local);
-                                if (r < 0)
-                                        return r;
-                        } else if (r < 0 && r != -ENODATA)
-                                return r;
-                }
-
-                if (link->network->dhcp_use_ntp) {
-                        r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
-                        if (r > 0) {
-                                r = ordered_set_put_in4_addrv(ntp, addresses, r, in4_addr_is_non_local);
-                                if (r < 0)
-                                        return r;
-                        } else if (r < 0 && r != -ENODATA)
-                                return r;
-                }
-
-                if (link->network->dhcp_use_sip) {
-                        r = sd_dhcp_lease_get_sip(link->dhcp_lease, &addresses);
-                        if (r > 0) {
-                                r = ordered_set_put_in4_addrv(sip, addresses, r, in4_addr_is_non_local);
-                                if (r < 0)
-                                        return r;
-                        } else if (r < 0 && r != -ENODATA)
-                                return r;
-                }
-
-                if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
-                        const char *domainname;
-                        char **domains = NULL;
-
-                        OrderedSet *target_domains = (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) ? search_domains : route_domains;
-                        r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
-                        if (r >= 0) {
-                                r = ordered_set_put_strdup(target_domains, domainname);
-                                if (r < 0)
-                                        return r;
-                        } else if (r != -ENODATA)
-                                return r;
-
-                        r = sd_dhcp_lease_get_search_domains(link->dhcp_lease, &domains);
-                        if (r >= 0) {
-                                r = ordered_set_put_strdupv(target_domains, domains);
-                                if (r < 0)
-                                        return r;
-                        } else if (r != -ENODATA)
-                                return r;
-                }
-        }
-
-        if (carrier_state >= LINK_CARRIER_STATE_ENSLAVED)
-                carrier_state = LINK_CARRIER_STATE_CARRIER;
-
-        operstate_str = link_operstate_to_string(operstate);
-        assert(operstate_str);
-
-        carrier_state_str = link_carrier_state_to_string(carrier_state);
-        assert(carrier_state_str);
-
-        address_state_str = link_address_state_to_string(address_state);
-        assert(address_state_str);
-
-        r = fopen_temporary(m->state_file, &f, &temp_path);
-        if (r < 0)
-                return r;
-
-        (void) fchmod(fileno(f), 0644);
-
-        fprintf(f,
-                "# This is private data. Do not parse.\n"
-                "OPER_STATE=%s\n"
-                "CARRIER_STATE=%s\n"
-                "ADDRESS_STATE=%s\n",
-                operstate_str, carrier_state_str, address_state_str);
-
-        ordered_set_print(f, "DNS=", dns);
-        ordered_set_print(f, "NTP=", ntp);
-        ordered_set_print(f, "SIP=", sip);
-        ordered_set_print(f, "DOMAINS=", search_domains);
-        ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
-
-        r = fflush_and_check(f);
-        if (r < 0)
-                goto fail;
-
-        r = conservative_rename(temp_path, m->state_file);
-        if (r < 0)
-                goto fail;
-
-        if (m->operational_state != operstate) {
-                m->operational_state = operstate;
-                if (strv_extend(&p, "OperationalState") < 0)
-                        log_oom();
+                        log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file);
         }
 
-        if (m->carrier_state != carrier_state) {
-                m->carrier_state = carrier_state;
-                if (strv_extend(&p, "CarrierState") < 0)
-                        log_oom();
-        }
-
-        if (m->address_state != address_state) {
-                m->address_state = address_state;
-                if (strv_extend(&p, "AddressState") < 0)
-                        log_oom();
-        }
-
-        if (p) {
-                r = manager_send_changed_strv(m, p);
+        SET_FOREACH(link, m->dirty_links) {
+                r = link_save_and_clean(link);
                 if (r < 0)
-                        log_error_errno(r, "Could not emit changed properties: %m");
+                        log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file);
         }
 
-        m->dirty = false;
-
-        return 0;
-
-fail:
-        (void) unlink(m->state_file);
-        (void) unlink(temp_path);
-
-        return log_error_errno(r, "Failed to save network state to %s: %m", m->state_file);
-}
-
-static int manager_dirty_handler(sd_event_source *s, void *userdata) {
-        Manager *m = userdata;
-        Link *link;
-
-        assert(m);
-
-        if (m->dirty)
-                manager_save(m);
-
-        SET_FOREACH(link, m->dirty_links)
-                (void) link_save_and_clean(link);
-
         return 1;
 }
 
@@ -929,10 +512,15 @@ int manager_start(Manager *m) {
         /* The dirty handler will deal with future serialization, but the first one
            must be done explicitly. */
 
-        manager_save(m);
+        r = manager_save(m);
+        if (r < 0)
+                log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file);
 
-        HASHMAP_FOREACH(link, m->links)
-                (void) link_save(link);
+        HASHMAP_FOREACH(link, m->links) {
+                r = link_save(link);
+                if (r < 0)
+                        log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file);
+        }
 
         return 0;
 }
@@ -1155,13 +743,6 @@ Link* manager_find_uplink(Manager *m, Link *exclude) {
         return NULL;
 }
 
-void manager_dirty(Manager *manager) {
-        assert(manager);
-
-        /* the serialized state in /run is no longer up-to-date */
-        manager->dirty = true;
-}
-
 static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
         const sd_bus_error *e;
         int r;
index c0cd4275170d08a02352efe02987cb94bb43c017..929855daaf1bd2b1300fd0a9e6944d10981ae58a 100644 (file)
@@ -100,8 +100,6 @@ bool manager_should_reload(Manager *m);
 
 int manager_enumerate(Manager *m);
 
-void manager_dirty(Manager *m);
-
 Link* manager_find_uplink(Manager *m, Link *exclude);
 
 int manager_set_hostname(Manager *m, const char *hostname);
index acc1de66d2a2ea7e900eeb87ad076a17183d7317..035e80dab0e7ed9dee9a1118f5704c99da05a25a 100644 (file)
@@ -15,6 +15,7 @@
 #include "networkd-dhcp6.h"
 #include "networkd-manager.h"
 #include "networkd-ndisc.h"
+#include "networkd-state-file.h"
 #include "string-table.h"
 #include "string-util.h"
 #include "strv.h"
@@ -534,7 +535,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         route->pref = preference;
         route->gw_family = AF_INET6;
         route->gw = gateway;
-        route->lifetime = time_now + lifetime * USEC_PER_SEC;
+        route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
         route->mtu = mtu;
 
         r = ndisc_route_configure(route, link, rt);
@@ -558,7 +559,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
                         route_gw->protocol = RTPROT_RA;
                 if (!route_gw->pref_set)
                         route->pref = preference;
-                route_gw->lifetime = time_now + lifetime * USEC_PER_SEC;
+                route_gw->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
                 if (route_gw->mtu == 0)
                         route_gw->mtu = mtu;
 
@@ -817,7 +818,7 @@ static int ndisc_router_process_onlink_prefix(Link *link, sd_ndisc_router *rt) {
         route->protocol = RTPROT_RA;
         route->flags = RTM_F_PREFIX;
         route->dst_prefixlen = prefixlen;
-        route->lifetime = time_now + lifetime * USEC_PER_SEC;
+        route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
 
         r = sd_ndisc_router_prefix_get_address(rt, &route->dst.in6);
         if (r < 0)
@@ -905,7 +906,7 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
         route->gw_family = AF_INET6;
         route->dst = dst;
         route->dst_prefixlen = prefixlen;
-        route->lifetime = time_now + lifetime * USEC_PER_SEC;
+        route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
 
         r = ndisc_route_configure(route, link, rt);
         if (r < 0)
index 9865ebd2552a2ac5e738cfd1314eb2d9a211c31f..e5ffd35b6f9ab4b6a785678acec3622d60357ddd 100644 (file)
@@ -288,7 +288,6 @@ int network_verify(Network *network) {
 int network_load_one(Manager *manager, OrderedHashmap **networks, const char *filename) {
         _cleanup_free_ char *fname = NULL, *name = NULL;
         _cleanup_(network_unrefp) Network *network = NULL;
-        _cleanup_fclose_ FILE *file = NULL;
         const char *dropin_dirname;
         char *d;
         int r;
@@ -296,15 +295,12 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
         assert(manager);
         assert(filename);
 
-        file = fopen(filename, "re");
-        if (!file) {
-                if (errno == ENOENT)
-                        return 0;
-
-                return -errno;
-        }
-
-        if (null_or_empty_fd(fileno(file))) {
+        r = null_or_empty_path(filename);
+        if (r == -ENOENT)
+                return 0;
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 log_debug("Skipping empty file: %s", filename);
                 return 0;
         }
index d86de6799e04a6987ede03bfe666d985a0407dfc..7a76b61c4aefec0384bb1b92500564b0717eb4df 100644 (file)
@@ -17,7 +17,7 @@ static int sr_iov_new(SRIOV **ret) {
                 return -ENOMEM;
 
         *sr_iov = (SRIOV) {
-                  .vf = (uint32_t) -1,
+                  .vf = UINT32_MAX,
                   .vlan_proto = ETH_P_8021Q,
                   .vf_spoof_check_setting = -1,
                   .trust = -1,
@@ -256,7 +256,7 @@ static int sr_iov_section_verify(SRIOV *sr_iov) {
         if (section_is_invalid(sr_iov->section))
                 return -EINVAL;
 
-        if (sr_iov->vf == (uint32_t) -1)
+        if (sr_iov->vf == UINT32_MAX)
                 return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
                                          "%s: [SRIOV] section without VirtualFunction= field configured. "
                                          "Ignoring [SRIOV] section from line %u.",
@@ -303,7 +303,7 @@ int config_parse_sr_iov_uint32(
 
         if (isempty(rvalue)) {
                 if (streq(lvalue, "VirtualFunction"))
-                        sr_iov->vf = (uint32_t) -1;
+                        sr_iov->vf = UINT32_MAX;
                 else if (streq(lvalue, "VLANId"))
                         sr_iov->vlan = 0;
                 else if (streq(lvalue, "QualityOfService"))
diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c
new file mode 100644 (file)
index 0000000..9c5c504
--- /dev/null
@@ -0,0 +1,682 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <netinet/in.h>
+#include <linux/if.h>
+
+#include "alloc-util.h"
+#include "dns-domain.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
+#include "network-internal.h"
+#include "networkd-link.h"
+#include "networkd-manager-bus.h"
+#include "networkd-manager.h"
+#include "networkd-network.h"
+#include "networkd-state-file.h"
+#include "ordered-set.h"
+#include "set.h"
+#include "strv.h"
+#include "tmpfile-util.h"
+
+static int ordered_set_put_dns_server(OrderedSet *s, int ifindex, struct in_addr_full *dns) {
+        const char *p;
+        int r;
+
+        assert(s);
+        assert(dns);
+
+        if (dns->ifindex != 0 && dns->ifindex != ifindex)
+                return 0;
+
+        p = in_addr_full_to_string(dns);
+        if (!p)
+                return 0;
+
+        r = ordered_set_put_strdup(s, p);
+        if (r == -EEXIST)
+                return 0;
+
+        return r;
+}
+
+static int ordered_set_put_dns_servers(OrderedSet *s, int ifindex, struct in_addr_full **dns, unsigned n) {
+        int r, c = 0;
+
+        assert(s);
+        assert(dns || n == 0);
+
+        for (unsigned i = 0; i < n; i++) {
+                r = ordered_set_put_dns_server(s, ifindex, dns[i]);
+                if (r < 0)
+                        return r;
+
+                c += r;
+        }
+
+        return c;
+}
+
+static int ordered_set_put_in4_addr(OrderedSet *s, const struct in_addr *address) {
+        char *p;
+        int r;
+
+        assert(s);
+        assert(address);
+
+        r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
+        if (r < 0)
+                return r;
+
+        r = ordered_set_consume(s, p);
+        if (r == -EEXIST)
+                return 0;
+
+        return r;
+}
+
+static int ordered_set_put_in4_addrv(
+                OrderedSet *s,
+                const struct in_addr *addresses,
+                size_t n,
+                bool (*predicate)(const struct in_addr *addr)) {
+
+        int r, c = 0;
+
+        assert(s);
+        assert(n == 0 || addresses);
+
+        for (size_t i = 0; i < n; i++) {
+                if (predicate && !predicate(&addresses[i]))
+                        continue;
+                r = ordered_set_put_in4_addr(s, addresses+i);
+                if (r < 0)
+                        return r;
+
+                c += r;
+        }
+
+        return c;
+}
+
+int manager_save(Manager *m) {
+        _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *search_domains = NULL, *route_domains = NULL;
+        const char *operstate_str, *carrier_state_str, *address_state_str;
+        LinkOperationalState operstate = LINK_OPERSTATE_OFF;
+        LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
+        LinkAddressState address_state = LINK_ADDRESS_STATE_OFF;
+        _cleanup_(unlink_and_freep) char *temp_path = NULL;
+        _cleanup_strv_free_ char **p = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        Link *link;
+        int r;
+
+        assert(m);
+        assert(m->state_file);
+
+        /* We add all NTP and DNS server to a set, to filter out duplicates */
+        dns = ordered_set_new(&string_hash_ops);
+        if (!dns)
+                return -ENOMEM;
+
+        ntp = ordered_set_new(&string_hash_ops);
+        if (!ntp)
+                return -ENOMEM;
+
+        sip = ordered_set_new(&string_hash_ops);
+        if (!sip)
+                return -ENOMEM;
+
+        search_domains = ordered_set_new(&dns_name_hash_ops);
+        if (!search_domains)
+                return -ENOMEM;
+
+        route_domains = ordered_set_new(&dns_name_hash_ops);
+        if (!route_domains)
+                return -ENOMEM;
+
+        HASHMAP_FOREACH(link, m->links) {
+                const struct in_addr *addresses;
+
+                if (link->flags & IFF_LOOPBACK)
+                        continue;
+
+                if (link->operstate > operstate)
+                        operstate = link->operstate;
+
+                if (link->carrier_state > carrier_state)
+                        carrier_state = link->carrier_state;
+
+                if (link->address_state > address_state)
+                        address_state = link->address_state;
+
+                if (!link->network)
+                        continue;
+
+                /* First add the static configured entries */
+                if (link->n_dns != UINT_MAX)
+                        r = ordered_set_put_dns_servers(dns, link->ifindex, link->dns, link->n_dns);
+                else
+                        r = ordered_set_put_dns_servers(dns, link->ifindex, link->network->dns, link->network->n_dns);
+                if (r < 0)
+                        return r;
+
+                r = ordered_set_put_strdupv(ntp, link->ntp ?: link->network->ntp);
+                if (r < 0)
+                        return r;
+
+                r = ordered_set_put_string_set(search_domains, link->search_domains ?: link->network->search_domains);
+                if (r < 0)
+                        return r;
+
+                r = ordered_set_put_string_set(route_domains, link->route_domains ?: link->network->route_domains);
+                if (r < 0)
+                        return r;
+
+                if (!link->dhcp_lease)
+                        continue;
+
+                /* Secondly, add the entries acquired via DHCP */
+                if (link->network->dhcp_use_dns) {
+                        r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
+                        if (r > 0) {
+                                r = ordered_set_put_in4_addrv(dns, addresses, r, in4_addr_is_non_local);
+                                if (r < 0)
+                                        return r;
+                        } else if (r < 0 && r != -ENODATA)
+                                return r;
+                }
+
+                if (link->network->dhcp_use_ntp) {
+                        r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
+                        if (r > 0) {
+                                r = ordered_set_put_in4_addrv(ntp, addresses, r, in4_addr_is_non_local);
+                                if (r < 0)
+                                        return r;
+                        } else if (r < 0 && r != -ENODATA)
+                                return r;
+                }
+
+                if (link->network->dhcp_use_sip) {
+                        r = sd_dhcp_lease_get_sip(link->dhcp_lease, &addresses);
+                        if (r > 0) {
+                                r = ordered_set_put_in4_addrv(sip, addresses, r, in4_addr_is_non_local);
+                                if (r < 0)
+                                        return r;
+                        } else if (r < 0 && r != -ENODATA)
+                                return r;
+                }
+
+                if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
+                        const char *domainname;
+                        char **domains = NULL;
+
+                        OrderedSet *target_domains = (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) ? search_domains : route_domains;
+                        r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
+                        if (r >= 0) {
+                                r = ordered_set_put_strdup(target_domains, domainname);
+                                if (r < 0)
+                                        return r;
+                        } else if (r != -ENODATA)
+                                return r;
+
+                        r = sd_dhcp_lease_get_search_domains(link->dhcp_lease, &domains);
+                        if (r >= 0) {
+                                r = ordered_set_put_strdupv(target_domains, domains);
+                                if (r < 0)
+                                        return r;
+                        } else if (r != -ENODATA)
+                                return r;
+                }
+        }
+
+        if (carrier_state >= LINK_CARRIER_STATE_ENSLAVED)
+                carrier_state = LINK_CARRIER_STATE_CARRIER;
+
+        operstate_str = link_operstate_to_string(operstate);
+        assert(operstate_str);
+
+        carrier_state_str = link_carrier_state_to_string(carrier_state);
+        assert(carrier_state_str);
+
+        address_state_str = link_address_state_to_string(address_state);
+        assert(address_state_str);
+
+        r = fopen_temporary(m->state_file, &f, &temp_path);
+        if (r < 0)
+                return r;
+
+        (void) fchmod(fileno(f), 0644);
+
+        fprintf(f,
+                "# This is private data. Do not parse.\n"
+                "OPER_STATE=%s\n"
+                "CARRIER_STATE=%s\n"
+                "ADDRESS_STATE=%s\n",
+                operstate_str, carrier_state_str, address_state_str);
+
+        ordered_set_print(f, "DNS=", dns);
+        ordered_set_print(f, "NTP=", ntp);
+        ordered_set_print(f, "SIP=", sip);
+        ordered_set_print(f, "DOMAINS=", search_domains);
+        ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
+
+        r = fflush_and_check(f);
+        if (r < 0)
+                return r;
+
+        r = conservative_rename(temp_path, m->state_file);
+        if (r < 0)
+                return r;
+
+        temp_path = mfree(temp_path);
+
+        if (m->operational_state != operstate) {
+                m->operational_state = operstate;
+                if (strv_extend(&p, "OperationalState") < 0)
+                        log_oom();
+        }
+
+        if (m->carrier_state != carrier_state) {
+                m->carrier_state = carrier_state;
+                if (strv_extend(&p, "CarrierState") < 0)
+                        log_oom();
+        }
+
+        if (m->address_state != address_state) {
+                m->address_state = address_state;
+                if (strv_extend(&p, "AddressState") < 0)
+                        log_oom();
+        }
+
+        if (p) {
+                r = manager_send_changed_strv(m, p);
+                if (r < 0)
+                        log_warning_errno(r, "Could not emit changed properties, ignoring: %m");
+        }
+
+        m->dirty = false;
+
+        return 0;
+}
+
+static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
+        bool space = false;
+        Link *link;
+
+        assert(f);
+        assert(prefix);
+
+        if (hashmap_isempty(h))
+                return;
+
+        fputs(prefix, f);
+        HASHMAP_FOREACH(link, h) {
+                if (space)
+                        fputc(' ', f);
+
+                fprintf(f, "%i", link->ifindex);
+                space = true;
+        }
+
+        fputc('\n', f);
+}
+
+static void link_save_dns(Link *link, FILE *f, struct in_addr_full **dns, unsigned n_dns, bool *space) {
+        for (unsigned j = 0; j < n_dns; j++) {
+                const char *str;
+
+                if (dns[j]->ifindex != 0 && dns[j]->ifindex != link->ifindex)
+                        continue;
+
+                str = in_addr_full_to_string(dns[j]);
+                if (!str)
+                        continue;
+
+                if (*space)
+                        fputc(' ', f);
+                fputs(str, f);
+                *space = true;
+        }
+}
+
+static void serialize_addresses(
+                FILE *f,
+                const char *lvalue,
+                bool *space,
+                char **addresses,
+                sd_dhcp_lease *lease,
+                bool conditional,
+                sd_dhcp_lease_server_type_t what,
+                sd_dhcp6_lease *lease6,
+                bool conditional6,
+                int (*lease6_get_addr)(sd_dhcp6_lease*, const struct in6_addr**),
+                int (*lease6_get_fqdn)(sd_dhcp6_lease*, char ***)) {
+
+        bool _space = false;
+        int r;
+
+        if (!space)
+                space = &_space;
+
+        if (lvalue)
+                fprintf(f, "%s=", lvalue);
+        fputstrv(f, addresses, NULL, space);
+
+        if (lease && conditional) {
+                const struct in_addr *lease_addresses;
+
+                r = sd_dhcp_lease_get_servers(lease, what, &lease_addresses);
+                if (r > 0)
+                        serialize_in_addrs(f, lease_addresses, r, space, in4_addr_is_non_local);
+        }
+
+        if (lease6 && conditional6 && lease6_get_addr) {
+                const struct in6_addr *in6_addrs;
+
+                r = lease6_get_addr(lease6, &in6_addrs);
+                if (r > 0)
+                        serialize_in6_addrs(f, in6_addrs, r, space);
+        }
+
+        if (lease6 && conditional6 && lease6_get_fqdn) {
+                char **in6_hosts;
+
+                r = lease6_get_fqdn(lease6, &in6_hosts);
+                if (r > 0)
+                        fputstrv(f, in6_hosts, NULL, space);
+        }
+
+        if (lvalue)
+                fputc('\n', f);
+}
+
+int link_save(Link *link) {
+        const char *admin_state, *oper_state, *carrier_state, *address_state;
+        _cleanup_(unlink_and_freep) char *temp_path = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        int r;
+
+        assert(link);
+        assert(link->state_file);
+        assert(link->lease_file);
+        assert(link->manager);
+
+        if (link->state == LINK_STATE_LINGER)
+                return 0;
+
+        link_lldp_save(link);
+
+        admin_state = link_state_to_string(link->state);
+        assert(admin_state);
+
+        oper_state = link_operstate_to_string(link->operstate);
+        assert(oper_state);
+
+        carrier_state = link_carrier_state_to_string(link->carrier_state);
+        assert(carrier_state);
+
+        address_state = link_address_state_to_string(link->address_state);
+        assert(address_state);
+
+        r = fopen_temporary(link->state_file, &f, &temp_path);
+        if (r < 0)
+                return r;
+
+        (void) fchmod(fileno(f), 0644);
+
+        fprintf(f,
+                "# This is private data. Do not parse.\n"
+                "ADMIN_STATE=%s\n"
+                "OPER_STATE=%s\n"
+                "CARRIER_STATE=%s\n"
+                "ADDRESS_STATE=%s\n",
+                admin_state, oper_state, carrier_state, address_state);
+
+        if (link->network) {
+                char **dhcp6_domains = NULL, **dhcp_domains = NULL;
+                const char *dhcp_domainname = NULL, *p;
+                bool space;
+
+                fprintf(f, "REQUIRED_FOR_ONLINE=%s\n",
+                        yes_no(link->network->required_for_online));
+
+                LinkOperationalStateRange st = link->network->required_operstate_for_online;
+                fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s%s%s\n",
+                        strempty(link_operstate_to_string(st.min)),
+                        st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "",
+                        st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : "");
+
+                fprintf(f, "ACTIVATION_POLICY=%s\n",
+                        activation_policy_to_string(link->network->activation_policy));
+
+                fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
+
+                /************************************************************/
+
+                fputs("DNS=", f);
+                space = false;
+                if (link->n_dns != UINT_MAX)
+                        link_save_dns(link, f, link->dns, link->n_dns, &space);
+                else
+                        link_save_dns(link, f, link->network->dns, link->network->n_dns, &space);
+
+                serialize_addresses(f, NULL, &space,
+                                    NULL,
+                                    link->dhcp_lease,
+                                    link->network->dhcp_use_dns,
+                                    SD_DHCP_LEASE_DNS,
+                                    link->dhcp6_lease,
+                                    link->network->dhcp6_use_dns,
+                                    sd_dhcp6_lease_get_dns,
+                                    NULL);
+
+                /* Make sure to flush out old entries before we use the NDisc data */
+                ndisc_vacuum(link);
+
+                if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) {
+                        NDiscRDNSS *dd;
+
+                        SET_FOREACH(dd, link->ndisc_rdnss)
+                                serialize_in6_addrs(f, &dd->address, 1, &space);
+                }
+
+                fputc('\n', f);
+
+                /************************************************************/
+
+                serialize_addresses(f, "NTP", NULL,
+                                    link->ntp ?: link->network->ntp,
+                                    link->dhcp_lease,
+                                    link->network->dhcp_use_ntp,
+                                    SD_DHCP_LEASE_NTP,
+                                    link->dhcp6_lease,
+                                    link->network->dhcp6_use_ntp,
+                                    sd_dhcp6_lease_get_ntp_addrs,
+                                    sd_dhcp6_lease_get_ntp_fqdn);
+
+                serialize_addresses(f, "SIP", NULL,
+                                    NULL,
+                                    link->dhcp_lease,
+                                    link->network->dhcp_use_sip,
+                                    SD_DHCP_LEASE_SIP,
+                                    NULL, false, NULL, NULL);
+
+                /************************************************************/
+
+                if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
+                        if (link->dhcp_lease) {
+                                (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
+                                (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
+                        }
+                        if (link->dhcp6_lease)
+                                (void) sd_dhcp6_lease_get_domains(link->dhcp6_lease, &dhcp6_domains);
+                }
+
+                fputs("DOMAINS=", f);
+                space = false;
+                ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains)
+                        fputs_with_space(f, p, NULL, &space);
+
+                if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
+                        if (dhcp_domainname)
+                                fputs_with_space(f, dhcp_domainname, NULL, &space);
+                        if (dhcp_domains)
+                                fputstrv(f, dhcp_domains, NULL, &space);
+                        if (dhcp6_domains)
+                                fputstrv(f, dhcp6_domains, NULL, &space);
+                }
+
+                if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) {
+                        NDiscDNSSL *dd;
+
+                        SET_FOREACH(dd, link->ndisc_dnssl)
+                                fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
+                }
+
+                fputc('\n', f);
+
+                /************************************************************/
+
+                fputs("ROUTE_DOMAINS=", f);
+                space = false;
+                ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains)
+                        fputs_with_space(f, p, NULL, &space);
+
+                if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
+                        if (dhcp_domainname)
+                                fputs_with_space(f, dhcp_domainname, NULL, &space);
+                        if (dhcp_domains)
+                                fputstrv(f, dhcp_domains, NULL, &space);
+                        if (dhcp6_domains)
+                                fputstrv(f, dhcp6_domains, NULL, &space);
+                }
+
+                if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) {
+                        NDiscDNSSL *dd;
+
+                        SET_FOREACH(dd, link->ndisc_dnssl)
+                                fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
+                }
+
+                fputc('\n', f);
+
+                /************************************************************/
+
+                fprintf(f, "LLMNR=%s\n",
+                        resolve_support_to_string(link->llmnr >= 0 ? link->llmnr : link->network->llmnr));
+
+                /************************************************************/
+
+                fprintf(f, "MDNS=%s\n",
+                        resolve_support_to_string(link->mdns >= 0 ? link->mdns : link->network->mdns));
+
+                /************************************************************/
+
+                int dns_default_route =
+                        link->dns_default_route >= 0 ? link->dns_default_route :
+                        link->network->dns_default_route;
+                if (dns_default_route >= 0)
+                        fprintf(f, "DNS_DEFAULT_ROUTE=%s\n", yes_no(dns_default_route));
+
+                /************************************************************/
+
+                DnsOverTlsMode dns_over_tls_mode =
+                        link->dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID ? link->dns_over_tls_mode :
+                        link->network->dns_over_tls_mode;
+                if (dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID)
+                        fprintf(f, "DNS_OVER_TLS=%s\n", dns_over_tls_mode_to_string(dns_over_tls_mode));
+
+                /************************************************************/
+
+                DnssecMode dnssec_mode =
+                        link->dnssec_mode != _DNSSEC_MODE_INVALID ? link->dnssec_mode :
+                        link->network->dnssec_mode;
+                if (dnssec_mode != _DNSSEC_MODE_INVALID)
+                        fprintf(f, "DNSSEC=%s\n", dnssec_mode_to_string(dnssec_mode));
+
+                /************************************************************/
+
+                Set *nta_anchors = link->dnssec_negative_trust_anchors;
+                if (set_isempty(nta_anchors))
+                        nta_anchors = link->network->dnssec_negative_trust_anchors;
+
+                if (!set_isempty(nta_anchors)) {
+                        const char *n;
+
+                        fputs("DNSSEC_NTA=", f);
+                        space = false;
+                        SET_FOREACH(n, nta_anchors)
+                                fputs_with_space(f, n, NULL, &space);
+                        fputc('\n', f);
+                }
+        }
+
+        print_link_hashmap(f, "CARRIER_BOUND_TO=", link->bound_to_links);
+        print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
+
+        if (link->dhcp_lease) {
+                r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
+                if (r < 0)
+                        return r;
+
+                fprintf(f,
+                        "DHCP_LEASE=%s\n",
+                        link->lease_file);
+        } else
+                (void) unlink(link->lease_file);
+
+        r = link_serialize_dhcp6_client(link, f);
+        if (r < 0)
+                return r;
+
+        r = fflush_and_check(f);
+        if (r < 0)
+                return r;
+
+        r = conservative_rename(temp_path, link->state_file);
+        if (r < 0)
+                return r;
+
+        temp_path = mfree(temp_path);
+
+        return 0;
+}
+
+void link_dirty(Link *link) {
+        int r;
+
+        assert(link);
+        assert(link->manager);
+
+        /* The serialized state in /run is no longer up-to-date. */
+
+        /* Also mark manager dirty as link is dirty */
+        link->manager->dirty = true;
+
+        r = set_ensure_put(&link->manager->dirty_links, NULL, link);
+        if (r <= 0)
+                /* Ignore allocation errors and don't take another ref if the link was already dirty */
+                return;
+        link_ref(link);
+}
+
+void link_clean(Link *link) {
+        assert(link);
+        assert(link->manager);
+
+        /* The serialized state in /run is up-to-date */
+
+        link_unref(set_remove(link->manager->dirty_links, link));
+}
+
+int link_save_and_clean(Link *link) {
+        int r;
+
+        r = link_save(link);
+        if (r < 0)
+                return r;
+
+        link_clean(link);
+        return 0;
+}
diff --git a/src/network/networkd-state-file.h b/src/network/networkd-state-file.h
new file mode 100644 (file)
index 0000000..44a109f
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+typedef struct Link Link;
+typedef struct Manager Manager;
+
+void link_dirty(Link *link);
+void link_clean(Link *link);
+int link_save(Link *link);
+int link_save_and_clean(Link *link);
+
+int manager_save(Manager *m);
index 24b3cb57af9a70c94825aa8f9dd075836e2aa11f..48f6061b1f2c109de0af7656bbcc5b17b076f648 100644 (file)
@@ -93,10 +93,6 @@ static int run(int argc, char *argv[]) {
         if (r < 0)
                 return r;
 
-        r = fw_ctx_new(&m->fw_ctx);
-        if (r < 0)
-                log_warning_errno(r, "Could not initialize firewall, IPMasquerade= option not available: %m");
-
         r = manager_start(m);
         if (r < 0)
                 return log_error_errno(r, "Could not start manager: %m");
index f6c8cf909fa3633e2a67729ec47bfab6551ca899..1438b27445c898ea3d8550dcfefc326322b2912b 100644 (file)
@@ -323,12 +323,8 @@ int manager_new(Manager **ret, Hashmap *interfaces, char **ignore,
         (void) sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
 
         if (timeout > 0) {
-                usec_t usec;
-
-                usec = now(clock_boottime_or_monotonic()) + timeout;
-
-                r = sd_event_add_time(m->event, NULL, clock_boottime_or_monotonic(), usec, 0, NULL, INT_TO_PTR(-ETIMEDOUT));
-                if (r < 0)
+                r = sd_event_add_time_relative(m->event, NULL, clock_boottime_or_monotonic(), timeout, 0, NULL, INT_TO_PTR(-ETIMEDOUT));
+                if (r < 0 && r != -EOVERFLOW)
                         return r;
         }
 
index 1309d8f4e07551e29b79f20dd408021711542882..40cbc296bd516d05f47743d9eb261eabced4da2d 100644 (file)
@@ -241,11 +241,11 @@ static int run(int argc, char* argv[]) {
            ucred data, and sd_pid_notify() uses the real UID for filling in ucred. */
 
         if (arg_gid != GID_INVALID &&
-            setregid(arg_gid, (gid_t) -1) < 0)
+            setregid(arg_gid, GID_INVALID) < 0)
                 return log_error_errno(errno, "Failed to change GID: %m");
 
         if (arg_uid != UID_INVALID &&
-            setreuid(arg_uid, (uid_t) -1) < 0)
+            setreuid(arg_uid, UID_INVALID) < 0)
                 return log_error_errno(errno, "Failed to change UID: %m");
 
         if (arg_pid > 0)
index 826981c3f78ae00a9110eb4f5ffa1b0311863137..1db69b45128414ebf1dfdd52ba4973cdc06bc232 100644 (file)
@@ -308,7 +308,7 @@ static int oci_capability_array(const char *name, JsonVariant *v, JsonDispatchFl
                 m |= UINT64_C(1) << cap;
         }
 
-        if (*mask == (uint64_t) -1)
+        if (*mask == UINT64_MAX)
                 *mask = m;
         else
                 *mask |= m;
@@ -336,7 +336,7 @@ static int oci_capabilities(const char *name, JsonVariant *v, JsonDispatchFlags
         if (r < 0)
                 return r;
 
-        if (s->full_capabilities.bounding != (uint64_t) -1) {
+        if (s->full_capabilities.bounding != UINT64_MAX) {
                 s->capability = s->full_capabilities.bounding;
                 s->drop_capability = ~s->full_capabilities.bounding;
         }
@@ -704,7 +704,7 @@ static int oci_uid_gid_range(const char *name, JsonVariant *v, JsonDispatchFlags
         assert_cc(sizeof(uid_t) == sizeof(gid_t));
 
         /* This is very much like oci_uid_gid(), except the checks are a bit different, as this is a UID range rather
-         * than a specific UID, and hence (uid_t) -1 has no special significance. OTOH a range of zero makes no
+         * than a specific UID, and hence UID_INVALID has no special significance. OTOH a range of zero makes no
          * sense. */
 
         k = json_variant_unsigned(v);
@@ -880,8 +880,8 @@ static int oci_devices(const char *name, JsonVariant *v, JsonDispatchFlags flags
                 *node = (DeviceNode) {
                         .uid = UID_INVALID,
                         .gid = GID_INVALID,
-                        .major = (unsigned) -1,
-                        .minor = (unsigned) -1,
+                        .major = UINT_MAX,
+                        .minor = UINT_MAX,
                         .mode = 0644,
                 };
 
@@ -892,7 +892,7 @@ static int oci_devices(const char *name, JsonVariant *v, JsonDispatchFlags flags
                 if (S_ISCHR(node->mode) || S_ISBLK(node->mode)) {
                         _cleanup_free_ char *path = NULL;
 
-                        if (node->major == (unsigned) -1 || node->minor == (unsigned) -1) {
+                        if (node->major == UINT_MAX || node->minor == UINT_MAX) {
                                 r = json_log(e, flags, SYNTHETIC_ERRNO(EINVAL),
                                              "Major/minor required when device node is device node");
                                 goto fail_element;
@@ -1026,8 +1026,8 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
         JSON_VARIANT_ARRAY_FOREACH(e, v) {
 
                 struct device_data data = {
-                        .major = (unsigned) -1,
-                        .minor = (unsigned) -1,
+                        .major = UINT_MAX,
+                        .minor = UINT_MAX,
                 }, *a;
 
                 static const JsonDispatch table[] = {
@@ -1052,7 +1052,7 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
                          * is really borked in the spec, with one exception: the entry that's supposed to
                          * drop the kernel's default we ignore silently */
 
-                        if (!data.r || !data.w || !data.m || data.type != 0 || data.major != (unsigned) -1 || data.minor != (unsigned) -1)
+                        if (!data.r || !data.w || !data.m || data.type != 0 || data.major != UINT_MAX || data.minor != UINT_MAX)
                                 json_log(v, flags|JSON_WARNING, 0, "Devices cgroup allow list with arbitrary 'allow' entries not supported, ignoring.");
 
                         /* We ignore the 'deny' entry as for us that's implied */
@@ -1064,11 +1064,11 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
                         continue;
                 }
 
-                if (data.minor != (unsigned) -1 && data.major == (unsigned) -1)
+                if (data.minor != UINT_MAX && data.major == UINT_MAX)
                         return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
                                         "Device cgroup allow list entries with minors but no majors not supported.");
 
-                if (data.major != (unsigned) -1 && data.type == 0)
+                if (data.major != UINT_MAX && data.type == 0)
                         return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
                                         "Device cgroup allow list entries with majors but no device node type not supported.");
 
@@ -1116,7 +1116,7 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
                 char access[4];
                 size_t n = 0;
 
-                if (list[i].minor == (unsigned) -1) {
+                if (list[i].minor == UINT_MAX) {
                         const char *t;
 
                         if (list[i].type == S_IFBLK)
@@ -1126,7 +1126,7 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
                                 t = "char";
                         }
 
-                        if (list[i].major == (unsigned) -1) {
+                        if (list[i].major == UINT_MAX) {
                                 pattern = strjoin(t, "-*");
                                 if (!pattern)
                                         return log_oom();
@@ -1136,7 +1136,7 @@ static int oci_cgroup_devices(const char *name, JsonVariant *v, JsonDispatchFlag
                         }
 
                 } else {
-                        assert(list[i].major != (unsigned) -1); /* If a minor is specified, then a major also needs to be specified */
+                        assert(list[i].major != UINT_MAX); /* If a minor is specified, then a major also needs to be specified */
 
                         r = device_path_make_major_minor(list[i].type, makedev(list[i].major, list[i].minor), &pattern);
                         if (r < 0)
@@ -1416,8 +1416,8 @@ static int oci_cgroup_block_io_weight_device(const char *name, JsonVariant *v, J
                         unsigned minor;
                         uintmax_t weight;
                 } data = {
-                        .major = (unsigned) -1,
-                        .minor = (unsigned) -1,
+                        .major = UINT_MAX,
+                        .minor = UINT_MAX,
                         .weight = UINTMAX_MAX,
                 };
 
@@ -1477,8 +1477,8 @@ static int oci_cgroup_block_io_throttle(const char *name, JsonVariant *v, JsonDi
                         unsigned minor;
                         uintmax_t rate;
                 } data = {
-                        .major = (unsigned) -1,
-                        .minor = (unsigned) -1,
+                        .major = UINT_MAX,
+                        .minor = UINT_MAX,
                 };
 
                 static const JsonDispatch table[] = {
@@ -1890,7 +1890,7 @@ static int oci_seccomp_syscalls(const char *name, JsonVariant *v, JsonDispatchFl
                         { "args",   JSON_VARIANT_ARRAY,  oci_seccomp_args,   0,                                     0              },
                 };
                 struct syscall_rule rule = {
-                        .action = (uint32_t) -1,
+                        .action = UINT32_MAX,
                 };
                 char **i;
 
index 74a00c52754da587925e2463668468b7c0d35b9b..d4619bead53ce5275c4800903bc747b5d958c324 100644 (file)
@@ -51,10 +51,10 @@ Settings *settings_new(void) {
                 .gid = GID_INVALID,
 
                 .console_mode = _CONSOLE_MODE_INVALID,
-                .console_width = (unsigned) -1,
-                .console_height = (unsigned) -1,
+                .console_width = UINT_MAX,
+                .console_height = UINT_MAX,
 
-                .clone_ns_flags = (unsigned long) -1,
+                .clone_ns_flags = ULONG_MAX,
                 .use_cgns = -1,
         };
 
@@ -274,7 +274,7 @@ int config_parse_capability(
                         break;
 
                 if (streq(word, "all"))
-                        u = (uint64_t) -1;
+                        u = UINT64_MAX;
                 else {
                         r = capability_from_name(word);
                         if (r < 0) {
index 44f457a5b549e93572d2aa6e9de1d4ceef85e223..a4ac8ed2bb752e6b478b8281d82aa6cd6e56191e 100644 (file)
@@ -217,7 +217,7 @@ static bool arg_oom_score_adjust_set = false;
 static CPUSet arg_cpu_set = {};
 static ResolvConfMode arg_resolv_conf = RESOLV_CONF_AUTO;
 static TimezoneMode arg_timezone = TIMEZONE_AUTO;
-static unsigned arg_console_width = (unsigned) -1, arg_console_height = (unsigned) -1;
+static unsigned arg_console_width = UINT_MAX, arg_console_height = UINT_MAX;
 static DeviceNode* arg_extra_nodes = NULL;
 static size_t arg_n_extra_nodes = 0;
 static char **arg_sysctl = NULL;
@@ -549,7 +549,7 @@ static int parse_capability_spec(const char *spec, uint64_t *ret_mask) {
                 }
 
                 if (streq(t, "all"))
-                        mask = (uint64_t) -1;
+                        mask = UINT64_MAX;
                 else {
                         r = capability_from_name(t);
                         if (r < 0)
@@ -1768,7 +1768,7 @@ static int verify_arguments(void) {
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Cannot use --port= without private networking.");
 
         if (arg_caps_ambient) {
-                if (arg_caps_ambient == (uint64_t)-1)
+                if (arg_caps_ambient == UINT64_MAX)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "AmbientCapability= does not support the value all.");
 
                 if ((arg_caps_ambient & arg_caps_retain) != arg_caps_ambient)
@@ -2640,19 +2640,19 @@ static int drop_capabilities(uid_t uid) {
         if (capability_quintet_is_set(&arg_full_capabilities)) {
                 q = arg_full_capabilities;
 
-                if (q.bounding == (uint64_t) -1)
+                if (q.bounding == UINT64_MAX)
                         q.bounding = uid == 0 ? arg_caps_retain : 0;
 
-                if (q.effective == (uint64_t) -1)
+                if (q.effective == UINT64_MAX)
                         q.effective = uid == 0 ? q.bounding : 0;
 
-                if (q.inheritable == (uint64_t) -1)
+                if (q.inheritable == UINT64_MAX)
                         q.inheritable = uid == 0 ? q.bounding : arg_caps_ambient;
 
-                if (q.permitted == (uint64_t) -1)
+                if (q.permitted == UINT64_MAX)
                         q.permitted = uid == 0 ? q.bounding : arg_caps_ambient;
 
-                if (q.ambient == (uint64_t) -1 && ambient_capabilities_supported())
+                if (q.ambient == UINT64_MAX && ambient_capabilities_supported())
                         q.ambient = arg_caps_ambient;
 
                 if (capability_quintet_mangle(&q))
@@ -2664,7 +2664,7 @@ static int drop_capabilities(uid_t uid) {
                         .effective = uid == 0 ? arg_caps_retain : 0,
                         .inheritable = uid == 0 ? arg_caps_retain : arg_caps_ambient,
                         .permitted = uid == 0 ? arg_caps_retain : arg_caps_ambient,
-                        .ambient = ambient_capabilities_supported() ? arg_caps_ambient : (uint64_t) -1,
+                        .ambient = ambient_capabilities_supported() ? arg_caps_ambient : UINT64_MAX,
                 };
 
                 /* If we're not using OCI, proceed with mangled capabilities (so we don't error out)
@@ -3045,7 +3045,7 @@ static int determine_uid_shift(const char *directory) {
                 arg_uid_range = UINT32_C(0x10000);
         }
 
-        if (arg_uid_shift > (uid_t) -1 - arg_uid_range)
+        if (arg_uid_shift > UID_INVALID - arg_uid_range)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "UID base too high for UID range.");
 
@@ -4336,7 +4336,7 @@ static int merge_settings(Settings *settings, const char *path) {
         }
 
         if ((arg_settings_mask & SETTING_CLONE_NS_FLAGS) == 0 &&
-            settings->clone_ns_flags != (unsigned long) -1) {
+            settings->clone_ns_flags != ULONG_MAX) {
 
                 if (!arg_settings_trusted)
                         log_warning("Ignoring namespace setting, file '%s' is not trusted.", path);
@@ -4563,7 +4563,7 @@ static int run_container(
                 if (child_netns_fd < 0)
                         return log_error_errno(errno, "Cannot open file %s: %m", arg_network_namespace_path);
 
-                r = fd_is_network_ns(child_netns_fd);
+                r = fd_is_ns(child_netns_fd, CLONE_NEWNET);
                 if (r == -EUCLEAN)
                         log_debug_errno(r, "Cannot determine if passed network namespace path '%s' really refers to a network namespace, assuming it does.", arg_network_namespace_path);
                 else if (r < 0)
@@ -4931,7 +4931,7 @@ static int run_container(
                         if (r < 0)
                                 return log_error_errno(r, "Failed to create PTY forwarder: %m");
 
-                        if (arg_console_width != (unsigned) -1 || arg_console_height != (unsigned) -1)
+                        if (arg_console_width != UINT_MAX || arg_console_height != UINT_MAX)
                                 (void) pty_forward_set_width_height(forward,
                                                                     arg_console_width,
                                                                     arg_console_height);
@@ -5552,7 +5552,7 @@ finish:
 
         /* Try to flush whatever is still queued in the pty */
         if (master >= 0) {
-                (void) copy_bytes(master, STDOUT_FILENO, (uint64_t) -1, 0);
+                (void) copy_bytes(master, STDOUT_FILENO, UINT64_MAX, 0);
                 master = safe_close(master);
         }
 
index 7fcb4b82cc65f618abdf71773a3b12cc64bef068..0d215cf6e977c083670e8fc2fb32da9145368bc9 100644 (file)
@@ -71,7 +71,7 @@ static int dump_state(int argc, char *argv[], void *userdata) {
                 return bus_log_parse_error(r);
 
         fflush(stdout);
-        return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, 0);
+        return copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0);
 }
 
 static int parse_argv(int argc, char *argv[]) {
index fad1fb0d452957e1afb031a1f0660a4b449d1c38..c3e84aadde98183fae6c6b5a9d3658807f25be2b 100644 (file)
@@ -112,11 +112,13 @@ static int process_managed_oom_reply(
                                 continue;
                 }
 
-                ret = oomd_insert_cgroup_context(NULL, monitor_hm, empty_to_root(reply.path));
+                ret = oomd_insert_cgroup_context(NULL, monitor_hm, reply.path);
                 if (ret == -ENOMEM) {
                         r = ret;
                         goto finish;
                 }
+                if (ret < 0 && ret != -EEXIST)
+                        log_debug_errno(ret, "Failed to insert reply, ignoring: %m");
 
                 /* Always update the limit in case it was changed. For non-memory pressure detection the value is
                  * ignored so always updating it here is not a problem. */
@@ -156,7 +158,11 @@ static int recursively_get_cgroup_context(Hashmap *new_h, const char *path) {
                 return r;
         else if (r == 0) { /* No subgroups? We're a leaf node */
                 r = oomd_insert_cgroup_context(NULL, new_h, path);
-                return (r == -ENOMEM) ? r : 0;
+                if (r == -ENOMEM)
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to insert context for %s, ignoring: %m", path);
+                return 0;
         }
 
         do {
@@ -171,8 +177,12 @@ static int recursively_get_cgroup_context(Hashmap *new_h, const char *path) {
 
                 r = cg_get_attribute_as_bool("memory", cg_path, "memory.oom.group", &oom_group);
                 /* The cgroup might be gone. Skip it as a candidate since we can't get information on it. */
-                if (r < 0)
-                        return (r == -ENOMEM) ? r : 0;
+                if (r == -ENOMEM)
+                        return r;
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to read memory.oom.group from %s, ignoring: %m", cg_path);
+                        return 0;
+                }
 
                 if (oom_group)
                         r = oomd_insert_cgroup_context(NULL, new_h, cg_path);
@@ -180,6 +190,8 @@ static int recursively_get_cgroup_context(Hashmap *new_h, const char *path) {
                         r = recursively_get_cgroup_context(new_h, cg_path);
                 if (r == -ENOMEM)
                         return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to insert or recursively get from %s, ignoring: %m", cg_path);
         } while ((r = cg_read_subgroup(d, &subpath)) > 0);
 
         return 0;
@@ -201,6 +213,8 @@ static int update_monitored_cgroup_contexts(Hashmap **monitored_cgroups) {
                 r = oomd_insert_cgroup_context(*monitored_cgroups, new_base, ctx->path);
                 if (r == -ENOMEM)
                         return r;
+                if (r < 0 && !IN_SET(r, -EEXIST, -ENOENT))
+                        log_debug_errno(r, "Failed to insert context for %s, ignoring: %m", ctx->path);
         }
 
         hashmap_free(*monitored_cgroups);
@@ -225,6 +239,8 @@ static int get_monitored_cgroup_contexts_candidates(Hashmap *monitored_cgroups,
                 r = recursively_get_cgroup_context(candidates, ctx->path);
                 if (r == -ENOMEM)
                         return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to recursively get contexts for %s, ignoring: %m", ctx->path);
         }
 
         *ret_candidates = TAKE_PTR(candidates);
@@ -232,6 +248,26 @@ static int get_monitored_cgroup_contexts_candidates(Hashmap *monitored_cgroups,
         return 0;
 }
 
+static int update_monitored_cgroup_contexts_candidates(Hashmap *monitored_cgroups, Hashmap **candidates) {
+        _cleanup_hashmap_free_ Hashmap *new_candidates = NULL;
+        int r;
+
+        assert(monitored_cgroups);
+        assert(candidates);
+        assert(*candidates);
+
+        r = get_monitored_cgroup_contexts_candidates(monitored_cgroups, &new_candidates);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to get candidate contexts: %m");
+
+        oomd_update_cgroup_contexts_between_hashmaps(*candidates, new_candidates);
+
+        hashmap_free(*candidates);
+        *candidates = TAKE_PTR(new_candidates);
+
+        return 0;
+}
+
 static int acquire_managed_oom_connect(Manager *m) {
         _cleanup_(varlink_close_unrefp) Varlink *link = NULL;
         int r;
@@ -275,33 +311,44 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
         /* Reset timer */
         r = sd_event_now(sd_event_source_get_event(s), CLOCK_MONOTONIC, &usec_now);
         if (r < 0)
-                return log_error_errno(r, "Failed to reset event timer");
+                return log_error_errno(r, "Failed to reset event timer: %m");
 
         r = sd_event_source_set_time_relative(s, INTERVAL_USEC);
         if (r < 0)
-                return log_error_errno(r, "Failed to set relative time for timer");
+                return log_error_errno(r, "Failed to set relative time for timer: %m");
 
         /* Reconnect if our connection dropped */
         if (!m->varlink) {
                 r = acquire_managed_oom_connect(m);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to acquire varlink connection");
+                        return log_error_errno(r, "Failed to acquire varlink connection: %m");
         }
 
         /* Update the cgroups used for detection/action */
         r = update_monitored_cgroup_contexts(&m->monitored_swap_cgroup_contexts);
         if (r == -ENOMEM)
-                return log_error_errno(r, "Failed to update monitored swap cgroup contexts");
+                return log_oom();
+        if (r < 0)
+                log_debug_errno(r, "Failed to update monitored swap cgroup contexts, ignoring: %m");
 
         r = update_monitored_cgroup_contexts(&m->monitored_mem_pressure_cgroup_contexts);
         if (r == -ENOMEM)
-                return log_error_errno(r, "Failed to update monitored memory pressure cgroup contexts");
+                return log_oom();
+        if (r < 0)
+                log_debug_errno(r, "Failed to update monitored memory pressure cgroup contexts, ignoring: %m");
+
+        r = update_monitored_cgroup_contexts_candidates(
+                        m->monitored_mem_pressure_cgroup_contexts, &m->monitored_mem_pressure_cgroup_contexts_candidates);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0)
+                log_debug_errno(r, "Failed to update monitored memory pressure candidate cgroup contexts, ignoring: %m");
 
         r = oomd_system_context_acquire("/proc/swaps", &m->system_context);
         /* If there aren't units depending on swap actions, the only error we exit on is ENOMEM.
          * Allow ENOENT in the event that swap is disabled on the system. */
         if (r == -ENOMEM || (r < 0 && r != -ENOENT && !hashmap_isempty(m->monitored_swap_cgroup_contexts)))
-                return log_error_errno(r, "Failed to acquire system context");
+                return log_error_errno(r, "Failed to acquire system context: %m");
         else if (r == -ENOENT)
                 zero(m->system_context);
 
@@ -318,7 +365,9 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
 
         r = oomd_pressure_above(m->monitored_mem_pressure_cgroup_contexts, m->default_mem_pressure_duration_usec, &targets);
         if (r == -ENOMEM)
-                return log_error_errno(r, "Failed to check if memory pressure exceeded limits");
+                return log_oom();
+        if (r < 0)
+                log_debug_errno(r, "Failed to check if memory pressure exceeded limits, ignoring: %m");
         else if (r == 1) {
                 /* Check if there was reclaim activity in the given interval. The concern is the following case:
                  * Pressure climbed, a lot of high-frequency pages were reclaimed, and we killed the offending
@@ -326,25 +375,37 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
                  * this will cause pressure to remain high. Thus if there isn't any reclaim pressure, no need
                  * to kill something (it won't help anyways). */
                 if ((usec_now - m->last_reclaim_at) <= RECLAIM_DURATION_USEC) {
-                        _cleanup_hashmap_free_ Hashmap *candidates = NULL;
                         OomdCGroupContext *t;
 
-                        r = get_monitored_cgroup_contexts_candidates(m->monitored_mem_pressure_cgroup_contexts, &candidates);
-                        if (r == -ENOMEM)
-                                return log_error_errno(r, "Failed to get monitored memory pressure cgroup candidates");
-
                         SET_FOREACH(t, targets) {
-                                log_notice("Memory pressure for %s is greater than %lu for more than %"PRIu64" seconds and there was reclaim activity",
-                                        t->path, LOAD_INT(t->mem_pressure_limit), m->default_mem_pressure_duration_usec / USEC_PER_SEC);
-
-                                r = oomd_kill_by_pgscan(candidates, t->path, m->dry_run);
+                                _cleanup_free_ char *selected = NULL;
+                                char ts[FORMAT_TIMESPAN_MAX];
+
+                                log_debug("Memory pressure for %s is %lu.%02lu%% > %lu.%02lu%% for > %s with reclaim activity",
+                                          t->path,
+                                          LOAD_INT(t->memory_pressure.avg10), LOAD_FRAC(t->memory_pressure.avg10),
+                                          LOAD_INT(t->mem_pressure_limit), LOAD_FRAC(t->mem_pressure_limit),
+                                          format_timespan(ts, sizeof ts,
+                                                          m->default_mem_pressure_duration_usec,
+                                                          USEC_PER_SEC));
+
+                                r = oomd_kill_by_pgscan_rate(m->monitored_mem_pressure_cgroup_contexts_candidates, t->path, m->dry_run, &selected);
                                 if (r == -ENOMEM)
-                                        return log_error_errno(r, "Failed to kill cgroup processes by pgscan");
+                                        return log_oom();
                                 if (r < 0)
-                                        log_info("Failed to kill any cgroup(s) under %s based on pressure", t->path);
+                                        log_notice_errno(r, "Failed to kill any cgroup(s) under %s based on pressure: %m", t->path);
                                 else {
                                         /* Don't act on all the high pressure cgroups at once; return as soon as we kill one */
                                         m->post_action_delay_start = usec_now;
+                                        if (selected)
+                                                log_notice("Killed %s due to memory pressure for %s being %lu.%02lu%% > %lu.%02lu%%"
+                                                           " for > %s with reclaim activity",
+                                                           selected, t->path,
+                                                           LOAD_INT(t->memory_pressure.avg10), LOAD_FRAC(t->memory_pressure.avg10),
+                                                           LOAD_INT(t->mem_pressure_limit), LOAD_FRAC(t->mem_pressure_limit),
+                                                           format_timespan(ts, sizeof ts,
+                                                                           m->default_mem_pressure_duration_usec,
+                                                                           USEC_PER_SEC));
                                         return 0;
                                 }
                         }
@@ -353,21 +414,30 @@ static int monitor_cgroup_contexts_handler(sd_event_source *s, uint64_t usec, vo
 
         if (oomd_swap_free_below(&m->system_context, 10000 - m->swap_used_limit_permyriad)) {
                 _cleanup_hashmap_free_ Hashmap *candidates = NULL;
+                _cleanup_free_ char *selected = NULL;
 
-                log_notice("Swap used (%"PRIu64") / total (%"PRIu64") is more than " PERMYRIAD_AS_PERCENT_FORMAT_STR,
-                           m->system_context.swap_used, m->system_context.swap_total, PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad));
+                log_debug("Swap used (%"PRIu64") / total (%"PRIu64") is more than " PERMYRIAD_AS_PERCENT_FORMAT_STR,
+                          m->system_context.swap_used, m->system_context.swap_total,
+                          PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad));
 
                 r = get_monitored_cgroup_contexts_candidates(m->monitored_swap_cgroup_contexts, &candidates);
                 if (r == -ENOMEM)
-                        return log_error_errno(r, "Failed to get monitored swap cgroup candidates");
+                        return log_oom();
+                if (r < 0)
+                        log_debug_errno(r, "Failed to get monitored swap cgroup candidates, ignoring: %m");
 
-                r = oomd_kill_by_swap_usage(candidates, m->dry_run);
+                r = oomd_kill_by_swap_usage(candidates, m->dry_run, &selected);
                 if (r == -ENOMEM)
-                        return log_error_errno(r, "Failed to kill cgroup processes by swap usage");
+                        return log_oom();
                 if (r < 0)
-                        log_info("Failed to kill any cgroup(s) based on swap");
+                        log_notice_errno(r, "Failed to kill any cgroup(s) based on swap: %m");
                 else {
                         m->post_action_delay_start = usec_now;
+                        if (selected)
+                                log_notice("Killed %s due to swap used (%"PRIu64") / total (%"PRIu64") being more than "
+                                           PERMYRIAD_AS_PERCENT_FORMAT_STR,
+                                           selected, m->system_context.swap_used, m->system_context.swap_total,
+                                           PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad));
                         return 0;
                 }
         }
@@ -412,6 +482,7 @@ Manager* manager_free(Manager *m) {
 
         hashmap_free(m->monitored_swap_cgroup_contexts);
         hashmap_free(m->monitored_mem_pressure_cgroup_contexts);
+        hashmap_free(m->monitored_mem_pressure_cgroup_contexts_candidates);
 
         return mfree(m);
 }
@@ -448,6 +519,10 @@ int manager_new(Manager **ret) {
         if (!m->monitored_mem_pressure_cgroup_contexts)
                 return -ENOMEM;
 
+        m->monitored_mem_pressure_cgroup_contexts_candidates = hashmap_new(&oomd_cgroup_ctx_hash_ops);
+        if (!m->monitored_mem_pressure_cgroup_contexts_candidates)
+                return -ENOMEM;
+
         *ret = TAKE_PTR(m);
         return 0;
 }
index 9ab8494c6d31e9a981bab64c8ed66a1d2b5b38d0..9c580c8a249c5bd7f1841077ed69d9633fb58a02 100644 (file)
@@ -40,6 +40,7 @@ struct Manager {
          * Used to detect when to take action. */
         Hashmap *monitored_swap_cgroup_contexts;
         Hashmap *monitored_mem_pressure_cgroup_contexts;
+        Hashmap *monitored_mem_pressure_cgroup_contexts_candidates;
 
         OomdSystemContext system_context;
 
index b054ccacc48cc3842e1d4caf9609bc305b101611..894d23a83a4a19746efec90d6de105fc622ed9bc 100644 (file)
@@ -208,54 +208,82 @@ int oomd_cgroup_kill(const char *path, bool recurse, bool dry_run) {
         return set_size(pids_killed) != 0;
 }
 
-int oomd_kill_by_pgscan(Hashmap *h, const char *prefix, bool dry_run) {
+int oomd_kill_by_pgscan_rate(Hashmap *h, const char *prefix, bool dry_run, char **ret_selected) {
         _cleanup_free_ OomdCGroupContext **sorted = NULL;
-        int r;
+        int n, r, ret = 0;
 
         assert(h);
+        assert(ret_selected);
 
-        r = oomd_sort_cgroup_contexts(h, compare_pgscan_and_memory_usage, prefix, &sorted);
-        if (r < 0)
-                return r;
+        n = oomd_sort_cgroup_contexts(h, compare_pgscan_rate_and_memory_usage, prefix, &sorted);
+        if (n < 0)
+                return n;
 
-        for (int i = 0; i < r; i++) {
-                /* Skip cgroups with no reclaim and memory usage; it won't alleviate pressure. */
-                /* Don't break since there might be "avoid" cgroups at the end. */
+        for (int i = 0; i < n; i++) {
+                /* Skip cgroups with no reclaim and memory usage; it won't alleviate pressure.
+                 * Continue since there might be "avoid" cgroups at the end. */
                 if (sorted[i]->pgscan == 0 && sorted[i]->current_memory_usage == 0)
                         continue;
 
                 r = oomd_cgroup_kill(sorted[i]->path, true, dry_run);
-                if (r > 0 || r == -ENOMEM)
-                        break;
+                if (r == 0)
+                        continue; /* We didn't find anything to kill */
+                if (r == -ENOMEM)
+                        return r; /* Treat oom as a hard error */
+                if (r < 0) {
+                        if (ret == 0)
+                                ret = r;
+                        continue; /* Try to find something else to kill */
+                }
+
+                char *selected = strdup(sorted[i]->path);
+                if (!selected)
+                        return -ENOMEM;
+                *ret_selected = selected;
+                return 1;
         }
 
-        return r;
+        return ret;
 }
 
-int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run) {
+int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run, char **ret_selected) {
         _cleanup_free_ OomdCGroupContext **sorted = NULL;
-        int r;
+        int n, r, ret = 0;
 
         assert(h);
+        assert(ret_selected);
 
-        r = oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted);
-        if (r < 0)
-                return r;
+        n = oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted);
+        if (n < 0)
+                return n;
 
         /* Try to kill cgroups with non-zero swap usage until we either succeed in
          * killing or we get to a cgroup with no swap usage. */
-        for (int i = 0; i < r; i++) {
-                /* Skip over cgroups with no resource usage. Don't break since there might be "avoid"
-                 * cgroups at the end. */
+        for (int i = 0; i < n; i++) {
+                /* Skip over cgroups with no resource usage.
+                 * Continue break since there might be "avoid" cgroups at the end. */
                 if (sorted[i]->swap_usage == 0)
                         continue;
 
                 r = oomd_cgroup_kill(sorted[i]->path, true, dry_run);
-                if (r > 0 || r == -ENOMEM)
-                        break;
+                if (r == 0)
+                        continue; /* We didn't find anything to kill */
+                if (r == -ENOMEM)
+                        return r; /* Treat oom as a hard error */
+                if (r < 0) {
+                        if (ret == 0)
+                                ret = r;
+                        continue; /* Try to find something else to kill */
+                }
+
+                char *selected = strdup(sorted[i]->path);
+                if (!selected)
+                        return -ENOMEM;
+                *ret_selected = selected;
+                return 1;
         }
 
-        return r;
+        return ret;
 }
 
 int oomd_cgroup_context_acquire(const char *path, OomdCGroupContext **ret) {
@@ -384,16 +412,20 @@ int oomd_system_context_acquire(const char *proc_swaps_path, OomdSystemContext *
 
 int oomd_insert_cgroup_context(Hashmap *old_h, Hashmap *new_h, const char *path) {
         _cleanup_(oomd_cgroup_context_freep) OomdCGroupContext *curr_ctx = NULL;
-        OomdCGroupContext *old_ctx, *ctx;
+        OomdCGroupContext *old_ctx;
         int r;
 
         assert(new_h);
         assert(path);
 
+        path = empty_to_root(path);
+
         r = oomd_cgroup_context_acquire(path, &curr_ctx);
         if (r < 0)
                 return log_debug_errno(r, "Failed to get OomdCGroupContext for %s: %m", path);
 
+        assert_se(streq(path, curr_ctx->path));
+
         old_ctx = hashmap_get(old_h, path);
         if (old_ctx) {
                 curr_ctx->last_pgscan = old_ctx->pgscan;
@@ -401,14 +433,33 @@ int oomd_insert_cgroup_context(Hashmap *old_h, Hashmap *new_h, const char *path)
                 curr_ctx->last_hit_mem_pressure_limit = old_ctx->last_hit_mem_pressure_limit;
         }
 
-        ctx = TAKE_PTR(curr_ctx);
-        r = hashmap_put(new_h, ctx->path, ctx);
+        r = hashmap_put(new_h, curr_ctx->path, curr_ctx);
         if (r < 0)
                 return r;
 
+        TAKE_PTR(curr_ctx);
         return 0;
 }
 
+void oomd_update_cgroup_contexts_between_hashmaps(Hashmap *old_h, Hashmap *curr_h) {
+        OomdCGroupContext *ctx;
+
+        assert(old_h);
+        assert(curr_h);
+
+        HASHMAP_FOREACH(ctx, curr_h) {
+                OomdCGroupContext *old_ctx;
+
+                old_ctx = hashmap_get(old_h, ctx->path);
+                if (!old_ctx)
+                        continue;
+
+                ctx->last_pgscan = old_ctx->pgscan;
+                ctx->mem_pressure_limit = old_ctx->mem_pressure_limit;
+                ctx->last_hit_mem_pressure_limit = old_ctx->last_hit_mem_pressure_limit;
+        }
+}
+
 void oomd_dump_swap_cgroup_context(const OomdCGroupContext *ctx, FILE *f, const char *prefix) {
         char swap[FORMAT_BYTES_MAX];
 
@@ -454,10 +505,12 @@ void oomd_dump_memory_pressure_cgroup_context(const OomdCGroupContext *ctx, FILE
                 fprintf(f,
                         "%s\tMemory Min: %s\n"
                         "%s\tMemory Low: %s\n"
-                        "%s\tPgscan: %" PRIu64 "\n",
+                        "%s\tPgscan: %" PRIu64 "\n"
+                        "%s\tLast Pgscan: %" PRIu64 "\n",
                         strempty(prefix), format_bytes_cgroup_protection(mem_min, sizeof(mem_min), ctx->memory_min),
                         strempty(prefix), format_bytes_cgroup_protection(mem_low, sizeof(mem_low), ctx->memory_low),
-                        strempty(prefix), ctx->pgscan);
+                        strempty(prefix), ctx->pgscan,
+                        strempty(prefix), ctx->last_pgscan);
 }
 
 void oomd_dump_system_context(const OomdSystemContext *ctx, FILE *f, const char *prefix) {
index 181443ae7a6f6698e7714dfbadc8ee8b82c91037..51423130d1b8c8c964d3b608f04fa0841e02148c 100644 (file)
@@ -66,7 +66,8 @@ bool oomd_swap_free_below(const OomdSystemContext *ctx, int threshold_permyriad)
 
 /* The compare functions will sort from largest to smallest, putting all the contexts with "avoid" at the end
  * (after the smallest values). */
-static inline int compare_pgscan_and_memory_usage(OomdCGroupContext * const *c1, OomdCGroupContext * const *c2) {
+static inline int compare_pgscan_rate_and_memory_usage(OomdCGroupContext * const *c1, OomdCGroupContext * const *c2) {
+        uint64_t last1, last2;
         int r;
 
         assert(c1);
@@ -76,7 +77,22 @@ static inline int compare_pgscan_and_memory_usage(OomdCGroupContext * const *c1,
         if (r != 0)
                 return r;
 
-        r = CMP((*c2)->pgscan, (*c1)->pgscan);
+        /* If last_pgscan > pgscan, assume the cgroup was recreated and reset last_pgscan to zero. */
+        last2 = (*c2)->last_pgscan;
+        if ((*c2)->last_pgscan > (*c2)->pgscan) {
+                log_info("Last pgscan %" PRIu64 "greater than current pgscan %" PRIu64 "for %s. Using last pgscan of zero.",
+                                (*c2)->last_pgscan, (*c2)->pgscan, (*c2)->path);
+                last2 = 0;
+        }
+
+        last1 = (*c1)->last_pgscan;
+        if ((*c1)->last_pgscan > (*c1)->pgscan) {
+                log_info("Last pgscan %" PRIu64 "greater than current pgscan %" PRIu64 "for %s. Using last pgscan of zero.",
+                                (*c1)->last_pgscan, (*c1)->pgscan, (*c1)->path);
+                last1 = 0;
+        }
+
+        r = CMP((*c2)->pgscan - last2, (*c1)->pgscan - last1);
         if (r != 0)
                 return r;
 
@@ -106,9 +122,10 @@ int oomd_cgroup_kill(const char *path, bool recurse, bool dry_run);
 
 /* The following oomd_kill_by_* functions return 1 if processes were killed, or negative otherwise. */
 /* If `prefix` is supplied, only cgroups whose paths start with `prefix` are eligible candidates. Otherwise,
- * everything in `h` is a candidate. */
-int oomd_kill_by_pgscan(Hashmap *h, const char *prefix, bool dry_run);
-int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run);
+ * everything in `h` is a candidate.
+ * Returns the killed cgroup in ret_selected. */
+int oomd_kill_by_pgscan_rate(Hashmap *h, const char *prefix, bool dry_run, char **ret_selected);
+int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run, char **ret_selected);
 
 int oomd_cgroup_context_acquire(const char *path, OomdCGroupContext **ret);
 int oomd_system_context_acquire(const char *proc_swaps_path, OomdSystemContext *ret);
@@ -119,6 +136,9 @@ int oomd_system_context_acquire(const char *proc_swaps_path, OomdSystemContext *
  * was no prior data to reference. */
 int oomd_insert_cgroup_context(Hashmap *old_h, Hashmap *new_h, const char *path);
 
+/* Update each OomdCGroupContext in `curr_h` with prior interval information from `old_h`. */
+void oomd_update_cgroup_contexts_between_hashmaps(Hashmap *old_h, Hashmap *curr_h);
+
 void oomd_dump_swap_cgroup_context(const OomdCGroupContext *ctx, FILE *f, const char *prefix);
 void oomd_dump_memory_pressure_cgroup_context(const OomdCGroupContext *ctx, FILE *f, const char *prefix);
 void oomd_dump_system_context(const OomdSystemContext *ctx, FILE *f, const char *prefix);
index 674d53fdcfe12b03d428e89fa0e2db604dc6724c..6e2a5889d1e276bd8a8be810f6b5bfd811cdc5bb 100644 (file)
@@ -170,7 +170,7 @@ static int run(int argc, char *argv[]) {
 
         notify_msg = notify_start(NOTIFY_READY, NOTIFY_STOPPING);
 
-        log_info("systemd-oomd starting%s!", arg_dry_run ? " in dry run mode" : "");
+        log_debug("systemd-oomd started%s.", arg_dry_run ? " in dry run mode" : "");
 
         r = sd_event_loop(m->event);
         if (r < 0)
index f1bef9de6fb912795b7c311886bc6e9539d4e232..d1dca0d64d15f60c3f63f54e4ddc6e5d184c9f70 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/oomd.conf' to display the full config.
+#
 # See oomd.conf(5) for details
 
 [OOM]
index a0e583ac6b377aae038cfce71a1033a3b192ff7d..bd1c574ca7fa02cabb24d155edcf9f541d190625 100644 (file)
@@ -150,6 +150,7 @@ static void test_oomd_cgroup_context_acquire_and_insert(void) {
         assert_se(oomd_insert_cgroup_context(NULL, h1, cgroup) == 0);
         c1 = hashmap_get(h1, cgroup);
         assert_se(c1);
+        assert_se(oomd_insert_cgroup_context(NULL, h1, cgroup) == -EEXIST);
 
          /* make sure certain values from h1 get updated in h2 */
         c1->pgscan = 5555;
@@ -175,6 +176,53 @@ static void test_oomd_cgroup_context_acquire_and_insert(void) {
         }
 }
 
+static void test_oomd_update_cgroup_contexts_between_hashmaps(void) {
+        _cleanup_hashmap_free_ Hashmap *h_old = NULL, *h_new = NULL;
+        OomdCGroupContext *c_old, *c_new;
+        char **paths = STRV_MAKE("/0.slice",
+                                 "/1.slice");
+
+        OomdCGroupContext ctx_old[3] = {
+                { .path = paths[0],
+                  .mem_pressure_limit = 5,
+                  .last_hit_mem_pressure_limit = 777,
+                  .pgscan = 57 },
+                { .path = paths[1],
+                  .mem_pressure_limit = 6,
+                  .last_hit_mem_pressure_limit = 888,
+                  .pgscan = 42 },
+        };
+
+        OomdCGroupContext ctx_new[3] = {
+                { .path = paths[0],
+                  .pgscan = 100 },
+                { .path = paths[1],
+                  .pgscan = 101 },
+        };
+
+        assert_se(h_old = hashmap_new(&string_hash_ops));
+        assert_se(hashmap_put(h_old, paths[0], &ctx_old[0]) >= 0);
+        assert_se(hashmap_put(h_old, paths[1], &ctx_old[1]) >= 0);
+
+        assert_se(h_new = hashmap_new(&string_hash_ops));
+        assert_se(hashmap_put(h_new, paths[0], &ctx_new[0]) >= 0);
+        assert_se(hashmap_put(h_new, paths[1], &ctx_new[1]) >= 0);
+
+        oomd_update_cgroup_contexts_between_hashmaps(h_old, h_new);
+
+        assert_se(c_old = hashmap_get(h_old, "/0.slice"));
+        assert_se(c_new = hashmap_get(h_new, "/0.slice"));
+        assert_se(c_old->pgscan == c_new->last_pgscan);
+        assert_se(c_old->mem_pressure_limit == c_new->mem_pressure_limit);
+        assert_se(c_old->last_hit_mem_pressure_limit == c_new->last_hit_mem_pressure_limit);
+
+        assert_se(c_old = hashmap_get(h_old, "/1.slice"));
+        assert_se(c_new = hashmap_get(h_new, "/1.slice"));
+        assert_se(c_old->pgscan == c_new->last_pgscan);
+        assert_se(c_old->mem_pressure_limit == c_new->mem_pressure_limit);
+        assert_se(c_old->last_hit_mem_pressure_limit == c_new->last_hit_mem_pressure_limit);
+}
+
 static void test_oomd_system_context_acquire(void) {
         _cleanup_(unlink_tempfilep) char path[] = "/oomdgetsysctxtestXXXXXX";
         OomdSystemContext ctx;
@@ -324,33 +372,45 @@ static void test_oomd_sort_cgroups(void) {
                                  "/herp.slice/derp.scope",
                                  "/herp.slice/derp.scope/sheep.service",
                                  "/zupa.slice",
+                                 "/boop.slice",
                                  "/omitted.slice",
                                  "/avoid.slice");
 
-        OomdCGroupContext ctx[6] = {
+        OomdCGroupContext ctx[7] = {
                 { .path = paths[0],
                   .swap_usage = 20,
-                  .pgscan = 60,
+                  .last_pgscan = 0,
+                  .pgscan = 33,
                   .current_memory_usage = 10 },
                 { .path = paths[1],
                   .swap_usage = 60,
-                  .pgscan = 40,
+                  .last_pgscan = 33,
+                  .pgscan = 1,
                   .current_memory_usage = 20 },
                 { .path = paths[2],
                   .swap_usage = 40,
-                  .pgscan = 40,
+                  .last_pgscan = 1,
+                  .pgscan = 33,
                   .current_memory_usage = 40 },
                 { .path = paths[3],
                   .swap_usage = 10,
-                  .pgscan = 80,
+                  .last_pgscan = 33,
+                  .pgscan = 2,
                   .current_memory_usage = 10 },
                 { .path = paths[4],
+                  .swap_usage = 11,
+                  .last_pgscan = 33,
+                  .pgscan = 33,
+                  .current_memory_usage = 10 },
+                { .path = paths[5],
                   .swap_usage = 90,
-                  .pgscan = 100,
+                  .last_pgscan = 0,
+                  .pgscan = UINT64_MAX,
                   .preference = MANAGED_OOM_PREFERENCE_OMIT },
-                { .path = paths[5],
+                { .path = paths[6],
                   .swap_usage = 99,
-                  .pgscan = 200,
+                  .last_pgscan = 0,
+                  .pgscan = UINT64_MAX,
                   .preference = MANAGED_OOM_PREFERENCE_AVOID },
         };
 
@@ -360,32 +420,36 @@ static void test_oomd_sort_cgroups(void) {
         assert_se(hashmap_put(h, "/herp.slice/derp.scope", &ctx[1]) >= 0);
         assert_se(hashmap_put(h, "/herp.slice/derp.scope/sheep.service", &ctx[2]) >= 0);
         assert_se(hashmap_put(h, "/zupa.slice", &ctx[3]) >= 0);
-        assert_se(hashmap_put(h, "/omitted.slice", &ctx[4]) >= 0);
-        assert_se(hashmap_put(h, "/avoid.slice", &ctx[5]) >= 0);
+        assert_se(hashmap_put(h, "/boop.slice", &ctx[4]) >= 0);
+        assert_se(hashmap_put(h, "/omitted.slice", &ctx[5]) >= 0);
+        assert_se(hashmap_put(h, "/avoid.slice", &ctx[6]) >= 0);
 
-        assert_se(oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted_cgroups) == 5);
+        assert_se(oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted_cgroups) == 6);
         assert_se(sorted_cgroups[0] == &ctx[1]);
         assert_se(sorted_cgroups[1] == &ctx[2]);
         assert_se(sorted_cgroups[2] == &ctx[0]);
-        assert_se(sorted_cgroups[3] == &ctx[3]);
-        assert_se(sorted_cgroups[4] == &ctx[5]);
+        assert_se(sorted_cgroups[3] == &ctx[4]);
+        assert_se(sorted_cgroups[4] == &ctx[3]);
+        assert_se(sorted_cgroups[5] == &ctx[6]);
         sorted_cgroups = mfree(sorted_cgroups);
 
-        assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_and_memory_usage, NULL, &sorted_cgroups) == 5);
-        assert_se(sorted_cgroups[0] == &ctx[3]);
-        assert_se(sorted_cgroups[1] == &ctx[0]);
-        assert_se(sorted_cgroups[2] == &ctx[2]);
+        assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_rate_and_memory_usage, NULL, &sorted_cgroups) == 6);
+        assert_se(sorted_cgroups[0] == &ctx[0]);
+        assert_se(sorted_cgroups[1] == &ctx[2]);
+        assert_se(sorted_cgroups[2] == &ctx[3]);
         assert_se(sorted_cgroups[3] == &ctx[1]);
-        assert_se(sorted_cgroups[4] == &ctx[5]);
+        assert_se(sorted_cgroups[4] == &ctx[4]);
+        assert_se(sorted_cgroups[5] == &ctx[6]);
         sorted_cgroups = mfree(sorted_cgroups);
 
-        assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_and_memory_usage, "/herp.slice/derp.scope", &sorted_cgroups) == 2);
+        assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_rate_and_memory_usage, "/herp.slice/derp.scope", &sorted_cgroups) == 2);
         assert_se(sorted_cgroups[0] == &ctx[2]);
         assert_se(sorted_cgroups[1] == &ctx[1]);
         assert_se(sorted_cgroups[2] == 0);
         assert_se(sorted_cgroups[3] == 0);
         assert_se(sorted_cgroups[4] == 0);
         assert_se(sorted_cgroups[5] == 0);
+        assert_se(sorted_cgroups[6] == 0);
         sorted_cgroups = mfree(sorted_cgroups);
 }
 
@@ -394,6 +458,7 @@ int main(void) {
 
         test_setup_logging(LOG_DEBUG);
 
+        test_oomd_update_cgroup_contexts_between_hashmaps();
         test_oomd_system_context_acquire();
         test_oomd_pressure_above();
         test_oomd_memory_reclaim();
index 45e82cd0eb5fb732aec30ecada1a69361911a16b..f6d337ee2bfed8ffadd3afd1324f75c9af09dc36 100644 (file)
@@ -960,7 +960,6 @@ static int config_parse_label(
                 void *data,
                 void *userdata) {
 
-        _cleanup_free_ char16_t *recoded = NULL;
         _cleanup_free_ char *resolved = NULL;
         char **label = data;
         int r;
@@ -981,11 +980,14 @@ static int config_parse_label(
                 return 0;
         }
 
-        recoded = utf8_to_utf16(resolved, strlen(resolved));
-        if (!recoded)
-                return log_oom();
-
-        if (char16_strlen(recoded) > 36) {
+        r = gpt_partition_label_valid(resolved);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to check if string is valid as GPT partition label, ignoring: \"%s\" (from \"%s\")",
+                           resolved, rvalue);
+                return 0;
+        }
+        if (!r) {
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "Partition label too long for GPT table, ignoring: \"%s\" (from \"%s\")",
                            resolved, rvalue);
@@ -1838,10 +1840,10 @@ static int context_dump_partitions(Context *context, const char *node) {
         if (!DEBUG_LOGGING) {
                 if (arg_json_format_flags & JSON_FORMAT_OFF)
                         (void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4,
-                                                    (size_t) 8, (size_t) 11, (size_t) -1);
+                                                    (size_t) 8, (size_t) 11);
                 else
                         (void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4,
-                                                    (size_t) 5, (size_t) 6, (size_t) 7, (size_t) 9, (size_t) 10, (size_t) 12, (size_t) -1);
+                                                    (size_t) 5, (size_t) 6, (size_t) 7, (size_t) 9, (size_t) 10, (size_t) 12);
         }
 
         (void) table_set_align_percent(t, table_get_cell(t, 0, 4), 100);
@@ -2992,8 +2994,6 @@ static int partition_acquire_label(Context *context, Partition *p, char **ret) {
                         break;
 
                 label = mfree(label);
-
-
                 if (asprintf(&label, "%s-%u", prefix, ++k) < 0)
                         return log_oom();
         }
@@ -3847,7 +3847,7 @@ static int remove_efi_variable_factory_reset(void) {
 static int acquire_root_devno(const char *p, int mode, char **ret, int *ret_fd) {
         _cleanup_close_ int fd = -1;
         struct stat st;
-        dev_t devno, fd_devno = (mode_t) -1;
+        dev_t devno, fd_devno = MODE_INVALID;
         int r;
 
         assert(p);
@@ -3905,7 +3905,7 @@ static int acquire_root_devno(const char *p, int mode, char **ret, int *ret_fd)
 
         /* Only if we still lock at the same block device we can reuse the fd. Otherwise return an
          * invalidated fd. */
-        *ret_fd = fd_devno != (mode_t) -1 && fd_devno == devno ? TAKE_FD(fd) : -1;
+        *ret_fd = fd_devno != MODE_INVALID && fd_devno == devno ? TAKE_FD(fd) : -1;
         return 0;
 }
 
@@ -3975,6 +3975,40 @@ static int find_root(char **ret, int *ret_fd) {
         return log_error_errno(SYNTHETIC_ERRNO(ENODEV), "Failed to discover root block device.");
 }
 
+static int resize_pt(int fd) {
+        char procfs_path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
+        _cleanup_(fdisk_unref_contextp) struct fdisk_context *c = NULL;
+        int r;
+
+        /* After resizing the backing file we need to resize the partition table itself too, so that it takes
+         * possession of the enlarged backing file. For this it suffices to open the device with libfdisk and
+         * immediately write it again, with no changes. */
+
+        c = fdisk_new_context();
+        if (!c)
+                return log_oom();
+
+        xsprintf(procfs_path, "/proc/self/fd/%i", fd);
+        r = fdisk_assign_device(c, procfs_path, 0);
+        if (r < 0)
+                return log_error_errno(r, "Failed to open device '%s': %m", procfs_path);
+
+        r = fdisk_has_label(c);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine whether disk '%s' has a disk label: %m", procfs_path);
+        if (r == 0) {
+                log_debug("Not resizing partition table, as there currently is none.");
+                return 0;
+        }
+
+        r = fdisk_write_disklabel(c);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write resized partition table: %m");
+
+        log_info("Resized partition table.");
+        return 1;
+}
+
 static int resize_backing_fd(const char *node, int *fd) {
         char buf1[FORMAT_BYTES_MAX], buf2[FORMAT_BYTES_MAX];
         _cleanup_close_ int writable_fd = -1;
@@ -4027,6 +4061,10 @@ static int resize_backing_fd(const char *node, int *fd) {
                         /* Fallback to truncation, if fallocate() is not supported. */
                         log_debug("Backing file system does not support fallocate(), falling back to ftruncate().");
                 } else {
+                        r = resize_pt(writable_fd);
+                        if (r < 0)
+                                return r;
+
                         if (st.st_size == 0) /* Likely regular file just created by us */
                                 log_info("Allocated %s for '%s'.", buf2, node);
                         else
@@ -4040,6 +4078,10 @@ static int resize_backing_fd(const char *node, int *fd) {
                 return log_error_errno(errno, "Failed to grow '%s' from %s to %s by truncation: %m",
                                        node, buf1, buf2);
 
+        r = resize_pt(writable_fd);
+        if (r < 0)
+                return r;
+
         if (st.st_size == 0) /* Likely regular file just created by us */
                 log_info("Sized '%s' to %s.", node, buf2);
         else
index 0910d68078c3eb0df6cd80db32243a51fb4db116..d21865dd6470d4b8b7418e0b1e968fb29732e5ef 100755 (executable)
@@ -2,7 +2,7 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 set -ex
 
-[[ -f /dev/loop-control ]] || exit 77
+[[ -e /dev/loop-control ]] || exit 77
 
 repart=$1
 test -x $repart
index af4acc21257c7eb83f53de21951e30b2de2ce54e..77fcd4fe6fcbc374b4cff8055103448163cb3d25 100644 (file)
@@ -834,7 +834,7 @@ static int list_images(int argc, char *argv[], void *userdata) {
                 return bus_log_parse_error(r);
 
         if (table_get_rows(table) > 1) {
-                r = table_set_sort(table, (size_t) 0, (size_t) -1);
+                r = table_set_sort(table, (size_t) 0);
                 if (r < 0)
                         return table_log_sort_error(r);
 
@@ -923,7 +923,7 @@ static int set_limit(int argc, char *argv[], void *userdata) {
         (void) polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
 
         if (STR_IN_SET(argv[argc-1], "-", "none", "infinity"))
-                limit = (uint64_t) -1;
+                limit = UINT64_MAX;
         else {
                 r = parse_size(argv[argc-1], 1024, &limit);
                 if (r < 0)
index 8de8bfc247c4ef673dc1c2fc10780110bf883e5b..6d0dee99c3f703494329f3cfa65c9d6c821d027a 100644 (file)
@@ -42,7 +42,7 @@ static int property_get_pool_usage(
                 sd_bus_error *error) {
 
         _cleanup_close_ int fd = -1;
-        uint64_t usage = (uint64_t) -1;
+        uint64_t usage = UINT64_MAX;
 
         assert(bus);
         assert(reply);
@@ -68,7 +68,7 @@ static int property_get_pool_limit(
                 sd_bus_error *error) {
 
         _cleanup_close_ int fd = -1;
-        uint64_t size = (uint64_t) -1;
+        uint64_t size = UINT64_MAX;
 
         assert(bus);
         assert(reply);
index 9d59c608c1516d98126dc979f00edc3433945bd9..6ce38f10a3e08dcb653a85b59379898be1a372b8 100644 (file)
@@ -342,7 +342,7 @@ static int list_files(PStoreList *list, const char *sourcepath) {
                 size_t buf_size;
 
                 /* Now read contents of pstore file */
-                r = read_full_file(ifd_path, &buf, &buf_size);
+                r = read_full_virtual_file(ifd_path, &buf, &buf_size);
                 if (r < 0) {
                         log_warning_errno(r, "Failed to read file %s, skipping: %m", ifd_path);
                         continue;
index 0392ad98742df9ad233e2389adf051c5ecca5a4e..b1d97736a3f16c278b42402843125a1360938323 100644 (file)
@@ -13,6 +13,8 @@ basic_dns_sources = files('''
         resolved-dns-answer.h
         resolved-dns-question.c
         resolved-dns-question.h
+        resolved-util.c
+        resolved-util.h
         dns-type.c
         dns-type.h
 '''.split())
@@ -210,9 +212,13 @@ tests += [
           libgpg_error,
           libm]],
 
-        [['src/resolve/test-dnssec-complex.c',
-          'src/resolve/dns-type.c'],
-         [], [], resolve_includes, '', 'manual'],
+        [['src/resolve/test-dnssec-complex.c'],
+         [libsystemd_resolve_core,
+          libshared],
+         [libgcrypt,
+          libgpg_error,
+          libm],
+         [], '', 'manual'],
 ]
 
 fuzzers += [
index 2bd18d2c6d3508822ba320ca105ae7145639b4cc..52bbae3293b8283f5e25468e6e7f3dccc4029b45 100644 (file)
@@ -19,6 +19,7 @@
 #include "format-table.h"
 #include "format-util.h"
 #include "gcrypt-util.h"
+#include "hostname-util.h"
 #include "main-func.h"
 #include "missing_network.h"
 #include "netlink-util.h"
@@ -31,6 +32,7 @@
 #include "resolvectl.h"
 #include "resolved-def.h"
 #include "resolved-dns-packet.h"
+#include "resolved-util.h"
 #include "socket-netlink.h"
 #include "sort-util.h"
 #include "stdio-util.h"
@@ -441,6 +443,25 @@ static int idna_candidate(const char *name, char **ret) {
         return false;
 }
 
+static bool single_label_nonsynthetic(const char *name) {
+        _cleanup_free_ char *first_label = NULL;
+        int r;
+
+        if (!dns_name_is_single_label(name))
+                return false;
+
+        if (is_localhost(name) || is_gateway_hostname(name))
+                return false;
+
+        r = resolve_system_hostname(NULL, &first_label);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to determine the hostname: %m");
+                return false;
+        }
+
+        return !streq(name, first_label);
+}
+
 static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_t type, bool warn_missing) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *req = NULL, *reply = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -455,15 +476,15 @@ static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_
 
         log_debug("Resolving %s %s %s (interface %s).", name, dns_class_to_string(class), dns_type_to_string(type), isempty(arg_ifname) ? "*" : arg_ifname);
 
-        if (dns_name_is_single_label(name))
-                log_notice("(Note that search domains are not appended when resolving raw record types. "
-                           "Please specify fully qualified domain names when resolving raw records, or remove --type= switch from invocation in order to request regular hostname resolution.)");
+        if (dns_name_dot_suffixed(name) == 0 && single_label_nonsynthetic(name))
+                log_notice("(Note that search domains are not appended when --type= is specified. "
+                           "Please specify fully qualified domain names, or remove --type= switch from invocation in order to request regular hostname resolution.)");
 
         r = idna_candidate(name, &idnafied);
         if (r < 0)
                 return r;
         if (r > 0)
-                log_notice("(Note that IDNA translation is not applied when resolving raw record types. "
+                log_notice("(Note that IDNA translation is not applied when --type= is specified. "
                            "Please specify translated domain names — i.e. '%s' — when resolving raw records, or remove --type= switch from invocation in order to request regular hostname resolution.",
                            idnafied);
 
index 032ed0256bf41e9b0886ac2089ea3582360b43f1..c3624669ce18b954fb29890bce42c936ce4005cd 100644 (file)
@@ -195,14 +195,14 @@ static void bus_method_resolve_hostname_complete(DnsQuery *q) {
                 goto finish;
         }
 
-        r = dns_query_process_cname(q);
+        r = dns_query_process_cname_many(q);
         if (r == -ELOOP) {
                 r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
                 goto finish;
         }
         if (r < 0)
                 goto finish;
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         r = sd_bus_message_new_method_return(q->bus_request, &reply);
@@ -486,14 +486,14 @@ static void bus_method_resolve_address_complete(DnsQuery *q) {
                 goto finish;
         }
 
-        r = dns_query_process_cname(q);
+        r = dns_query_process_cname_many(q);
         if (r == -ELOOP) {
                 r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
                 goto finish;
         }
         if (r < 0)
                 goto finish;
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         r = sd_bus_message_new_method_return(q->bus_request, &reply);
@@ -660,14 +660,14 @@ static void bus_method_resolve_record_complete(DnsQuery *q) {
                 goto finish;
         }
 
-        r = dns_query_process_cname(q);
+        r = dns_query_process_cname_many(q);
         if (r == -ELOOP) {
                 r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
                 goto finish;
         }
         if (r < 0)
                 goto finish;
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         r = sd_bus_message_new_method_return(q->bus_request, &reply);
@@ -1107,8 +1107,8 @@ static void resolve_service_hostname_complete(DnsQuery *q) {
                 return;
         }
 
-        r = dns_query_process_cname(q);
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        r = dns_query_process_cname_many(q);
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         /* This auxiliary lookup is finished or failed, let's see if all are finished now. */
@@ -1180,14 +1180,14 @@ static void bus_method_resolve_service_complete(DnsQuery *q) {
                 goto finish;
         }
 
-        r = dns_query_process_cname(q);
+        r = dns_query_process_cname_many(q);
         if (r == -ELOOP) {
                 r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
                 goto finish;
         }
         if (r < 0)
                 goto finish;
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         question = dns_query_question_for_protocol(q, q->answer_protocol);
index f2a331625174fb49ebd4b278d7190853c737661b..87d1794a741784acb6ecbb0dd8d01e494a9d11f6 100644 (file)
@@ -348,7 +348,7 @@ int config_parse_dnssd_txt(
                 int r;
 
                 r = extract_first_word(&rvalue, &word, NULL,
-                                       EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX);
+                                       EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX);
                 if (r == 0)
                         break;
                 if (r == -ENOMEM)
index ce3cbce308d6d3c656a4af537a2963f200f796ac..a032ac157e067b3dd53061b105caed6444610d73 100644 (file)
@@ -640,6 +640,31 @@ int dns_answer_remove_by_rr(DnsAnswer **a, DnsResourceRecord *rm) {
         return 1;
 }
 
+int dns_answer_remove_by_answer_keys(DnsAnswer **a, DnsAnswer *b) {
+        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *prev = NULL;
+        DnsAnswerItem *item;
+        int r;
+
+        /* Removes all items from '*a' that have a matching key in 'b' */
+
+        DNS_ANSWER_FOREACH_ITEM(item, b) {
+
+                if (prev && dns_resource_key_equal(item->rr->key, prev)) /* Skip this one, we already looked at it */
+                        continue;
+
+                r = dns_answer_remove_by_key(a, item->rr->key);
+                if (r < 0)
+                        return r;
+
+                /* Let's remember this entry's RR key, to optimize the loop a bit: if we have an RRset with
+                 * more than one item then we don't need to remove the key multiple times */
+                dns_resource_key_unref(prev);
+                prev = dns_resource_key_ref(item->rr->key);
+        }
+
+        return 0;
+}
+
 int dns_answer_copy_by_key(
                 DnsAnswer **a,
                 DnsAnswer *source,
@@ -854,9 +879,8 @@ void dns_answer_dump(DnsAnswer *answer, FILE *f) {
                 }
 
                 fputs(t, f);
-
-                if (item->ifindex != 0 || item->rrsig || item->flags != 0)
-                        fputs("\t;", f);
+                fputs("\t;", f);
+                fprintf(f, " ttl=%" PRIu32, item->rr->ttl);
 
                 if (item->ifindex != 0)
                         fprintf(f, " ifindex=%i", item->ifindex);
@@ -938,3 +962,22 @@ void dns_answer_randomize(DnsAnswer *a) {
                 SWAP_TWO(a->items[i], a->items[k]);
         }
 }
+
+uint32_t dns_answer_min_ttl(DnsAnswer *a) {
+        uint32_t ttl = UINT32_MAX;
+        DnsResourceRecord *rr;
+
+        /* Return the smallest TTL of all RRs in this answer */
+
+        DNS_ANSWER_FOREACH(rr, a) {
+                /* Don't consider OPT (where the TTL field is used for other purposes than an actual TTL) */
+
+                if (dns_type_is_pseudo(rr->key->type) ||
+                    dns_class_is_pseudo(rr->key->class))
+                        continue;
+
+                ttl = MIN(ttl, rr->ttl);
+        }
+
+        return ttl;
+}
index c2fd0c078f42d6837f1f2efd33fff0dc8411a889..447da5d6cc3437e282c6cd7265ab8d78b27a7cad 100644 (file)
@@ -68,6 +68,7 @@ int dns_answer_reserve_or_clone(DnsAnswer **a, size_t n_free);
 
 int dns_answer_remove_by_key(DnsAnswer **a, const DnsResourceKey *key);
 int dns_answer_remove_by_rr(DnsAnswer **a, DnsResourceRecord *rr);
+int dns_answer_remove_by_answer_keys(DnsAnswer **a, DnsAnswer *b);
 
 int dns_answer_copy_by_key(DnsAnswer **a, DnsAnswer *source, const DnsResourceKey *key, DnsAnswerFlags or_flags, DnsResourceRecord *rrsig);
 int dns_answer_move_by_key(DnsAnswer **to, DnsAnswer **from, const DnsResourceKey *key, DnsAnswerFlags or_flags, DnsResourceRecord *rrsig);
@@ -86,6 +87,8 @@ void dns_answer_dump(DnsAnswer *answer, FILE *f);
 
 void dns_answer_randomize(DnsAnswer *a);
 
+uint32_t dns_answer_min_ttl(DnsAnswer *a);
+
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsAnswer*, dns_answer_unref);
 
 #define _DNS_ANSWER_FOREACH(q, kk, a)                                   \
index 395f983deb7065f0bb4bbf4487a39de4792e2eaa..c019dc38c9dd41cce12713158cd7b4f7c5498b98 100644 (file)
@@ -312,19 +312,23 @@ static DnsCacheItem* dns_cache_get(DnsCache *c, DnsResourceRecord *rr) {
         return NULL;
 }
 
-static usec_t calculate_until(DnsResourceRecord *rr, uint32_t nsec_ttl, usec_t timestamp, bool use_soa_minimum) {
+static usec_t calculate_until(
+                DnsResourceRecord *rr,
+                uint32_t min_ttl,
+                uint32_t nsec_ttl,
+                usec_t timestamp,
+                bool use_soa_minimum) {
+
         uint32_t ttl;
         usec_t u;
 
         assert(rr);
 
-        ttl = MIN(rr->ttl, nsec_ttl);
+        ttl = MIN(min_ttl, nsec_ttl);
         if (rr->key->type == DNS_TYPE_SOA && use_soa_minimum) {
-                /* If this is a SOA RR, and it is requested, clamp to
-                 * the SOA's minimum field. This is used when we do
-                 * negative caching, to determine the TTL for the
-                 * negative caching entry.  See RFC 2308, Section
-                 * 5. */
+                /* If this is a SOA RR, and it is requested, clamp to the SOA's minimum field. This is used
+                 * when we do negative caching, to determine the TTL for the negative caching entry. See RFC
+                 * 2308, Section 5. */
 
                 if (ttl > rr->soa.minimum)
                         ttl = rr->soa.minimum;
@@ -337,8 +341,7 @@ static usec_t calculate_until(DnsResourceRecord *rr, uint32_t nsec_ttl, usec_t t
         if (rr->expiry != USEC_INFINITY) {
                 usec_t left;
 
-                /* Make use of the DNSSEC RRSIG expiry info, if we
-                 * have it */
+                /* Make use of the DNSSEC RRSIG expiry info, if we have it */
 
                 left = LESS_BY(rr->expiry, now(CLOCK_REALTIME));
                 if (u > left)
@@ -354,6 +357,7 @@ static void dns_cache_item_update_positive(
                 DnsResourceRecord *rr,
                 DnsAnswer *answer,
                 DnsPacket *full_packet,
+                uint32_t min_ttl,
                 uint64_t query_flags,
                 bool shared_owner,
                 DnssecResult dnssec_result,
@@ -390,7 +394,7 @@ static void dns_cache_item_update_positive(
         dns_packet_unref(i->full_packet);
         i->full_packet = full_packet;
 
-        i->until = calculate_until(rr, UINT32_MAX, timestamp, false);
+        i->until = calculate_until(rr, min_ttl, UINT32_MAX, timestamp, false);
         i->query_flags = query_flags & CACHEABLE_QUERY_FLAGS;
         i->shared_owner = shared_owner;
         i->dnssec_result = dnssec_result;
@@ -417,9 +421,10 @@ static int dns_cache_put_positive(
                 const union in_addr_union *owner_address) {
 
         _cleanup_(dns_cache_item_freep) DnsCacheItem *i = NULL;
-        DnsCacheItem *existing;
         char key_str[DNS_RESOURCE_KEY_STRING_MAX];
-        int r, k;
+        DnsCacheItem *existing;
+        uint32_t min_ttl;
+        int r;
 
         assert(c);
         assert(rr);
@@ -431,11 +436,16 @@ static int dns_cache_put_positive(
         if (dns_type_is_pseudo(rr->key->type))
                 return 0;
 
+        /* Determine the minimal TTL of all RRs in the answer plus the one by the main RR we are supposed to
+         * cache. Since we cache whole answers to questions we should never return answers where only some
+         * RRs are still valid, hence find the lowest here */
+        min_ttl = MIN(dns_answer_min_ttl(answer), rr->ttl);
+
         /* New TTL is 0? Delete this specific entry... */
-        if (rr->ttl <= 0) {
-                k = dns_cache_remove_by_rr(c, rr);
+        if (min_ttl <= 0) {
+                r = dns_cache_remove_by_rr(c, rr);
                 log_debug("%s: %s",
-                          k > 0 ? "Removed zero TTL entry from cache" : "Not caching zero TTL cache entry",
+                          r > 0 ? "Removed zero TTL entry from cache" : "Not caching zero TTL cache entry",
                           dns_resource_key_to_string(rr->key, key_str, sizeof key_str));
                 return 0;
         }
@@ -449,6 +459,7 @@ static int dns_cache_put_positive(
                                 rr,
                                 answer,
                                 full_packet,
+                                min_ttl,
                                 query_flags,
                                 shared_owner,
                                 dnssec_result,
@@ -476,7 +487,7 @@ static int dns_cache_put_positive(
                 .rr = dns_resource_record_ref(rr),
                 .answer = dns_answer_ref(answer),
                 .full_packet = dns_packet_ref(full_packet),
-                .until = calculate_until(rr, (uint32_t) -1, timestamp, false),
+                .until = calculate_until(rr, min_ttl, UINT32_MAX, timestamp, false),
                 .query_flags = query_flags & CACHEABLE_QUERY_FLAGS,
                 .shared_owner = shared_owner,
                 .dnssec_result = dnssec_result,
@@ -578,9 +589,12 @@ static int dns_cache_put_negative(
                 .full_packet = dns_packet_ref(full_packet),
         };
 
+        /* Determine how long to cache this entry. In case we have some RRs in the answer use the lowest TTL
+         * of any of them. Typically that's the SOA's TTL, which is OK, but could possibly be lower because
+         * of some other RR. Let's better take the lowest option here than a needlessly high one */
         i->until =
                 i->type == DNS_CACHE_RCODE ? timestamp + CACHE_TTL_STRANGE_RCODE_USEC :
-                calculate_until(soa, nsec_ttl, timestamp, true);
+                calculate_until(soa, dns_answer_min_ttl(answer), nsec_ttl, timestamp, true);
 
         if (i->type == DNS_CACHE_NXDOMAIN) {
                 /* NXDOMAIN entries should apply equally to all types, so we use ANY as
@@ -696,7 +710,7 @@ int dns_cache_put(
          * short time.) */
 
         if (IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN)) {
-                if (dns_answer_size(answer) <= 0) {
+                if (dns_answer_isempty(answer)) {
                         if (key) {
                                 char key_str[DNS_RESOURCE_KEY_STRING_MAX];
 
@@ -785,9 +799,8 @@ int dns_cache_put(
         if (r > 0)
                 return 0;
 
-        /* But not if it has a matching CNAME/DNAME (the negative
-         * caching will be done on the canonical name, not on the
-         * alias) */
+        /* But not if it has a matching CNAME/DNAME (the negative caching will be done on the canonical name,
+         * not on the alias) */
         r = dns_answer_find_cname_or_dname(answer, key, NULL, NULL);
         if (r < 0)
                 goto fail;
@@ -803,8 +816,7 @@ int dns_cache_put(
         if (r == 0 && !weird_rcode)
                 return 0;
         if (r > 0) {
-                /* Refuse using the SOA data if it is unsigned, but the key is
-                 * signed */
+                /* Refuse using the SOA data if it is unsigned, but the key is signed */
                 if (FLAGS_SET(query_flags, SD_RESOLVED_AUTHENTICATED) &&
                     (flags & DNS_ANSWER_AUTHENTICATED) == 0)
                         return 0;
@@ -813,7 +825,7 @@ int dns_cache_put(
         if (cache_mode == DNS_CACHE_MODE_NO_NEGATIVE) {
                 char key_str[DNS_RESOURCE_KEY_STRING_MAX];
                 log_debug("Not caching negative entry for: %s, cache mode set to no-negative",
-                        dns_resource_key_to_string(key, key_str, sizeof key_str));
+                          dns_resource_key_to_string(key, key_str, sizeof key_str));
                 return 0;
         }
 
@@ -923,9 +935,18 @@ static int answer_add_clamp_ttl(
         assert(rr);
 
         if (FLAGS_SET(query_flags, SD_RESOLVED_CLAMP_TTL)) {
+                uint32_t left_ttl;
+
+                /* Let's determine how much time is left for this cache entry. Note that we round down, but
+                 * clamp this to be 1s at minimum, since we usually want records to remain cached better too
+                 * short a time than too long a time, but otoh don't want to return 0 ever, since that has
+                 * special semantics in various contexts — in particular in mDNS */
+
+                left_ttl = MAX(1U, LESS_BY(until, current) / USEC_PER_SEC);
+
                 patched = dns_resource_record_ref(rr);
 
-                r = dns_resource_record_clamp_ttl(&patched, LESS_BY(until, current) / USEC_PER_SEC);
+                r = dns_resource_record_clamp_ttl(&patched, left_ttl);
                 if (r < 0)
                         return r;
 
@@ -933,7 +954,7 @@ static int answer_add_clamp_ttl(
 
                 if (rrsig) {
                         patched_rrsig = dns_resource_record_ref(rrsig);
-                        r = dns_resource_record_clamp_ttl(&patched_rrsig, LESS_BY(until, current) / USEC_PER_SEC);
+                        r = dns_resource_record_clamp_ttl(&patched_rrsig, left_ttl);
                         if (r < 0)
                                 return r;
 
@@ -1051,21 +1072,30 @@ int dns_cache_lookup(
                                 DnsAnswerItem *item;
 
                                 DNS_ANSWER_FOREACH_ITEM(item, j->answer) {
-                                        r = answer_add_clamp_ttl(&answer, item->rr, item->ifindex, item->flags, item->rrsig, query_flags, j->until, current);
+                                        r = answer_add_clamp_ttl(
+                                                        &answer,
+                                                        item->rr,
+                                                        item->ifindex,
+                                                        item->flags,
+                                                        item->rrsig,
+                                                        query_flags,
+                                                        j->until,
+                                                        current);
                                         if (r < 0)
                                                 return r;
                                 }
                         }
 
                 } else if (j->rr) {
-                        r = answer_add_clamp_ttl(&answer,
-                                                 j->rr,
-                                                 j->ifindex,
-                                                 FLAGS_SET(j->query_flags, SD_RESOLVED_AUTHENTICATED) ? DNS_ANSWER_AUTHENTICATED : 0,
-                                                 NULL,
-                                                 query_flags,
-                                                 j->until,
-                                                 current);
+                        r = answer_add_clamp_ttl(
+                                        &answer,
+                                        j->rr,
+                                        j->ifindex,
+                                        FLAGS_SET(j->query_flags, SD_RESOLVED_AUTHENTICATED) ? DNS_ANSWER_AUTHENTICATED : 0,
+                                        NULL,
+                                        query_flags,
+                                        j->until,
+                                        current);
                         if (r < 0)
                                 return r;
                 }
index 2f5776b5edae2749e767232490271c5fb33832b4..4b12e483523d3723c47069aa46e1cd0d77ce5671 100644 (file)
@@ -490,7 +490,7 @@ static int dnssec_rrsig_prepare(DnsResourceRecord *rrsig) {
         assert(rrsig->key->type == DNS_TYPE_RRSIG);
 
         /* Check if this RRSIG RR is already prepared */
-        if (rrsig->n_skip_labels_source != (unsigned) -1)
+        if (rrsig->n_skip_labels_source != UINT_MAX)
                 return 0;
 
         if (rrsig->rrsig.inception > rrsig->rrsig.expiration)
@@ -1297,10 +1297,10 @@ static int nsec3_is_good(DnsResourceRecord *rr, DnsResourceRecord *nsec3) {
 
         /* Ignore NSEC3 RRs generated from wildcards. If these NSEC3 RRs weren't correctly signed we can't make this
          * check (since rr->n_skip_labels_source is -1), but that's OK, as we won't trust them anyway in that case. */
-        if (!IN_SET(rr->n_skip_labels_source, 0, (unsigned) -1))
+        if (!IN_SET(rr->n_skip_labels_source, 0, UINT_MAX))
                 return 0;
         /* Ignore NSEC3 RRs that are located anywhere else than one label below the zone */
-        if (!IN_SET(rr->n_skip_labels_signer, 1, (unsigned) -1))
+        if (!IN_SET(rr->n_skip_labels_signer, 1, UINT_MAX))
                 return 0;
 
         if (!nsec3)
index 9778f5ee6b5645b248eb388149b3ed73a86c8a20..8de407d21aed6c243668b7c6e46cb22b23101cf5 100644 (file)
@@ -82,8 +82,8 @@ int dns_packet_new(
                 .rindex = DNS_PACKET_HEADER_SIZE,
                 .allocated = a,
                 .max_size = max_size,
-                .opt_start = (size_t) -1,
-                .opt_size = (size_t) -1,
+                .opt_start = SIZE_MAX,
+                .opt_size = SIZE_MAX,
         };
 
         *ret = p;
@@ -182,8 +182,8 @@ int dns_packet_dup(DnsPacket **ret, DnsPacket *p) {
                 .rindex = DNS_PACKET_HEADER_SIZE,
                 .allocated = p->size,
                 .max_size = p->max_size,
-                .opt_start = (size_t) -1,
-                .opt_size = (size_t) -1,
+                .opt_start = SIZE_MAX,
+                .opt_size = SIZE_MAX,
         };
 
         memcpy(DNS_PACKET_DATA(c), DNS_PACKET_DATA(p), p->size);
@@ -736,10 +736,10 @@ int dns_packet_append_opt(
         assert(rcode >= 0);
         assert(rcode <= _DNS_RCODE_MAX);
 
-        if (p->opt_start != (size_t) -1)
+        if (p->opt_start != SIZE_MAX)
                 return -EBUSY;
 
-        assert(p->opt_size == (size_t) -1);
+        assert(p->opt_size == SIZE_MAX);
 
         saved_size = p->size;
 
@@ -851,12 +851,12 @@ fail:
 int dns_packet_truncate_opt(DnsPacket *p) {
         assert(p);
 
-        if (p->opt_start == (size_t) -1) {
-                assert(p->opt_size == (size_t) -1);
+        if (p->opt_start == SIZE_MAX) {
+                assert(p->opt_size == SIZE_MAX);
                 return 0;
         }
 
-        assert(p->opt_size != (size_t) -1);
+        assert(p->opt_size != SIZE_MAX);
         assert(DNS_PACKET_ARCOUNT(p) > 0);
 
         if (p->opt_start + p->opt_size != p->size)
@@ -864,7 +864,7 @@ int dns_packet_truncate_opt(DnsPacket *p) {
 
         dns_packet_truncate(p, p->opt_start);
         DNS_PACKET_HEADER(p)->arcount = htobe16(DNS_PACKET_ARCOUNT(p) - 1);
-        p->opt_start = p->opt_size = (size_t) -1;
+        p->opt_start = p->opt_size = SIZE_MAX;
 
         return 1;
 }
@@ -2271,7 +2271,7 @@ static int dns_packet_extract_answer(DnsPacket *p, DnsAnswer **ret_answer) {
                 bool cache_flush = false;
                 size_t start;
 
-                if (p->rindex == p->size) {
+                if (p->rindex == p->size && p->opt) {
                         /* If we reached the end of the packet already, but there are still more RRs
                          * declared, then that's a corrupt packet. Let's accept the packet anyway, since it's
                          * apparently a common bug in routers. Let's however suppress OPT support in this
@@ -2458,10 +2458,10 @@ int dns_packet_patch_max_udp_size(DnsPacket *p, uint16_t max_udp_size) {
         assert(p);
         assert(max_udp_size >= DNS_PACKET_UNICAST_SIZE_MAX);
 
-        if (p->opt_start == (size_t) -1) /* No OPT section, nothing to patch */
+        if (p->opt_start == SIZE_MAX) /* No OPT section, nothing to patch */
                 return 0;
 
-        assert(p->opt_size != (size_t) -1);
+        assert(p->opt_size != SIZE_MAX);
         assert(p->opt_size >= 5);
 
         unaligned_write_be16(DNS_PACKET_DATA(p) + p->opt_start + 3, max_udp_size);
index 7554d1e82f41baf12f2768fa4e873dfd389be35d..e960ac0322730b062d301c11e641c42ea84b952a 100644 (file)
@@ -10,7 +10,6 @@
 #include "resolved-etc-hosts.h"
 #include "string-util.h"
 
-#define CNAME_MAX 8
 #define QUERIES_MAX 2048
 #define AUXILIARY_QUERIES_MAX 64
 
@@ -434,6 +433,14 @@ int dns_query_new(
         } else {
                 bool good = false;
 
+                /* This (primarily) checks two things:
+                 *
+                 * 1. That the question is not empty
+                 * 2. That all RR keys in the question objects are for the same domain
+                 *
+                 * Or in other words, a single DnsQuery object may be used to look up A+AAAA combination for
+                 * the same domain name, or SRV+TXT (for DNS-SD services), but not for unrelated lookups. */
+
                 if (dns_question_size(question_utf8) > 0) {
                         r = dns_question_is_valid_for_query(question_utf8);
                         if (r < 0)
@@ -977,18 +984,18 @@ static int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname)
         assert(q);
 
         q->n_cname_redirects++;
-        if (q->n_cname_redirects > CNAME_MAX)
+        if (q->n_cname_redirects > CNAME_REDIRECT_MAX)
                 return -ELOOP;
 
         r = dns_question_cname_redirect(q->question_idna, cname, &nq_idna);
         if (r < 0)
                 return r;
-        else if (r > 0)
+        if (r > 0)
                 log_debug("Following CNAME/DNAME %s → %s.", dns_question_first_name(q->question_idna), dns_question_first_name(nq_idna));
 
         k = dns_question_is_equal(q->question_idna, q->question_utf8);
         if (k < 0)
-                return r;
+                return k;
         if (k > 0) {
                 /* Same question? Shortcut new question generation */
                 nq_utf8 = dns_question_ref(nq_idna);
@@ -997,7 +1004,7 @@ static int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname)
                 k = dns_question_cname_redirect(q->question_utf8, cname, &nq_utf8);
                 if (k < 0)
                         return k;
-                else if (k > 0)
+                if (k > 0)
                         log_debug("Following UTF8 CNAME/DNAME %s → %s.", dns_question_first_name(q->question_utf8), dns_question_first_name(nq_utf8));
         }
 
@@ -1020,33 +1027,84 @@ static int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname)
         q->question_utf8 = TAKE_PTR(nq_utf8);
 
         dns_query_unref_candidates(q);
-        dns_query_reset_answer(q);
+
+        /* Note that we do *not* reset the answer here, because the answer we previously got might already
+         * include everything we need, let's check that first */
 
         q->state = DNS_TRANSACTION_NULL;
 
         return 0;
 }
 
-int dns_query_process_cname(DnsQuery *q) {
+int dns_query_process_cname_one(DnsQuery *q) {
         _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *cname = NULL;
         DnsQuestion *question;
         DnsResourceRecord *rr;
+        bool full_match = true;
+        DnsResourceKey *k;
         int r;
 
         assert(q);
 
+        /* Processes a CNAME redirect if there's one. Returns one of three values:
+         *
+         * CNAME_QUERY_MATCH   → direct RR match, caller should just use the RRs in this answer (and not
+         *                       bother with any CNAME/DNAME stuff)
+         *
+         * CNAME_QUERY_NOMATCH → no match at all, neither direct nor CNAME/DNAME, caller might decide to
+         *                       restart query or take things as NODATA reply.
+         *
+         * CNAME_QUERY_CNAME   → no direct RR match, but a CNAME/DNAME match that we now followed for one step.
+         *
+         * The function might also return a failure, in particular -ELOOP if we encountered too many
+         * CNAMEs/DNAMEs in a chain or if following CNAMEs/DNAMEs was turned off.
+         *
+         * Note that this function doesn't actually restart the query. The caller can decide to do that in
+         * case of CNAME_QUERY_CNAME, though. */
+
         if (!IN_SET(q->state, DNS_TRANSACTION_SUCCESS, DNS_TRANSACTION_NULL))
                 return DNS_QUERY_NOMATCH;
 
         question = dns_query_question_for_protocol(q, q->answer_protocol);
 
-        DNS_ANSWER_FOREACH(rr, q->answer) {
-                r = dns_question_matches_rr(question, rr, DNS_SEARCH_DOMAIN_NAME(q->answer_search_domain));
-                if (r < 0)
-                        return r;
-                if (r > 0)
-                        return DNS_QUERY_MATCH; /* The answer matches directly, no need to follow cnames */
+        /* Small reminder: our question will consist of one or more RR keys that match in name, but not in
+         * record type. Specifically, when we do an address lookup the question will typically consist of one
+         * A and one AAAA key lookup for the same domain name. When we get a response from a server we need
+         * to check if the answer answers all our questions to use it. Note that a response of CNAME/DNAME
+         * can answer both an A and the AAAA question for us, but an A/AAAA response only the relevant
+         * type.
+         *
+         * Hence we first check of the answers we collected are sufficient to answer all our questions
+         * directly. If one question wasn't answered we go on, waiting for more replies. However, if there's
+         * a CNAME/DNAME response we use it, and redirect to it, regardless if it was a response to the A or
+         * the AAAA query.*/
+
+        DNS_QUESTION_FOREACH(k, question) {
+                bool match = false;
+
+                DNS_ANSWER_FOREACH(rr, q->answer) {
+                        r = dns_resource_key_match_rr(k, rr, DNS_SEARCH_DOMAIN_NAME(q->answer_search_domain));
+                        if (r < 0)
+                                return r;
+                        if (r > 0) {
+                                match = true; /* Yay, we found an RR that matches the key we are looking for */
+                                break;
+                        }
+                }
+
+                if (!match) {
+                        /* Hmm. :-( there's no response for this key. This doesn't match. */
+                        full_match = false;
+                        break;
+                }
+        }
+
+        if (full_match)
+                return DNS_QUERY_MATCH; /* The answer can answer our question in full, no need to follow CNAMEs/DNAMEs */
 
+        /* Let's see if there is a CNAME/DNAME to match. This case is simpler: we accept the CNAME/DNAME that
+         * matches any of our questions. */
+        DNS_ANSWER_FOREACH(rr, q->answer) {
                 r = dns_question_matches_cname_or_dname(question, rr, DNS_SEARCH_DOMAIN_NAME(q->answer_search_domain));
                 if (r < 0)
                         return r;
@@ -1055,7 +1113,7 @@ int dns_query_process_cname(DnsQuery *q) {
         }
 
         if (!cname)
-                return DNS_QUERY_NOMATCH; /* No match and no cname to follow */
+                return DNS_QUERY_NOMATCH; /* No match and no CNAME/DNAME to follow */
 
         if (q->flags & SD_RESOLVED_NO_CNAME)
                 return -ELOOP;
@@ -1064,24 +1122,71 @@ int dns_query_process_cname(DnsQuery *q) {
                 q->previous_redirect_unauthenticated = true;
         if (!FLAGS_SET(q->answer_query_flags, SD_RESOLVED_CONFIDENTIAL))
                 q->previous_redirect_non_confidential = true;
+        if (!FLAGS_SET(q->answer_query_flags, SD_RESOLVED_SYNTHETIC))
+                q->previous_redirect_non_synthetic = true;
 
         /* OK, let's actually follow the CNAME */
         r = dns_query_cname_redirect(q, cname);
         if (r < 0)
                 return r;
 
-        /* Let's see if the answer can already answer the new
-         * redirected question */
-        r = dns_query_process_cname(q);
-        if (r != DNS_QUERY_NOMATCH)
-                return r;
+        return DNS_QUERY_CNAME; /* Tell caller that we did a single CNAME/DNAME redirection step */
+}
 
-        /* OK, it cannot, let's begin with the new query */
-        r = dns_query_go(q);
-        if (r < 0)
-                return r;
+int dns_query_process_cname_many(DnsQuery *q) {
+        int r;
+
+        assert(q);
+
+        /* Follows CNAMEs through the current packet: as long as the current packet can fulfill our
+         * redirected CNAME queries we keep going, and restart the query once the current packet isn't good
+         * enough anymore. It's a wrapper around dns_query_process_cname_one() and returns the same values,
+         * but with extended semantics. Specifically:
+         *
+         * DNS_QUERY_MATCH   → as above
+         *
+         * DNS_QUERY_CNAME   → we ran into a CNAME/DNAME redirect that we could not answer from the current
+         *                     message, and thus restarted the query to resolve it.
+         *
+         * DNS_QUERY_NOMATCH → we reached the end of CNAME/DNAME chain, and there are no direct matches nor a
+         *                     CNAME/DNAME match. i.e. this is a NODATA case.
+         *
+         * Note that this function will restart the query for the caller if needed, and that's the case
+         * DNS_QUERY_CNAME is returned.
+         */
+
+        r = dns_query_process_cname_one(q);
+        if (r != DNS_QUERY_CNAME)
+                return r; /* The first redirect is special: if it doesn't answer the question that's no
+                           * reason to restart the query, we just accept this as a NODATA answer. */
 
-        return DNS_QUERY_RESTARTED; /* We restarted the query for a new cname */
+        for (;;) {
+                r = dns_query_process_cname_one(q);
+                if (r < 0 || r == DNS_QUERY_MATCH)
+                        return r;
+                if (r == DNS_QUERY_NOMATCH) {
+                        /* OK, so we followed one or more CNAME/DNAME RR but the existing packet can't answer
+                         * this. Let's restart the query hence, with the new question. Why the different
+                         * handling than the first chain element? Because if the server answers a direct
+                         * question with an empty answer then this is a NODATA response. But if it responds
+                         * with a CNAME chain that ultimately is incomplete (i.e. a non-empty but truncated
+                         * CNAME chain) then we better follow up ourselves and ask for the rest of the
+                         * chain. This is particular relevant since our cache will store CNAME/DNAME
+                         * redirects that we learnt about for lookups of certain DNS types, but later on we
+                         * can reuse this data even for other DNS types, but in that case need to follow up
+                         * with the final lookup of the chain ourselves with the RR type we ourselves are
+                         * interested in. */
+                        r = dns_query_go(q);
+                        if (r < 0)
+                                return r;
+
+                        return DNS_QUERY_CNAME;
+                }
+
+                /* So we found a CNAME that the existing packet already answers, again via a CNAME, let's
+                 * continue going then. */
+                assert(r == DNS_QUERY_CNAME);
+        }
 }
 
 DnsQuestion* dns_query_question_for_protocol(DnsQuery *q, DnsProtocol protocol) {
@@ -1141,9 +1246,17 @@ bool dns_query_fully_confidential(DnsQuery *q) {
         return FLAGS_SET(q->answer_query_flags, SD_RESOLVED_CONFIDENTIAL) && !q->previous_redirect_non_confidential;
 }
 
-bool dns_query_fully_synthetic(DnsQuery *q) {
+bool dns_query_fully_authoritative(DnsQuery *q) {
         assert(q);
 
-        return (q->answer_query_flags & (SD_RESOLVED_SYNTHETIC | SD_RESOLVED_FROM_TRUST_ANCHOR)) &&
-                !(q->answer_query_flags & SD_RESOLVED_FROM_MASK & ~SD_RESOLVED_FROM_TRUST_ANCHOR);
+        /* We are authoritative for everything synthetic (except if a previous CNAME/DNAME) wasn't
+         * synthetic. (Note: SD_RESOLVED_SYNTHETIC is reset on each CNAME/DNAME, hence the explicit check for
+         * previous synthetic DNAME/CNAME redirections.)*/
+        if ((q->answer_query_flags & SD_RESOLVED_SYNTHETIC) && !q->previous_redirect_non_synthetic)
+                return true;
+
+        /* We are also authoritative for everything coming only from the trust anchor and the local
+         * zones. (Note: the SD_RESOLVED_FROM_xyz flags we merge on each redirect, hence no need to
+         * explicitly check previous redirects here.)*/
+        return (q->answer_query_flags & SD_RESOLVED_FROM_MASK & ~(SD_RESOLVED_FROM_TRUST_ANCHOR | SD_RESOLVED_FROM_ZONE)) == 0;
 }
index ea296167b61e7a267d0aa3e7cc3a877e7c52d69e..fa584fe3de9d884853d3564042476bc1614246fb 100644 (file)
@@ -45,7 +45,14 @@ struct DnsQuery {
          * that even on classic DNS some labels might use UTF8 encoding. Specifically, DNS-SD service names
          * (in contrast to their domain suffixes) use UTF-8 encoding even on DNS. Thus, the difference
          * between these two fields is mostly relevant only for explicit *hostname* lookups as well as the
-         * domain suffixes of service lookups. */
+         * domain suffixes of service lookups.
+         *
+         * Note that questions may consist of multiple RR keys at once, but they must be for the same domain
+         * name. This is used for A+AAAA and TXT+SRV lookups: we'll allocate a single DnsQuery object for
+         * them instead of two separate ones. That allows us minor optimizations with response handling:
+         * CNAME/DNAMEs of the first reply we get can already be used to follow the CNAME/DNAME chain for
+         * both, and we can take benefit of server replies that oftentimes put A responses into AAAA queries
+         * and vice versa (in the additional section). */
         DnsQuestion *question_idna;
         DnsQuestion *question_utf8;
 
@@ -73,6 +80,7 @@ struct DnsQuery {
         int answer_errno; /* if state is DNS_TRANSACTION_ERRNO */
         bool previous_redirect_unauthenticated;
         bool previous_redirect_non_confidential;
+        bool previous_redirect_non_synthetic;
         DnsPacket *answer_full_packet;
 
         /* Bus + Varlink client information */
@@ -105,7 +113,7 @@ struct DnsQuery {
 enum {
         DNS_QUERY_MATCH,
         DNS_QUERY_NOMATCH,
-        DNS_QUERY_RESTARTED,
+        DNS_QUERY_CNAME,
 };
 
 DnsQueryCandidate* dns_query_candidate_ref(DnsQueryCandidate*);
@@ -122,7 +130,8 @@ int dns_query_make_auxiliary(DnsQuery *q, DnsQuery *auxiliary_for);
 int dns_query_go(DnsQuery *q);
 void dns_query_ready(DnsQuery *q);
 
-int dns_query_process_cname(DnsQuery *q);
+int dns_query_process_cname_one(DnsQuery *q);
+int dns_query_process_cname_many(DnsQuery *q);
 
 void dns_query_complete(DnsQuery *q, DnsTransactionState state);
 
@@ -134,7 +143,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuery*, dns_query_free);
 
 bool dns_query_fully_authenticated(DnsQuery *q);
 bool dns_query_fully_confidential(DnsQuery *q);
-bool dns_query_fully_synthetic(DnsQuery *q);
+bool dns_query_fully_authoritative(DnsQuery *q);
 
 static inline uint64_t dns_query_reply_flags_make(DnsQuery *q) {
         assert(q);
@@ -145,3 +154,5 @@ static inline uint64_t dns_query_reply_flags_make(DnsQuery *q) {
                                       dns_query_fully_confidential(q)) |
                 (q->answer_query_flags & (SD_RESOLVED_FROM_MASK|SD_RESOLVED_SYNTHETIC));
 }
+
+#define CNAME_REDIRECT_MAX 16
index 047170899db0167d5725b043eaaa1ff947453908..ef40932630407471787b1f5d27802f6a1ad37b73 100644 (file)
@@ -445,3 +445,21 @@ int dns_question_new_service(
 
         return 0;
 }
+
+/*
+ * This function is not used in the code base, but is useful when debugging. Do not delete.
+ */
+void dns_question_dump(DnsQuestion *question, FILE *f) {
+        DnsResourceKey *k;
+
+        if (!f)
+                f = stdout;
+
+        DNS_QUESTION_FOREACH(k, question) {
+                char buf[DNS_RESOURCE_KEY_STRING_MAX];
+
+                fputc('\t', f);
+                fputs(dns_resource_key_to_string(k, buf, sizeof(buf)), f);
+                fputc('\n', f);
+        }
+}
index a6444b0baf9cd629dd556920f497f9a2c5279c9e..8f9a84c82d936d6e088a118febfddca6a4121f04 100644 (file)
@@ -33,6 +33,8 @@ int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b);
 
 int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret);
 
+void dns_question_dump(DnsQuestion *q, FILE *f);
+
 const char *dns_question_first_name(DnsQuestion *q);
 
 static inline size_t dns_question_size(DnsQuestion *q) {
index 9b94ab59eabbae6b32bd9a497d4e4d336b403c9b..5b0e601e97a8b236795319cc3530b11a89fbabc9 100644 (file)
@@ -118,7 +118,7 @@ DnsResourceKey* dns_resource_key_ref(DnsResourceKey *k) {
 
         /* Static/const keys created with DNS_RESOURCE_KEY_CONST will
          * set this to -1, they should not be reffed/unreffed */
-        assert(k->n_ref != (unsigned) -1);
+        assert(k->n_ref != UINT_MAX);
 
         assert(k->n_ref > 0);
         k->n_ref++;
@@ -130,7 +130,7 @@ DnsResourceKey* dns_resource_key_unref(DnsResourceKey *k) {
         if (!k)
                 return NULL;
 
-        assert(k->n_ref != (unsigned) -1);
+        assert(k->n_ref != UINT_MAX);
         assert(k->n_ref > 0);
 
         if (k->n_ref == 1) {
@@ -244,6 +244,9 @@ int dns_resource_key_match_cname_or_dname(const DnsResourceKey *key, const DnsRe
         if (cname->class != key->class && key->class != DNS_CLASS_ANY)
                 return 0;
 
+        if (!dns_type_may_redirect(key->type))
+                return 0;
+
         if (cname->type == DNS_TYPE_CNAME)
                 r = dns_name_equal(dns_resource_key_name(key), dns_resource_key_name(cname));
         else if (cname->type == DNS_TYPE_DNAME)
@@ -342,9 +345,9 @@ bool dns_resource_key_reduce(DnsResourceKey **a, DnsResourceKey **b) {
                 return false;
 
         /* We refuse merging const keys */
-        if ((*a)->n_ref == (unsigned) -1)
+        if ((*a)->n_ref == UINT_MAX)
                 return false;
-        if ((*b)->n_ref == (unsigned) -1)
+        if ((*b)->n_ref == UINT_MAX)
                 return false;
 
         /* Already the same? */
@@ -378,8 +381,8 @@ DnsResourceRecord* dns_resource_record_new(DnsResourceKey *key) {
                 .n_ref = 1,
                 .key = dns_resource_key_ref(key),
                 .expiry = USEC_INFINITY,
-                .n_skip_labels_signer = (unsigned) -1,
-                .n_skip_labels_source = (unsigned) -1,
+                .n_skip_labels_signer = UINT_MAX,
+                .n_skip_labels_source = UINT_MAX,
         };
 
         return rr;
@@ -817,8 +820,8 @@ static char *format_txt(DnsTxtItem *first) {
 }
 
 const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
-        _cleanup_free_ char *t = NULL;
-        char *s, k[DNS_RESOURCE_KEY_STRING_MAX];
+        _cleanup_free_ char *s = NULL, *t = NULL;
+        char k[DNS_RESOURCE_KEY_STRING_MAX];
         int r;
 
         assert(rr);
@@ -868,18 +871,15 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                         return NULL;
                 break;
 
-        case DNS_TYPE_A: {
-                _cleanup_free_ char *x = NULL;
-
-                r = in_addr_to_string(AF_INET, (const union in_addr_union*) &rr->a.in_addr, &x);
+        case DNS_TYPE_A:
+                r = in_addr_to_string(AF_INET, (const union in_addr_union*) &rr->a.in_addr, &t);
                 if (r < 0)
                         return NULL;
 
-                s = strjoin(k, " ", x);
+                s = strjoin(k, " ", t);
                 if (!s)
                         return NULL;
                 break;
-        }
 
         case DNS_TYPE_AAAA:
                 r = in_addr_to_string(AF_INET6, (const union in_addr_union*) &rr->aaaa.in6_addr, &t);
@@ -962,7 +962,6 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
 
         case DNS_TYPE_DNSKEY: {
                 _cleanup_free_ char *alg = NULL;
-                char *ss;
                 uint16_t key_tag;
 
                 key_tag = dnssec_keytag(rr, true);
@@ -971,7 +970,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (r < 0)
                         return NULL;
 
-                r = asprintf(&s, "%s %u %u %s",
+                r = asprintf(&t, "%s %u %u %s",
                              k,
                              rr->dnskey.flags,
                              rr->dnskey.protocol,
@@ -979,24 +978,22 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (r < 0)
                         return NULL;
 
-                r = base64_append(&s, r,
+                r = base64_append(&t, r,
                                   rr->dnskey.key, rr->dnskey.key_size,
                                   8, columns());
                 if (r < 0)
                         return NULL;
 
-                r = asprintf(&ss, "%s\n"
+                r = asprintf(&s, "%s\n"
                              "        -- Flags:%s%s%s\n"
                              "        -- Key tag: %u",
-                             s,
+                             t,
                              rr->dnskey.flags & DNSKEY_FLAG_SEP ? " SEP" : "",
                              rr->dnskey.flags & DNSKEY_FLAG_REVOKE ? " REVOKE" : "",
                              rr->dnskey.flags & DNSKEY_FLAG_ZONE_KEY ? " ZONE_KEY" : "",
                              key_tag);
                 if (r < 0)
                         return NULL;
-                free(s);
-                s = ss;
 
                 break;
         }
@@ -1120,18 +1117,16 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 break;
         }
 
-        case DNS_TYPE_CAA: {
-                _cleanup_free_ char *value;
-
-                value = octescape(rr->caa.value, rr->caa.value_size);
-                if (!value)
+        case DNS_TYPE_CAA:
+                t = octescape(rr->caa.value, rr->caa.value_size);
+                if (!t)
                         return NULL;
 
                 r = asprintf(&s, "%s %u %s \"%s\"%s%s%s%.0u",
                              k,
                              rr->caa.flags,
                              rr->caa.tag,
-                             value,
+                             t,
                              rr->caa.flags ? "\n        -- Flags:" : "",
                              rr->caa.flags & CAA_FLAG_CRITICAL ? " critical" : "",
                              rr->caa.flags & ~CAA_FLAG_CRITICAL ? " " : "",
@@ -1140,9 +1135,8 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                         return NULL;
 
                 break;
-        }
 
-        case DNS_TYPE_OPENPGPKEY: {
+        case DNS_TYPE_OPENPGPKEY:
                 r = asprintf(&s, "%s", k);
                 if (r < 0)
                         return NULL;
@@ -1153,7 +1147,6 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (r < 0)
                         return NULL;
                 break;
-        }
 
         default:
                 t = hexmem(rr->generic.data, rr->generic.data_size);
@@ -1168,7 +1161,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
         }
 
         rr->to_string = s;
-        return s;
+        return TAKE_PTR(s);
 }
 
 ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out) {
@@ -1265,7 +1258,7 @@ int dns_resource_record_signer(DnsResourceRecord *rr, const char **ret) {
 
         /* Returns the RRset's signer, if it is known. */
 
-        if (rr->n_skip_labels_signer == (unsigned) -1)
+        if (rr->n_skip_labels_signer == UINT_MAX)
                 return -ENODATA;
 
         n = dns_resource_key_name(rr->key);
@@ -1288,7 +1281,7 @@ int dns_resource_record_source(DnsResourceRecord *rr, const char **ret) {
 
         /* Returns the RRset's synthesizing source, if it is known. */
 
-        if (rr->n_skip_labels_source == (unsigned) -1)
+        if (rr->n_skip_labels_source == UINT_MAX)
                 return -ENODATA;
 
         n = dns_resource_key_name(rr->key);
@@ -1322,7 +1315,7 @@ int dns_resource_record_is_synthetic(DnsResourceRecord *rr) {
 
         /* Returns > 0 if the RR is generated from a wildcard, and is not the asterisk name itself */
 
-        if (rr->n_skip_labels_source == (unsigned) -1)
+        if (rr->n_skip_labels_source == UINT_MAX)
                 return -ENODATA;
 
         if (rr->n_skip_labels_source == 0)
@@ -1743,9 +1736,16 @@ int dns_resource_record_get_cname_target(DnsResourceKey *key, DnsResourceRecord
         assert(key);
         assert(cname);
 
+        /* Checks if the RR `cname` is a CNAME/DNAME RR that matches the specified `key`. If so, returns the
+         * target domain. If not, returns -EUNATCH */
+
         if (key->class != cname->key->class && key->class != DNS_CLASS_ANY)
                 return -EUNATCH;
 
+        if (!dns_type_may_redirect(key->type)) /* This key type is not subject to CNAME/DNAME redirection?
+                                                * Then let's refuse right-away */
+                return -EUNATCH;
+
         if (cname->key->type == DNS_TYPE_CNAME) {
                 r = dns_name_equal(dns_resource_key_name(key),
                                    dns_resource_key_name(cname->key));
index d3edcadf675384f8ed5fdf349f0ecbe00d772648..ab48ea5f2a091297168491c236adad1b68f9404b 100644 (file)
@@ -76,7 +76,7 @@ struct DnsResourceKey {
  * resource key object. */
 #define DNS_RESOURCE_KEY_CONST(c, t, n)                 \
         ((DnsResourceKey) {                             \
-                .n_ref = (unsigned) -1,                 \
+                .n_ref = UINT_MAX,                      \
                 .class = c,                             \
                 .type = t,                              \
                 ._name = (char*) n,                     \
index 82481563546365e6ae7f8d182d3285607081025b..073489acae03ae0dc4e88ae7a59b81c8c9b83119 100644 (file)
@@ -867,10 +867,11 @@ DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
         if (m->current_dns_server == s)
                 return s;
 
+        /* Let's log about the server switch, at debug level. Except if we switch from a non-fallback server
+         * to a fallback server or back, since that is noteworthy and possibly a configuration issue */
         if (s)
-                log_debug("Switching to %s DNS server %s.",
-                          dns_server_type_to_string(s->type),
-                          strna(dns_server_string_full(s)));
+                log_full((s->type == DNS_SERVER_FALLBACK) != (m->current_dns_server && m->current_dns_server->type == DNS_SERVER_FALLBACK) ? LOG_NOTICE : LOG_DEBUG,
+                         "Switching to %s DNS server %s.", dns_server_type_to_string(s->type), strna(dns_server_string_full(s)));
 
         dns_server_unref(m->current_dns_server);
         m->current_dns_server = dns_server_ref(s);
index c2734e57b9bcb66af3eef4353e0527ac70842850..602720bf505d6decee5845c2b9953e9cf3076e45 100644 (file)
@@ -161,7 +161,6 @@ static int dns_stub_collect_answer_by_question(
                 DnsQuestion *question,
                 bool with_rrsig) { /* Add RRSIG RR matching each RR */
 
-        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *redirected_key = NULL;
         DnsAnswerItem *item;
         int r;
 
@@ -170,61 +169,22 @@ static int dns_stub_collect_answer_by_question(
         /* Copies all RRs from 'answer' into 'reply', if they match 'question'. */
 
         DNS_ANSWER_FOREACH_ITEM(item, answer) {
-                if (question) {
-                        r = dns_question_matches_rr(question, item->rr, NULL);
-                        if (r < 0)
-                                return r;
-                        if (r == 0) {
-                                _cleanup_free_ char *target = NULL;
-
-                                /* OK, so the RR doesn't directly match. Let's see if the RR is a matching
-                                 * CNAME or DNAME */
-
-                                r = dns_resource_record_get_cname_target(
-                                                question->keys[0],
-                                                item->rr,
-                                                &target);
-                                if (r == -EUNATCH)
-                                        continue; /* Not a CNAME/DNAME or doesn't match */
-                                if (r < 0)
-                                        return r;
-
-                                dns_resource_key_unref(redirected_key);
-
-                                /* There can only be one CNAME per name, hence no point in storing more than one here */
-                                redirected_key = dns_resource_key_new(question->keys[0]->class, question->keys[0]->type, target);
-                                if (!redirected_key)
-                                        return -ENOMEM;
-                        }
-                }
-
-                /* Mask the section info, we want the primary answers to always go without section info, so
-                 * that it is added to the answer section when we synthesize a reply. */
 
-                r = reply_add_with_rrsig(
-                                reply,
-                                item->rr,
-                                item->ifindex,
-                                item->flags & ~DNS_ANSWER_MASK_SECTIONS,
-                                item->rrsig,
-                                with_rrsig);
+                /* We have a question, let's see if this RR matches it */
+                r = dns_question_matches_rr(question, item->rr, NULL);
                 if (r < 0)
                         return r;
-        }
-
-        if (!redirected_key)
-                return 0;
-
-        /* This is a CNAME/DNAME answer. In this case also append where the redirections point to to the main
-         * answer section */
-
-        DNS_ANSWER_FOREACH_ITEM(item, answer) {
+                if (!r) {
+                        /* Maybe there's a CNAME/DNAME in here? If so, that's an answer too */
+                        r = dns_question_matches_cname_or_dname(question, item->rr, NULL);
+                        if (r < 0)
+                                return r;
+                        if (!r)
+                                continue;
+                }
 
-                r = dns_resource_key_match_rr(redirected_key, item->rr, NULL);
-                if (r < 0)
-                        return r;
-                if (r == 0)
-                        continue;
+                /* Mask the section info, we want the primary answers to always go without section
+                 * info, so that it is added to the answer section when we synthesize a reply. */
 
                 r = reply_add_with_rrsig(
                                 reply,
@@ -266,7 +226,7 @@ static int dns_stub_collect_answer_by_section(
                     dns_type_is_dnssec(item->rr->key->type))
                         continue;
 
-                if (((item->flags ^ section) & (DNS_ANSWER_SECTION_ANSWER|DNS_ANSWER_SECTION_AUTHORITY|DNS_ANSWER_SECTION_ADDITIONAL)) != 0)
+                if (((item->flags ^ section) & DNS_ANSWER_MASK_SECTIONS) != 0)
                         continue;
 
                 r = reply_add_with_rrsig(
@@ -314,27 +274,27 @@ static int dns_stub_assign_sections(
         if (r < 0)
                 return r;
 
-        /* Include all RRs that originate from the answer or authority sections, and aren't listed in the
+        /* Include all RRs that originate from the authority sections, and aren't already listed in the
          * answer section, in the authority section */
         r = dns_stub_collect_answer_by_section(
                         &q->reply_authoritative,
                         q->answer,
-                        DNS_ANSWER_SECTION_ANSWER,
+                        DNS_ANSWER_SECTION_AUTHORITY,
                         q->reply_answer, NULL,
                         edns0_do);
         if (r < 0)
                 return r;
+
+        /* Include all RRs that originate from the answer or additional sections in the additional section
+         * (except if already listed in the other two sections). Also add all RRs with no section marking. */
         r = dns_stub_collect_answer_by_section(
-                        &q->reply_authoritative,
+                        &q->reply_additional,
                         q->answer,
-                        DNS_ANSWER_SECTION_AUTHORITY,
-                        q->reply_answer, NULL,
+                        DNS_ANSWER_SECTION_ANSWER,
+                        q->reply_answer, q->reply_authoritative,
                         edns0_do);
         if (r < 0)
                 return r;
-
-        /* Include all RRs that originate from the additional sections in the additional section (except if
-         * already listed in the other two sections). Also add all RRs with no section marking. */
         r = dns_stub_collect_answer_by_section(
                         &q->reply_additional,
                         q->answer,
@@ -552,6 +512,37 @@ static int dns_stub_send(
         return 0;
 }
 
+static int dns_stub_reply_with_edns0_do(DnsQuery *q) {
+         assert(q);
+
+        /* Reply with DNSSEC DO set? Only if client supports it; and we did any DNSSEC verification
+         * ourselves, or consider the data fully authenticated because we generated it locally, or the client
+         * set cd */
+
+         return DNS_PACKET_DO(q->request_packet) &&
+                 (q->answer_dnssec_result >= 0 ||        /* we did proper DNSSEC validation … */
+                  dns_query_fully_authenticated(q) ||    /* … or we considered it authentic otherwise … */
+                  DNS_PACKET_CD(q->request_packet));     /* … or client set CD */
+}
+
+static void dns_stub_suppress_duplicate_section_rrs(DnsQuery *q) {
+        /* If we follow a CNAME/DNAME chain we might end up populating our sections with redundant RRs
+         * because we built up the sections from multiple reply packets (one from each CNAME/DNAME chain
+         * element). E.g. it could be that an RR that was included in the first reply's additional section
+         * ends up being relevant as main answer in a subsequent reply in the chain. Let's clean this up, and
+         * remove everything in the "higher priority" sections from the "lower priority" sections.
+         *
+         * Note that this removal matches by RR keys instead of the full RRs. This is because RRsets should
+         * always end up in one section fully or not at all, but never be split among sections.
+         *
+         * Specifically: we remove ANSWER section RRs from the AUTHORITATIVE and ADDITIONAL sections, as well
+         * as AUTHORITATIVE section RRs from the ADDITIONAL section. */
+
+        dns_answer_remove_by_answer_keys(&q->reply_authoritative, q->reply_answer);
+        dns_answer_remove_by_answer_keys(&q->reply_additional, q->reply_answer);
+        dns_answer_remove_by_answer_keys(&q->reply_additional, q->reply_authoritative);
+}
+
 static int dns_stub_send_reply(
                 DnsQuery *q,
                 int rcode) {
@@ -562,21 +553,7 @@ static int dns_stub_send_reply(
 
         assert(q);
 
-        /* Reply with DNSSEC DO set? Only if client supports it; and we did any DNSSEC verification
-         * ourselves, or consider the data fully authenticated because we generated it locally, or
-         * the client set cd */
-        edns0_do =
-                DNS_PACKET_DO(q->request_packet) &&
-                (q->answer_dnssec_result >= 0 ||        /* we did proper DNSSEC validation … */
-                 dns_query_fully_authenticated(q) ||    /* … or we considered it authentic otherwise … */
-                 DNS_PACKET_CD(q->request_packet));     /* … or client set CD */
-
-        r = dns_stub_assign_sections(
-                        q,
-                        q->request_packet->question,
-                        edns0_do);
-        if (r < 0)
-                return log_debug_errno(r, "Failed to assign sections: %m");
+        edns0_do = dns_stub_reply_with_edns0_do(q); /* let's check if we shall reply with EDNS0 DO? */
 
         r = dns_stub_make_reply_packet(
                         &reply,
@@ -586,6 +563,8 @@ static int dns_stub_send_reply(
         if (r < 0)
                 return log_debug_errno(r, "Failed to build reply packet: %m");
 
+        dns_stub_suppress_duplicate_section_rrs(q);
+
         r = dns_stub_add_reply_packet_body(
                         reply,
                         q->reply_answer,
@@ -601,7 +580,7 @@ static int dns_stub_send_reply(
                         DNS_PACKET_ID(q->request_packet),
                         rcode,
                         truncated,
-                        dns_query_fully_synthetic(q),
+                        dns_query_fully_authoritative(q),
                         !!q->request_packet->opt,
                         edns0_do,
                         DNS_PACKET_AD(q->request_packet) && dns_query_fully_authenticated(q),
@@ -728,13 +707,79 @@ static void dns_stub_query_complete(DnsQuery *q) {
                 }
         }
 
-        /* Note that we don't bother with following CNAMEs here. We propagate the authoritative/additional
-         * sections from the upstream answer however, hence if the upstream server collected that information
-         * already we don't have to collect it ourselves anymore. */
+        /* Take all data from the current reply, and merge it into the three reply sections we are building
+         * up. We do this before processing CNAME redirects, so that we gradually build up our sections, and
+         * and keep adding all RRs in the CNAME chain. */
+        r = dns_stub_assign_sections(
+                        q,
+                        dns_query_question_for_protocol(q, DNS_PROTOCOL_DNS),
+                        dns_stub_reply_with_edns0_do(q));
+        if (r < 0) {
+                log_debug_errno(r, "Failed to assign sections: %m");
+                dns_query_free(q);
+                return;
+        }
 
         switch (q->state) {
 
-        case DNS_TRANSACTION_SUCCESS:
+        case DNS_TRANSACTION_SUCCESS: {
+                bool first = true;
+
+                for (;;) {
+                        int cname_result;
+
+                        cname_result = dns_query_process_cname_one(q);
+                        if (cname_result == -ELOOP) { /* CNAME loop, let's send what we already have */
+                                log_debug_errno(r, "Detected CNAME loop, returning what we already have.");
+                                (void) dns_stub_send_reply(q, q->answer_rcode);
+                                break;
+                        }
+                        if (cname_result < 0) {
+                                log_debug_errno(cname_result, "Failed to process CNAME: %m");
+                                break;
+                        }
+
+                        if (cname_result == DNS_QUERY_NOMATCH) {
+                                /* This answer doesn't contain any RR that would answer our question
+                                 * positively, i.e. neither directly nor via CNAME. */
+
+                                if (first) /* We never followed a CNAME and the answer doesn't match our
+                                            * question at all? Then this is final, the empty answer is the
+                                            * answer. */
+                                        break;
+
+                                /* Otherwise, we already followed a CNAME once within this packet, and the
+                                 * packet doesn't answer our question. In that case let's restart the query,
+                                 * now with the redirected question. We'll */
+                                r = dns_query_go(q);
+                                if (r < 0)
+                                        log_debug_errno(r, "Failed to restart query: %m");
+
+                                return;
+                        }
+
+                        r = dns_stub_assign_sections(
+                                        q,
+                                        dns_query_question_for_protocol(q, DNS_PROTOCOL_DNS),
+                                        dns_stub_reply_with_edns0_do(q));
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to assign sections: %m");
+                                dns_query_free(q);
+                                return;
+                        }
+
+                        if (cname_result == DNS_QUERY_MATCH) /* A match? Then we are done, let's return what we got */
+                                break;
+
+                        /* We followed a CNAME. and collected the RRs that answer the redirected question
+                         * successfully. Let's not try to do this again. */
+                        assert(cname_result == DNS_QUERY_CNAME);
+                        first = false;
+                }
+
+                _fallthrough_;
+        }
+
         case DNS_TRANSACTION_RCODE_FAILURE:
                 (void) dns_stub_send_reply(q, q->answer_rcode);
                 break;
@@ -873,7 +918,6 @@ static void dns_stub_process_query(Manager *m, DnsStubListenerExtra *l, DnsStrea
                 r = dns_query_new(m, &q, p->question, p->question, NULL, 0,
                                   SD_RESOLVED_PROTOCOLS_ALL|
                                   SD_RESOLVED_NO_SEARCH|
-                                  SD_RESOLVED_NO_CNAME|
                                   (DNS_PACKET_DO(p) ? SD_RESOLVED_REQUIRE_PRIMARY : 0)|
                                   SD_RESOLVED_CLAMP_TTL);
         if (r < 0) {
index 23c9ba14a987c73cd4f0ed86174a9c31cdbb19ae..d4a4be71b07a038eb54b3f1e30aa34cfefd038e7 100644 (file)
@@ -81,7 +81,7 @@ static int synthesize_localhost_rr(Manager *m, const DnsResourceKey *key, int if
                         return r;
         }
 
-        if (IN_SET(key->type, DNS_TYPE_AAAA, DNS_TYPE_ANY)) {
+        if (IN_SET(key->type, DNS_TYPE_AAAA, DNS_TYPE_ANY) && socket_ipv6_is_enabled()) {
                 _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
 
                 rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_AAAA, dns_resource_key_name(key));
@@ -234,7 +234,7 @@ static int synthesize_system_hostname_rr(Manager *m, const DnsResourceKey *key,
                                         .address.in.s_addr = htobe32(0x7F000002),
                                 };
 
-                        if (IN_SET(af, AF_INET6, AF_UNSPEC))
+                        if (IN_SET(af, AF_INET6, AF_UNSPEC) && socket_ipv6_is_enabled())
                                 buffer[n++] = (struct local_address) {
                                         .family = AF_INET6,
                                         .ifindex = dns_synthesize_ifindex(ifindex),
index 07c6eca3ba4ff2293a6a52a94cd899025adf5418..6eac7e9c579f7d046ad5ba10335d57e881ca5131 100644 (file)
@@ -30,7 +30,7 @@ static void dns_transaction_reset_answer(DnsTransaction *t) {
         t->answer_dnssec_result = _DNSSEC_RESULT_INVALID;
         t->answer_source = _DNS_TRANSACTION_SOURCE_INVALID;
         t->answer_query_flags = 0;
-        t->answer_nsec_ttl = (uint32_t) -1;
+        t->answer_nsec_ttl = UINT32_MAX;
         t->answer_errno = 0;
 }
 
@@ -275,7 +275,7 @@ int dns_transaction_new(
                 .dns_udp_fd = -1,
                 .answer_source = _DNS_TRANSACTION_SOURCE_INVALID,
                 .answer_dnssec_result = _DNSSEC_RESULT_INVALID,
-                .answer_nsec_ttl = (uint32_t) -1,
+                .answer_nsec_ttl = UINT32_MAX,
                 .key = dns_resource_key_ref(key),
                 .query_flags = query_flags,
                 .bypass = dns_packet_ref(bypass),
index e815dacd7f1e94eed7a83cfdad94665660c52aa8..21154a7f85eb5acb672a85917293a78b6cdf8bdf 100644 (file)
@@ -33,6 +33,7 @@
 #include "resolved-manager.h"
 #include "resolved-mdns.h"
 #include "resolved-resolv-conf.h"
+#include "resolved-util.h"
 #include "resolved-varlink.h"
 #include "socket-util.h"
 #include "string-table.h"
@@ -362,75 +363,17 @@ static int manager_clock_change_listen(Manager *m) {
         return 0;
 }
 
-static int determine_hostname(char **full_hostname, char **llmnr_hostname, char **mdns_hostname) {
+static int determine_hostnames(char **full_hostname, char **llmnr_hostname, char **mdns_hostname) {
         _cleanup_free_ char *h = NULL, *n = NULL;
-#if HAVE_LIBIDN2
-        _cleanup_free_ char *utf8 = NULL;
-#elif HAVE_LIBIDN
-        int k;
-#endif
-        char label[DNS_LABEL_MAX];
-        const char *p, *decoded;
         int r;
 
         assert(full_hostname);
         assert(llmnr_hostname);
         assert(mdns_hostname);
 
-        /* Extract and normalize the first label of the locally configured hostname, and check it's not "localhost". */
-
-        r = gethostname_strict(&h);
-        if (r < 0)
-                return log_debug_errno(r, "Can't determine system hostname: %m");
-
-        p = h;
-        r = dns_label_unescape(&p, label, sizeof label, 0);
-        if (r < 0)
-                return log_error_errno(r, "Failed to unescape hostname: %m");
-        if (r == 0)
-                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                       "Couldn't find a single label in hostname.");
-
-#if HAVE_LIBIDN || HAVE_LIBIDN2
-        r = dlopen_idn();
-        if (r < 0) {
-                log_debug_errno(r, "Failed to initialize IDN support, ignoring: %m");
-                decoded = label; /* no decoding */
-        } else
-#endif
-        {
-#if HAVE_LIBIDN2
-                r = sym_idn2_to_unicode_8z8z(label, &utf8, 0);
-                if (r != IDN2_OK)
-                        return log_error_errno(SYNTHETIC_ERRNO(EUCLEAN),
-                                               "Failed to undo IDNA: %s", sym_idn2_strerror(r));
-                assert(utf8_is_valid(utf8));
-
-                r = strlen(utf8);
-                decoded = utf8;
-#elif HAVE_LIBIDN
-                k = dns_label_undo_idna(label, r, label, sizeof label);
-                if (k < 0)
-                        return log_error_errno(k, "Failed to undo IDNA: %m");
-                if (k > 0)
-                        r = k;
-
-                if (!utf8_is_valid(label))
-                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                               "System hostname is not UTF-8 clean.");
-                decoded = label;
-#else
-                decoded = label; /* no decoding */
-#endif
-        }
-
-        r = dns_label_escape_new(decoded, r, &n);
+        r = resolve_system_hostname(&h, &n);
         if (r < 0)
-                return log_error_errno(r, "Failed to escape hostname: %m");
-
-        if (is_localhost(n))
-                return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
-                                       "System hostname is 'localhost', ignoring.");
+                return r;
 
         r = dns_name_concat(n, "local", 0, mdns_hostname);
         if (r < 0)
@@ -501,9 +444,11 @@ static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, voi
 
         assert(m);
 
-        r = determine_hostname(&full_hostname, &llmnr_hostname, &mdns_hostname);
-        if (r < 0)
+        r = determine_hostnames(&full_hostname, &llmnr_hostname, &mdns_hostname);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to determine the local hostname and LLMNR/mDNS names, ignoring: %m");
                 return 0; /* ignore invalid hostnames */
+        }
 
         llmnr_hostname_changed = !streq(llmnr_hostname, m->llmnr_hostname);
         if (streq(full_hostname, m->full_hostname) &&
@@ -546,7 +491,7 @@ static int manager_watch_hostname(Manager *m) {
 
         (void) sd_event_source_set_description(m->hostname_event_source, "hostname");
 
-        r = determine_hostname(&m->full_hostname, &m->llmnr_hostname, &m->mdns_hostname);
+        r = determine_hostnames(&m->full_hostname, &m->llmnr_hostname, &m->mdns_hostname);
         if (r < 0) {
                 _cleanup_free_ char *d = NULL;
 
index e3a46f4ca1672701762332fd8a4642f7bfdb5ad1..2857b58e89e287003b63b99d6f820e601c2ec8a5 100644 (file)
@@ -265,6 +265,7 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
 
         if (dns_packet_validate_reply(p) > 0) {
                 DnsResourceRecord *rr;
+                DnsTransaction *t;
 
                 log_debug("Got mDNS reply packet");
 
@@ -286,8 +287,9 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
                 dns_scope_check_conflicts(scope, p);
 
                 DNS_ANSWER_FOREACH(rr, p->answer) {
-                        const char *name = dns_resource_key_name(rr->key);
-                        DnsTransaction *t;
+                        const char *name;
+
+                        name = dns_resource_key_name(rr->key);
 
                         /* If the received reply packet contains ANY record that is not .local
                          * or .in-addr.arpa or .ip6.arpa, we assume someone's playing tricks on
@@ -302,26 +304,17 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
                                 /* See the section 10.1 of RFC6762 */
                                 rr->ttl = 1;
                         }
+                }
 
-                        t = dns_scope_find_transaction(scope, rr->key, SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
-                        if (t)
-                                dns_transaction_process_reply(t, p, false);
-
-                        /* Also look for the various types of ANY transactions */
-                        t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(rr->key->class, DNS_TYPE_ANY, dns_resource_key_name(rr->key)), SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
-                        if (t)
-                                dns_transaction_process_reply(t, p, false);
-
-                        t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_ANY, rr->key->type, dns_resource_key_name(rr->key)), SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
-                        if (t)
-                                dns_transaction_process_reply(t, p, false);
-
-                        t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_ANY, DNS_TYPE_ANY, dns_resource_key_name(rr->key)), SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
-                        if (t)
+                LIST_FOREACH(transactions_by_scope, t, scope->transactions) {
+                        r = dns_answer_match_key(p->answer, t->key, NULL);
+                        if (r < 0)
+                                log_debug_errno(r, "Failed to match resource key, ignoring: %m");
+                        else if (r > 0) /* This packet matches the transaction, let's pass it on as reply */
                                 dns_transaction_process_reply(t, p, false);
                 }
 
-                dns_cache_put(&scope->cache, scope->manager->enable_cache, NULL, DNS_PACKET_RCODE(p), p->answer, NULL, false, _DNSSEC_RESULT_INVALID, (uint32_t) -1, p->family, &p->sender);
+                dns_cache_put(&scope->cache, scope->manager->enable_cache, NULL, DNS_PACKET_RCODE(p), p->answer, NULL, false, _DNSSEC_RESULT_INVALID, UINT32_MAX, p->family, &p->sender);
 
         } else if (dns_packet_validate_query(p) > 0)  {
                 log_debug("Got mDNS query packet for id %u", DNS_PACKET_ID(p));
diff --git a/src/resolve/resolved-util.c b/src/resolve/resolved-util.c
new file mode 100644 (file)
index 0000000..00abada
--- /dev/null
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "dns-def.h"
+#include "dns-domain.h"
+#include "hostname-util.h"
+#include "idn-util.h"
+#include "resolved-util.h"
+#include "utf8.h"
+
+int resolve_system_hostname(char **full_hostname, char **first_label) {
+        _cleanup_free_ char *h = NULL, *n = NULL;
+#if HAVE_LIBIDN2
+        _cleanup_free_ char *utf8 = NULL;
+#elif HAVE_LIBIDN
+        int k;
+#endif
+        char label[DNS_LABEL_MAX];
+        const char *p, *decoded;
+        int r;
+
+        /* Return the full hostname in *full_hostname, if nonnull.
+         *
+         * Extract and normalize the first label of the locally configured hostname, check it's not
+         * "localhost", and return it in *first_label, if nonnull. */
+
+        r = gethostname_strict(&h);
+        if (r < 0)
+                return log_debug_errno(r, "Can't determine system hostname: %m");
+
+        p = h;
+        r = dns_label_unescape(&p, label, sizeof label, 0);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to unescape hostname: %m");
+        if (r == 0)
+                return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "Couldn't find a single label in hostname.");
+
+#if HAVE_LIBIDN || HAVE_LIBIDN2
+        r = dlopen_idn();
+        if (r < 0) {
+                log_debug_errno(r, "Failed to initialize IDN support, ignoring: %m");
+                decoded = label; /* no decoding */
+        } else
+#endif
+        {
+#if HAVE_LIBIDN2
+                r = sym_idn2_to_unicode_8z8z(label, &utf8, 0);
+                if (r != IDN2_OK)
+                        return log_debug_errno(SYNTHETIC_ERRNO(EUCLEAN),
+                                               "Failed to undo IDNA: %s", sym_idn2_strerror(r));
+                assert(utf8_is_valid(utf8));
+
+                r = strlen(utf8);
+                decoded = utf8;
+#elif HAVE_LIBIDN
+                k = dns_label_undo_idna(label, r, label, sizeof label);
+                if (k < 0)
+                        return log_debug_errno(k, "Failed to undo IDNA: %m");
+                if (k > 0)
+                        r = k;
+
+                if (!utf8_is_valid(label))
+                        return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+                                               "System hostname is not UTF-8 clean.");
+                decoded = label;
+#else
+                decoded = label; /* no decoding */
+#endif
+        }
+
+        r = dns_label_escape_new(decoded, r, &n);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to escape hostname: %m");
+
+        if (is_localhost(n))
+                return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "System hostname is 'localhost', ignoring.");
+
+        if (full_hostname)
+                *full_hostname = TAKE_PTR(h);
+        if (first_label)
+                *first_label = TAKE_PTR(n);
+        return 0;
+}
diff --git a/src/resolve/resolved-util.h b/src/resolve/resolved-util.h
new file mode 100644 (file)
index 0000000..446b7c9
--- /dev/null
@@ -0,0 +1,4 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+int resolve_system_hostname(char **full_hostname, char **first_label);
index 77e75b8a8d1770dacf7221cb987422e38101a269..27d8c8967ec4072dd2569a67643905318a97d2c1 100644 (file)
@@ -158,14 +158,14 @@ static void vl_method_resolve_hostname_complete(DnsQuery *q) {
                 goto finish;
         }
 
-        r = dns_query_process_cname(q);
+        r = dns_query_process_cname_many(q);
         if (r == -ELOOP) {
                 r = varlink_error(q->varlink_request, "io.systemd.Resolve.CNAMELoop", NULL);
                 goto finish;
         }
         if (r < 0)
                 goto finish;
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         question = dns_query_question_for_protocol(q, q->answer_protocol);
@@ -395,14 +395,14 @@ static void vl_method_resolve_address_complete(DnsQuery *q) {
                 goto finish;
         }
 
-        r = dns_query_process_cname(q);
+        r = dns_query_process_cname_many(q);
         if (r == -ELOOP) {
                 r = varlink_error(q->varlink_request, "io.systemd.Resolve.CNAMELoop", NULL);
                 goto finish;
         }
         if (r < 0)
                 goto finish;
-        if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+        if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
                 return;
 
         question = dns_query_question_for_protocol(q, q->answer_protocol);
index 33187618e5c6c1ab426fc957921805592bed995e..f88a4e97c0d9b7e4cb74d688e884e2134e917aa0 100644 (file)
@@ -10,6 +10,8 @@
 # the system.conf.d/ subdirectory. The latter is generally recommended.
 # Defaults can be restored by simply deleting this file and all drop-ins.
 #
+# Use 'systemd-analyze cat-config systemd/resolved.conf' to display the full config.
+#
 # See resolved.conf(5) for details.
 
 [Resolve]
index 11166d2e78bafd16789a4e10b05e0e706aad7bac..ac405d39d742d32e0f0515b6217d633f3ae21ece 100644 (file)
@@ -956,10 +956,12 @@ static int make_unit_name(sd_bus *bus, UnitType t, char **ret) {
                 return 0;
         }
 
-        /* We managed to get the unique name, then let's use that to
-         * name our transient units. */
+        /* We managed to get the unique name, then let's use that to name our transient units. */
 
-        id = startswith(unique, ":1.");
+        id = startswith(unique, ":1."); /* let' strip the usual prefix */
+        if (!id)
+                id = startswith(unique, ":"); /* the spec only requires things to start with a colon, hence
+                                               * let's add a generic fallback for that. */
         if (!id)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "Unique name %s has unexpected format.",
index 11244537991e60c57c0eb956a258da6e113a50be..cccea2f72752dd116e2c19b1e90bf367331ee2b2 100644 (file)
@@ -72,7 +72,7 @@ int acpi_get_boot_usec(usec_t *loader_start, usec_t *loader_exit) {
         struct acpi_fpdt_boot_header hbrec;
         struct acpi_fpdt_boot brec;
 
-        r = read_full_file("/sys/firmware/acpi/tables/FPDT", &buf, &l);
+        r = read_full_virtual_file("/sys/firmware/acpi/tables/FPDT", &buf, &l);
         if (r < 0)
                 return r;
 
index bd33bdd2c5245d96bf0432603fbc7c6762784d7d..729aa1fb00a20ec4ab7c522f87853fa304cd58f2 100644 (file)
@@ -4,7 +4,6 @@
 #include <fcntl.h>
 #include <inttypes.h>
 #include <limits.h>
-#include <poll.h>
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
@@ -205,7 +204,7 @@ static int backspace_string(int ttyfd, const char *str) {
                 return 0;
 
         size_t m = utf8_n_codepoints(str);
-        if (m == (size_t) -1)
+        if (m == SIZE_MAX)
                 m = strlen(str); /* Not a valid UTF-8 string? If so, let's backspace the number of bytes
                                   * output. Most likely this happened because we are not in an UTF-8 locale,
                                   * and in that case that is the correct thing to do. And even if it's not,
@@ -276,44 +275,28 @@ int ask_password_plymouth(
         pollfd[POLL_INOTIFY].events = POLLIN;
 
         for (;;) {
-                int sleep_for = -1, j;
+                usec_t timeout;
 
-                if (until > 0) {
-                        usec_t y;
-
-                        y = now(CLOCK_MONOTONIC);
-
-                        if (y > until) {
-                                r = -ETIME;
-                                goto finish;
-                        }
-
-                        sleep_for = (int) ((until - y) / USEC_PER_MSEC);
-                }
+                if (until > 0)
+                        timeout = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
+                else
+                        timeout = USEC_INFINITY;
 
                 if (flag_file && access(flag_file, F_OK) < 0) {
                         r = -errno;
                         goto finish;
                 }
 
-                j = poll(pollfd, notify >= 0 ? 2 : 1, sleep_for);
-                if (j < 0) {
-                        if (errno == EINTR)
-                                continue;
-
-                        r = -errno;
+                r = ppoll_usec(pollfd, notify >= 0 ? 2 : 1, timeout);
+                if (r == -EINTR)
+                        continue;
+                if (r < 0)
                         goto finish;
-                } else if (j == 0) {
+                if (r == 0) {
                         r = -ETIME;
                         goto finish;
                 }
 
-                if (pollfd[POLL_SOCKET].revents & POLLNVAL ||
-                    (notify >= 0 && pollfd[POLL_INOTIFY].revents & POLLNVAL)) {
-                        r = -EBADF;
-                        goto finish;
-                }
-
                 if (notify >= 0 && pollfd[POLL_INOTIFY].revents != 0)
                         (void) flush_fd(notify);
 
@@ -513,21 +496,13 @@ int ask_password_tty(
 
         for (;;) {
                 _cleanup_(erase_char) char c;
-                int sleep_for = -1, k;
+                usec_t timeout;
                 ssize_t n;
 
-                if (until > 0) {
-                        usec_t y;
-
-                        y = now(CLOCK_MONOTONIC);
-
-                        if (y > until) {
-                                r = -ETIME;
-                                goto finish;
-                        }
-
-                        sleep_for = (int) DIV_ROUND_UP(until - y, USEC_PER_MSEC);
-                }
+                if (until > 0)
+                        timeout = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
+                else
+                        timeout = USEC_INFINITY;
 
                 if (flag_file)
                         if (access(flag_file, F_OK) < 0) {
@@ -535,24 +510,16 @@ int ask_password_tty(
                                 goto finish;
                         }
 
-                k = poll(pollfd, notify >= 0 ? 2 : 1, sleep_for);
-                if (k < 0) {
-                        if (errno == EINTR)
-                                continue;
-
-                        r = -errno;
+                r = ppoll_usec(pollfd, notify >= 0 ? 2 : 1, timeout);
+                if (r == -EINTR)
+                        continue;
+                if (r < 0)
                         goto finish;
-                } else if (k == 0) {
+                if (r == 0) {
                         r = -ETIME;
                         goto finish;
                 }
 
-                if ((pollfd[POLL_TTY].revents & POLLNVAL) ||
-                    (notify >= 0 && (pollfd[POLL_INOTIFY].revents & POLLNVAL))) {
-                        r = -EBADF;
-                        goto finish;
-                }
-
                 if (notify >= 0 && pollfd[POLL_INOTIFY].revents != 0 && keyname) {
                         (void) flush_fd(notify);
 
@@ -614,11 +581,11 @@ int ask_password_tty(
                                  * last one begins */
                                 q = 0;
                                 for (;;) {
-                                        size_t z;
+                                        int z;
 
-                                        z = utf8_encoded_valid_unichar(passphrase + q, (size_t) -1);
-                                        if (z == 0) {
-                                                q = (size_t) -1; /* Invalid UTF8! */
+                                        z = utf8_encoded_valid_unichar(passphrase + q, SIZE_MAX);
+                                        if (z <= 0) {
+                                                q = SIZE_MAX; /* Invalid UTF8! */
                                                 break;
                                         }
 
@@ -628,7 +595,7 @@ int ask_password_tty(
                                         q += z;
                                 }
 
-                                p = codepoint = q == (size_t) -1 ? p - 1 : q;
+                                p = codepoint = q == SIZE_MAX ? p - 1 : q;
                                 explicit_bzero_safe(passphrase + p, sizeof(passphrase) - p);
 
                         } else if (!dirty && !(flags & ASK_PASSWORD_SILENT)) {
@@ -665,7 +632,7 @@ int ask_password_tty(
 
                         if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0) {
                                 /* Check if we got a complete UTF-8 character now. If so, let's output one '*'. */
-                                n = utf8_encoded_valid_unichar(passphrase + codepoint, (size_t) -1);
+                                n = utf8_encoded_valid_unichar(passphrase + codepoint, SIZE_MAX);
                                 if (n >= 0) {
                                         if (flags & ASK_PASSWORD_ECHO)
                                                 (void) loop_write(ttyfd, passphrase + codepoint, n, false);
@@ -875,38 +842,24 @@ int ask_password_agent(
                 char passphrase[LINE_MAX+1];
                 struct iovec iovec;
                 struct ucred *ucred;
+                usec_t timeout;
                 ssize_t n;
-                int k;
-                usec_t t;
-
-                t = now(CLOCK_MONOTONIC);
-
-                if (until > 0 && until <= t) {
-                        r = -ETIME;
-                        goto finish;
-                }
 
-                k = poll(pollfd, notify >= 0 ? _FD_MAX : _FD_MAX - 1, until > 0 ? (int) ((until-t)/USEC_PER_MSEC) : -1);
-                if (k < 0) {
-                        if (errno == EINTR)
-                                continue;
+                if (until > 0)
+                        timeout = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
+                else
+                        timeout = USEC_INFINITY;
 
-                        r = -errno;
+                r = ppoll_usec(pollfd, notify >= 0 ? _FD_MAX : _FD_MAX - 1, timeout);
+                if (r == -EINTR)
+                        continue;
+                if (r < 0)
                         goto finish;
-                }
-
-                if (k <= 0) {
+                if (r == 0) {
                         r = -ETIME;
                         goto finish;
                 }
 
-                if (pollfd[FD_SOCKET].revents & POLLNVAL ||
-                    pollfd[FD_SIGNAL].revents & POLLNVAL ||
-                    (notify >= 0 && pollfd[FD_INOTIFY].revents & POLLNVAL)) {
-                        r = -EBADF;
-                        goto finish;
-                }
-
                 if (pollfd[FD_SIGNAL].revents & POLLIN) {
                         r = -EINTR;
                         goto finish;
index 271bba8cde94fca51fb8aa1cc44b8e03f5f053b8..2864c1b8f9026051c9e8f9d952874ce98cdd939f 100644 (file)
@@ -2,7 +2,6 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <poll.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -12,6 +11,7 @@
 
 #include "barrier.h"
 #include "fd-util.h"
+#include "io-util.h"
 #include "macro.h"
 
 /**
@@ -219,14 +219,10 @@ static bool barrier_read(Barrier *b, int64_t comp) {
                 uint64_t buf;
                 int r;
 
-                r = poll(pfd, ELEMENTSOF(pfd), -1);
-                if (r < 0) {
-                        if (IN_SET(errno, EAGAIN, EINTR))
-                                continue;
-                        goto error;
-                }
-                if (pfd[0].revents & POLLNVAL ||
-                    pfd[1].revents & POLLNVAL)
+                r = ppoll_usec(pfd, ELEMENTSOF(pfd), USEC_INFINITY);
+                if (r == -EINTR)
+                        continue;
+                if (r < 0)
                         goto error;
 
                 if (pfd[1].revents) {
index 33528388f036e91cbb1fab65958bfe6cc6193332..dcf67fbbd80c4d0f70541c26fbe8bc3e10e40f0e 100644 (file)
@@ -18,7 +18,7 @@
 #define BITMAPS_MAX_ENTRY 0xffff
 
 /* This indicates that we reached the end of the bitmap */
-#define BITMAP_END ((unsigned) -1)
+#define BITMAP_END (UINT_MAX)
 
 #define BITMAP_NUM_TO_OFFSET(n)           ((n) / (sizeof(uint64_t) * 8))
 #define BITMAP_NUM_TO_REM(n)              ((n) % (sizeof(uint64_t) * 8))
index a5ce7ef17f0185b3803b6f3ebed30b702a72608c..feb6d3807f77c88ef86ee8f1964fa162b1c349ea 100644 (file)
@@ -142,9 +142,9 @@ int bus_property_get_rlimit(
                 x = is_soft ? buf.rlim_cur : buf.rlim_max;
         }
 
-        /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to (uint64_t) -1, so that it is the same on all
+        /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to UINT64_MAX, so that it is the same on all
          * archs */
-        u = x == RLIM_INFINITY ? (uint64_t) -1 : (uint64_t) x;
+        u = x == RLIM_INFINITY ? UINT64_MAX : (uint64_t) x;
 
         return sd_bus_message_append(reply, "t", u);
 }
index 4cea25073d1a78741e60547007921e1edb8c3b78..2a712be7339fc936a4d1926f9b9badce55ccc9eb 100644 (file)
@@ -180,18 +180,18 @@ static int bus_print_property(const char *name, const char *expected_value, sd_b
                 } else if ((STR_IN_SET(name, "CPUWeight", "StartupCPUWeight", "IOWeight", "StartupIOWeight") && u == CGROUP_WEIGHT_INVALID) ||
                            (STR_IN_SET(name, "CPUShares", "StartupCPUShares") && u == CGROUP_CPU_SHARES_INVALID) ||
                            (STR_IN_SET(name, "BlockIOWeight", "StartupBlockIOWeight") && u == CGROUP_BLKIO_WEIGHT_INVALID) ||
-                           (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == (uint64_t) -1) ||
-                           (endswith(name, "NSec") && u == (uint64_t) -1))
+                           (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == UINT64_MAX) ||
+                           (endswith(name, "NSec") && u == UINT64_MAX))
 
                         bus_print_property_value(name, expected_value, value, "[not set]");
 
                 else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryLimit") && u == CGROUP_LIMIT_MAX) ||
-                         (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == (uint64_t) -1) ||
-                         (startswith(name, "Limit") && u == (uint64_t) -1) ||
-                         (startswith(name, "DefaultLimit") && u == (uint64_t) -1))
+                         (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == UINT64_MAX) ||
+                         (startswith(name, "Limit") && u == UINT64_MAX) ||
+                         (startswith(name, "DefaultLimit") && u == UINT64_MAX))
 
                         bus_print_property_value(name, expected_value, value, "infinity");
-                else if (STR_IN_SET(name, "IPIngressBytes", "IPIngressPackets", "IPEgressBytes", "IPEgressPackets") && u == (uint64_t) -1)
+                else if (STR_IN_SET(name, "IPIngressBytes", "IPIngressPackets", "IPEgressBytes", "IPEgressPackets") && u == UINT64_MAX)
                         bus_print_property_value(name, expected_value, value, "[no data]");
                 else
                         bus_print_property_valuef(name, expected_value, value, "%"PRIu64, u);
index a58495dbf84b352e99b2f80dd1bf61984189bc65..84d4729334c682d91da077b3b6936a1c79c1fc87 100644 (file)
@@ -882,6 +882,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
                               "ProtectProc",
                               "ProcSubset",
                               "NetworkNamespacePath",
+                              "IPCNamespacePath",
                               "LogNamespace"))
                 return bus_append_string(m, field, eq);
 
@@ -894,6 +895,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
                               "PrivateNetwork",
                               "PrivateUsers",
                               "PrivateMounts",
+                              "PrivateIPC",
                               "NoNewPrivileges",
                               "SyslogLevelPrefix",
                               "MemoryDenyWriteExecute",
@@ -1191,7 +1193,7 @@ static int bus_append_execute_property(sd_bus_message *m, const char *field, con
                 _cleanup_free_ void *decoded = NULL;
                 size_t sz;
 
-                r = unbase64mem(eq, (size_t) -1, &decoded, &sz);
+                r = unbase64mem(eq, SIZE_MAX, &decoded, &sz);
                 if (r < 0)
                         return log_error_errno(r, "Failed to decode base64 data '%s': %m", eq);
 
@@ -1945,6 +1947,7 @@ static int bus_append_service_property(sd_bus_message *m, const char *field, con
 
         if (STR_IN_SET(field, "PIDFile",
                               "Type",
+                              "ExitType",
                               "Restart",
                               "BusName",
                               "NotifyAccess",
index 58211ebd0316e2445e2032f20884ee5bed348d16..64ca67993c00e714305b63fb3e32fba3bccea02e 100644 (file)
@@ -101,7 +101,7 @@ int bus_event_loop_with_idle(
                 else
                         idle = true;
 
-                r = sd_event_run(e, exiting || !idle ? (uint64_t) -1 : timeout);
+                r = sd_event_run(e, exiting || !idle ? UINT64_MAX : timeout);
                 if (r < 0)
                         return r;
 
index 80f7785323b7f1018f8f082ba78610bd32fcc429..51b71ecc2c18a6758ac2b956896d4c109c2d0a91 100644 (file)
@@ -133,7 +133,7 @@ static int bus_process_wait(sd_bus *bus) {
                 if (r > 0)
                         return 0;
 
-                r = sd_bus_wait(bus, (uint64_t) -1);
+                r = sd_bus_wait(bus, UINT64_MAX);
                 if (r < 0)
                         return r;
         }
index 4f1c505bd3f1bae01b165d45c03f01b7f080fcd6..29620e0d1b37c1cbb582be047a4e0440a0838339 100644 (file)
@@ -414,7 +414,7 @@ int bus_wait_for_units_run(BusWaitForUnits *d) {
                 if (r > 0)
                         continue;
 
-                r = sd_bus_wait(d->bus, (uint64_t) -1);
+                r = sd_bus_wait(d->bus, UINT64_MAX);
                 if (r < 0)
                         return r;
         }
index 4f68a570b52366e1c678c1fe208a1a191568020e..bf24d8d5bbb85d04ae087bf7f0e1d29542f4e01b 100644 (file)
@@ -1101,7 +1101,7 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
         return 0;
 }
 
-static int find_end_of_month(struct tm *tm, bool utc, int day) {
+static int find_end_of_month(const struct tm *tm, bool utc, int day) {
         struct tm t = *tm;
 
         t.tm_mon++;
@@ -1114,28 +1114,39 @@ static int find_end_of_month(struct tm *tm, bool utc, int day) {
         return t.tm_mday;
 }
 
-static int find_matching_component(const CalendarSpec *spec, const CalendarComponent *c,
-                                   struct tm *tm, int *val) {
-        const CalendarComponent *p = c;
-        int start, stop, d = -1;
+static int find_matching_component(
+                const CalendarSpec *spec,
+                const CalendarComponent *c,
+                const struct tm *tm,           /* tm is only used for end-of-month calculations */
+                int *val) {
+
+        int d = -1, r;
         bool d_set = false;
-        int r;
 
         assert(val);
 
+        /* Finds the *earliest* matching time specified by one of the CalendarCompoment items in chain c.
+         * If no matches can be found, returns -ENOENT.
+         * Otherwise, updates *val to the matching time. 1 is returned if *val was changed, 0 otherwise.
+         */
+
         if (!c)
                 return 0;
 
+        bool end_of_month = spec->end_of_month && c == spec->day;
+
         while (c) {
-                start = c->start;
-                stop = c->stop;
+                int start, stop;
 
-                if (spec->end_of_month && p == spec->day) {
-                        start = find_end_of_month(tm, spec->utc, start);
-                        stop = find_end_of_month(tm, spec->utc, stop);
+                if (end_of_month) {
+                        start = find_end_of_month(tm, spec->utc, c->start);
+                        stop = find_end_of_month(tm, spec->utc, c->stop);
 
                         if (stop > 0)
                                 SWAP_TWO(start, stop);
+                } else {
+                        start = c->start;
+                        stop = c->stop;
                 }
 
                 if (start >= *val) {
@@ -1184,15 +1195,18 @@ static int tm_within_bounds(struct tm *tm, bool utc) {
                 return negative_errno();
 
         /* Did any normalization take place? If so, it was out of bounds before */
-        bool good = t.tm_year == tm->tm_year &&
-                    t.tm_mon  == tm->tm_mon  &&
-                    t.tm_mday == tm->tm_mday &&
-                    t.tm_hour == tm->tm_hour &&
-                    t.tm_min  == tm->tm_min  &&
-                    t.tm_sec  == tm->tm_sec;
-        if (!good)
+        int cmp = CMP(t.tm_year, tm->tm_year) ?:
+                  CMP(t.tm_mon, tm->tm_mon) ?:
+                  CMP(t.tm_mday, tm->tm_mday) ?:
+                  CMP(t.tm_hour, tm->tm_hour) ?:
+                  CMP(t.tm_min, tm->tm_min) ?:
+                  CMP(t.tm_sec, tm->tm_sec);
+
+        if (cmp < 0)
+                return -EDEADLK; /* Refuse to go backward */
+        if (cmp > 0)
                 *tm = t;
-        return good;
+        return cmp == 0;
 }
 
 static bool matches_weekday(int weekdays_bits, const struct tm *tm, bool utc) {
@@ -1210,6 +1224,10 @@ static bool matches_weekday(int weekdays_bits, const struct tm *tm, bool utc) {
         return (weekdays_bits & (1 << k));
 }
 
+/* A safety valve: if we get stuck in the calculation, return an error.
+ * C.f. https://bugzilla.redhat.com/show_bug.cgi?id=1941335. */
+#define MAX_CALENDAR_ITERATIONS 1000
+
 static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
         struct tm c;
         int tm_usec;
@@ -1223,7 +1241,7 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
         c = *tm;
         tm_usec = *usec;
 
-        for (;;) {
+        for (unsigned iteration = 0; iteration < MAX_CALENDAR_ITERATIONS; iteration++) {
                 /* Normalize the current date */
                 (void) mktime_or_timegm(&c, spec->utc);
                 c.tm_isdst = spec->dst;
@@ -1320,6 +1338,14 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
                 *usec = tm_usec;
                 return 0;
         }
+
+        /* It seems we entered an infinite loop. Let's gracefully return an error instead of hanging or
+         * aborting. This code is also exercised when timers.target is brought up during early boot, so
+         * aborting here is problematic and hard to diagnose for users. */
+        _cleanup_free_ char *s = NULL;
+        (void) calendar_spec_to_string(spec, &s);
+        return log_warning_errno(SYNTHETIC_ERRNO(EDEADLK),
+                                 "Infinite loop in calendar calculation: %s", strna(s));
 }
 
 static int calendar_spec_next_usec_impl(const CalendarSpec *spec, usec_t usec, usec_t *ret_next) {
index 64ed2571e9b5f183907e5a414264ac2e3d79cf6d..9dfa1907511d16d3c0f4941328be424397c63cd8 100644 (file)
@@ -263,7 +263,7 @@ int config_parse(
                 const void *table,
                 ConfigParseFlags flags,
                 void *userdata,
-                usec_t *ret_mtime) {
+                usec_t *latest_mtime) {
 
         _cleanup_free_ char *section = NULL, *continuation = NULL;
         _cleanup_fclose_ FILE *ours = NULL;
@@ -275,6 +275,9 @@ int config_parse(
         assert(filename);
         assert(lookup);
 
+        /* latest_mtime is an input-output parameter: it will be updated if the mtime of the file we're
+         * looking at is later than the current *latest_mtime value. */
+
         if (!f) {
                 f = ours = fopen(filename, "re");
                 if (!f) {
@@ -417,8 +420,8 @@ int config_parse(
                 }
         }
 
-        if (ret_mtime)
-                *ret_mtime = mtime;
+        if (latest_mtime)
+                *latest_mtime = MAX(*latest_mtime, mtime);
 
         return 1;
 }
@@ -448,12 +451,9 @@ static int config_parse_many_files(
 
         /* Then read all the drop-ins. */
         STRV_FOREACH(fn, files) {
-                usec_t t;
-
-                r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &t);
+                r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &mtime);
                 if (r < 0)
                         return r;
-                mtime = MAX(mtime, t); /* Find the newest */
         }
 
         if (ret_mtime)
index cd09491112428c9695c41731795046af4ccdf962..c4b9891428d27cb576cdf026fcfcb846703d82a7 100644 (file)
@@ -89,7 +89,7 @@ int config_parse(
                 const void *table,
                 ConfigParseFlags flags,
                 void *userdata,
-                usec_t *ret_mtime);         /* possibly NULL */
+                usec_t *latest_mtime);      /* input/output, possibly NULL */
 
 int config_parse_many_nulstr(
                 const char *conf_file,      /* possibly NULL */
index a47009c3c1a3ea23fd364fe790bc5fdc28c7657d..cca92e7fb4e3ab969e7b18c59723e57c57987b39 100644 (file)
@@ -1287,6 +1287,7 @@ static int run_fsck(const char *node, const char *fstype) {
         if (r == 0) {
                 /* Child */
                 execl("/sbin/fsck", "/sbin/fsck", "-aT", node, NULL);
+                log_open();
                 log_debug_errno(errno, "Failed to execl() fsck: %m");
                 _exit(FSCK_OPERATIONAL_ERROR);
         }
@@ -1344,20 +1345,28 @@ static int mount_partition(
         }
 
         if (directory) {
-                if (!FLAGS_SET(flags, DISSECT_IMAGE_READ_ONLY)) {
-                        /* Automatically create missing mount points, if necessary. */
-                        r = mkdir_p_root(where, directory, uid_shift, (gid_t) uid_shift, 0755);
-                        if (r < 0)
-                                return r;
-                }
+                /* Automatically create missing mount points inside the image, if necessary. */
+                r = mkdir_p_root(where, directory, uid_shift, (gid_t) uid_shift, 0755);
+                if (r < 0 && r != -EROFS)
+                        return r;
 
                 r = chase_symlinks(directory, where, CHASE_PREFIX_ROOT, &chased, NULL);
                 if (r < 0)
                         return r;
 
                 p = chased;
-        } else
+        } else {
+                /* Create top-level mount if missing – but only if this is asked for. This won't modify the
+                 * image (as the branch above does) but the host hierarchy, and the created directory might
+                 * survive our mount in the host hierarchy hence. */
+                if (FLAGS_SET(flags, DISSECT_IMAGE_MKDIR)) {
+                        r = mkdir_p(where, 0755);
+                        if (r < 0)
+                                return r;
+                }
+
                 p = where;
+        }
 
         /* If requested, turn on discard support. */
         if (fstype_can_discard(fstype) &&
@@ -1382,12 +1391,6 @@ static int mount_partition(
                 if (!strextend_with_separator(&options, ",", m->mount_options))
                         return -ENOMEM;
 
-        if (FLAGS_SET(flags, DISSECT_IMAGE_MKDIR)) {
-                r = mkdir_p(p, 0755);
-                if (r < 0)
-                        return r;
-        }
-
         r = mount_nofollow_verbose(LOG_DEBUG, node, p, fstype, MS_NODEV|(rw ? 0 : MS_RDONLY), options);
         if (r < 0)
                 return r;
@@ -1420,10 +1423,6 @@ int dissected_image_mount(DissectedImage *m, const char *where, uid_t uid_shift,
                         return r;
         }
 
-        /* Mask DISSECT_IMAGE_MKDIR for all subdirs: the idea is that only the top-level mount point is
-         * created if needed, but the image itself not modified. */
-        flags &= ~DISSECT_IMAGE_MKDIR;
-
         if ((flags & DISSECT_IMAGE_MOUNT_NON_ROOT_ONLY) == 0) {
                 /* For us mounting root always means mounting /usr as well */
                 r = mount_partition(m->partitions + PARTITION_USR, where, "/usr", uid_shift, flags);
@@ -1570,6 +1569,7 @@ DecryptedImage* decrypted_image_unref(DecryptedImage* d) {
                 free(p->name);
         }
 
+        free(d->decrypted);
         free(d);
 #endif
         return NULL;
@@ -2249,8 +2249,8 @@ int dissected_image_acquire_metadata(DissectedImage *m) {
                 [META_HOSTNAME]          = "/etc/hostname\0",
                 [META_MACHINE_ID]        = "/etc/machine-id\0",
                 [META_MACHINE_INFO]      = "/etc/machine-info\0",
-                [META_OS_RELEASE]        = ("/etc/os-release\0"
-                                           "/usr/lib/os-release\0"),
+                [META_OS_RELEASE]        = "/etc/os-release\0"
+                                           "/usr/lib/os-release\0",
                 [META_EXTENSION_RELEASE] = NULL,
         };
 
@@ -2270,9 +2270,13 @@ int dissected_image_acquire_metadata(DissectedImage *m) {
 
         /* As per the os-release spec, if the image is an extension it will have a file
          * named after the image name in extension-release.d/ */
-        if (m->image_name)
-                paths[META_EXTENSION_RELEASE] = strjoina("/usr/lib/extension-release.d/extension-release.", m->image_name);
-        else
+        if (m->image_name) {
+                char *ext;
+
+                ext = strjoina("/usr/lib/extension-release.d/extension-release.", m->image_name, "0");
+                ext[strlen(ext) - 1] = '\0'; /* Extra \0 for NULSTR_FOREACH using placeholder from above */
+                paths[META_EXTENSION_RELEASE] = ext;
+        } else
                 log_debug("No image name available, will skip extension-release metadata");
 
         for (; n_meta_initialized < _META_MAX; n_meta_initialized ++) {
@@ -2331,7 +2335,7 @@ int dissected_image_acquire_metadata(DissectedImage *m) {
                                 continue;
                         }
 
-                        r = copy_bytes(fd, fds[2*k+1], (uint64_t) -1, 0);
+                        r = copy_bytes(fd, fds[2*k+1], UINT64_MAX, 0);
                         if (r < 0) {
                                 (void) write(error_pipe[1], &r, sizeof(r));
                                 _exit(EXIT_FAILURE);
index 77e7c80c20a5fbe2d0be07631d94da5243ac7bb4..ddadda1c0cdcbb8177d153b34a6466a1621a4389 100644 (file)
@@ -86,7 +86,7 @@ typedef enum DissectImageFlags {
         DISSECT_IMAGE_FSCK                = 1 << 11, /* File system check the partition before mounting (no effect when combined with DISSECT_IMAGE_READ_ONLY) */
         DISSECT_IMAGE_NO_PARTITION_TABLE  = 1 << 12, /* Only recognize single file system images */
         DISSECT_IMAGE_VERITY_SHARE        = 1 << 13, /* When activating a verity device, reuse existing one if already open */
-        DISSECT_IMAGE_MKDIR               = 1 << 14, /* Make directory to mount right before mounting, if missing */
+        DISSECT_IMAGE_MKDIR               = 1 << 14, /* Make top-level directory to mount right before mounting, if missing */
 } DissectImageFlags;
 
 struct DissectedImage {
index 2aab39c32d500ce16ec0e1c766c3fc5d66055380..ee32b0b097f153829c5441785a52f50bc81c2fa7 100644 (file)
@@ -809,10 +809,8 @@ bool efi_has_tpm2(void) {
 #endif
 
 bool efi_loader_entry_name_valid(const char *s) {
-        if (isempty(s))
-                return false;
 
-        if (strlen(s) > FILENAME_MAX) /* Make sure entry names fit in filenames */
+        if (!filename_is_valid(s)) /* Make sure entry names fit in filenames */
                 return false;
 
         return in_charset(s, ALPHANUMERICAL "+-_.");
index 05c322d353cae5a2e8e82651f6e27d9663c97145..ecabc5fc4042b8a8e2084bd4ca1778f40ef623d3 100644 (file)
@@ -756,9 +756,11 @@ int fw_nftables_init(FirewallContext *ctx) {
         if (r < 0)
                 return r;
 
-        r = fw_nftables_init_family(nfnl, AF_INET6);
-        if (r < 0)
-                log_debug_errno(r, "Failed to init ipv6 NAT: %m");
+        if (socket_ipv6_is_supported()) {
+                r = fw_nftables_init_family(nfnl, AF_INET6);
+                if (r < 0)
+                        log_debug_errno(r, "Failed to init ipv6 NAT: %m");
+        }
 
         ctx->nfnl = TAKE_PTR(nfnl);
         return 0;
@@ -810,40 +812,6 @@ static int nft_message_add_setelem_iprange(sd_netlink_message *m,
         return 0;
 }
 
-/* When someone runs 'nft flush ruleset' in the same net namespace
- * this will also tear down the systemd nat table.
- *
- * Unlike iptables -t nat -F (which will remove all rules added by the
- * systemd iptables backend, iptables has builtin chains that cannot be
- * deleted -- the next add operation will 'just work'.
- *
- * In the nftables case, everything gets removed. The next add operation
- * will yield -ENOENT.
- *
- * If we see -ENOENT on add, replay the initial table setup.
- * If that works, re-do the add operation.
- *
- * Note that this doesn't protect against external sabotage such as a
- * 'while true; nft flush ruleset;done'. There is nothing that could be
- * done about that short of extending the kernel to allow tables to be
- * owned by stystemd-networkd and making them non-deleteable except by
- * the 'owning process'.
- */
-static int fw_nftables_recreate_table(sd_netlink *nfnl, int af, sd_netlink_message **old, size_t size) {
-        int r = fw_nftables_init_family(nfnl, af);
-
-        if (r != 0)
-                return r;
-
-        while (size > 0) {
-               size_t i = --size;
-
-               old[i] = sd_netlink_message_unref(old[i]);
-        }
-
-        return 0;
-}
-
 static int nft_message_add_setelem_ip6range(
                 sd_netlink_message *m,
                 const union in_addr_union *source,
@@ -877,14 +845,14 @@ static int nft_message_add_setelem_ip6range(
 
 #define NFT_MASQ_MSGS   3
 
-int fw_nftables_add_masquerade(
+static int fw_nftables_add_masquerade_internal(
                 FirewallContext *ctx,
                 bool add,
                 int af,
                 const union in_addr_union *source,
                 unsigned int source_prefixlen) {
+
         sd_netlink_message *transaction[NFT_MASQ_MSGS] = {};
-        bool retry = true;
         size_t tsize;
         int r;
 
@@ -893,7 +861,7 @@ int fw_nftables_add_masquerade(
 
         if (af == AF_INET6 && source_prefixlen < 8)
                 return -EINVAL;
-again:
+
         r = sd_nfnl_message_batch_begin(ctx->nfnl, &transaction[0]);
         if (r < 0)
                 return r;
@@ -902,7 +870,6 @@ again:
                 r = sd_nfnl_nft_message_new_setelems_begin(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_TABLE_NAME, NFT_SYSTEMD_MASQ_SET_NAME);
         else
                 r = sd_nfnl_nft_message_del_setelems_begin(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_TABLE_NAME, NFT_SYSTEMD_MASQ_SET_NAME);
-
         if (r < 0)
                 goto out_unref;
 
@@ -910,7 +877,6 @@ again:
                  r = nft_message_add_setelem_iprange(transaction[tsize], source, source_prefixlen);
         else
                  r = nft_message_add_setelem_ip6range(transaction[tsize], source, source_prefixlen);
-
         if (r < 0)
                 goto out_unref;
 
@@ -919,26 +885,59 @@ again:
         r = sd_nfnl_message_batch_end(ctx->nfnl, &transaction[tsize]);
         if (r < 0)
                 return r;
+
         ++tsize;
         r = nfnl_netlink_sendv(ctx->nfnl, transaction, tsize);
 
-        if (retry && r == -ENOENT) {
-                int tmp = fw_nftables_recreate_table(ctx->nfnl, af, transaction, tsize);
-                if (tmp == 0) {
-                        retry = false;
-                        goto again;
-                }
-        }
-
 out_unref:
         while (tsize > 0)
                 sd_netlink_message_unref(transaction[--tsize]);
         return r < 0 ? r : 0;
 }
 
+int fw_nftables_add_masquerade(
+                FirewallContext *ctx,
+                bool add,
+                int af,
+                const union in_addr_union *source,
+                unsigned int source_prefixlen) {
+
+        int r;
+
+        if (!socket_ipv6_is_supported() && af == AF_INET6)
+                return -EOPNOTSUPP;
+
+        r = fw_nftables_add_masquerade_internal(ctx, add, af, source, source_prefixlen);
+        if (r != -ENOENT)
+                return r;
+
+        /* When someone runs 'nft flush ruleset' in the same net namespace this will also tear down the
+         * systemd nat table.
+         *
+         * Unlike iptables -t nat -F (which will remove all rules added by the systemd iptables
+         * backend, iptables has builtin chains that cannot be deleted -- the next add operation will
+         * 'just work'.
+         *
+         * In the nftables case, everything gets removed. The next add operation will yield -ENOENT.
+         *
+         * If we see -ENOENT on add, replay the initial table setup. If that works, re-do the add
+         * operation.
+         *
+         * Note that this doesn't protect against external sabotage such as a
+         * 'while true; nft flush ruleset; done'. There is nothing that could be done about that short
+         * of extending the kernel to allow tables to be owned by stystemd-networkd and making them
+         * non-deleteable except by the 'owning process'. */
+
+        r = fw_nftables_init_family(ctx->nfnl, af);
+        if (r < 0)
+                return r;
+
+        return fw_nftables_add_masquerade_internal(ctx, add, af, source, source_prefixlen);
+}
+
 #define NFT_DNAT_MSGS   4
 
-int fw_nftables_add_local_dnat(
+static int fw_nftables_add_local_dnat_internal(
                 FirewallContext *ctx,
                 bool add,
                 int af,
@@ -947,21 +946,24 @@ int fw_nftables_add_local_dnat(
                 const union in_addr_union *remote,
                 uint16_t remote_port,
                 const union in_addr_union *previous_remote) {
-        uint32_t data[5], key[2], dlen;
+
         sd_netlink_message *transaction[NFT_DNAT_MSGS] = {};
-        bool retry = true;
+        static bool ipv6_supported = true;
+        uint32_t data[5], key[2], dlen;
         size_t tsize;
         int r;
 
         assert(add || !previous_remote);
 
+        if (!ipv6_supported && af == AF_INET6)
+                return -EOPNOTSUPP;
+
         if (!IN_SET(protocol, IPPROTO_TCP, IPPROTO_UDP))
                 return -EPROTONOSUPPORT;
 
         if (local_port <= 0)
                 return -EINVAL;
 
-again:
         key[0] = protocol;
         key[1] = htobe16(local_port);
 
@@ -1006,9 +1008,11 @@ again:
 
         assert(tsize < NFT_DNAT_MSGS);
         if (add)
-                nft_add_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
+                r = nft_add_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
         else
-                nft_del_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
+                r = nft_del_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
+        if (r < 0)
+                goto out_unref;
 
         tsize++;
         assert(tsize < NFT_DNAT_MSGS);
@@ -1019,21 +1023,48 @@ again:
 
         tsize++;
         assert(tsize <= NFT_DNAT_MSGS);
-        r = nfnl_netlink_sendv(ctx->nfnl, transaction, tsize);
-
-        if (retry && r == -ENOENT) {
-                int tmp = fw_nftables_recreate_table(ctx->nfnl, af, transaction, tsize);
 
-                if (tmp == 0) {
-                        /* table created anew; previous address already gone */
-                        previous_remote = NULL;
-                        retry = false;
-                        goto again;
-                }
+        r = nfnl_netlink_sendv(ctx->nfnl, transaction, tsize);
+        if (r == -EOVERFLOW && af == AF_INET6) {
+                /* The current implementation of DNAT in systemd requires kernel's
+                 * fdb9c405e35bdc6e305b9b4e20ebc141ed14fc81 (v5.8), and the older kernel returns
+                 * -EOVERFLOW. Let's treat the error as -EOPNOTSUPP. */
+                log_debug_errno(r, "The current implementation of IPv6 DNAT in systemd requires kernel 5.8 or newer, ignoring: %m");
+                ipv6_supported = false;
+                r = -EOPNOTSUPP;
         }
 
 out_unref:
         while (tsize > 0)
                 sd_netlink_message_unref(transaction[--tsize]);
+
         return r < 0 ? r : 0;
 }
+
+int fw_nftables_add_local_dnat(
+                FirewallContext *ctx,
+                bool add,
+                int af,
+                int protocol,
+                uint16_t local_port,
+                const union in_addr_union *remote,
+                uint16_t remote_port,
+                const union in_addr_union *previous_remote) {
+
+        int r;
+
+        if (!socket_ipv6_is_supported() && af == AF_INET6)
+                return -EOPNOTSUPP;
+
+        r = fw_nftables_add_local_dnat_internal(ctx, add, af, protocol, local_port, remote, remote_port, previous_remote);
+        if (r != -ENOENT)
+                return r;
+
+        /* See comment in fw_nftables_add_masquerade(). */
+        r = fw_nftables_init_family(ctx->nfnl, af);
+        if (r < 0)
+                return r;
+
+        /* table created anew; previous address already gone */
+        return fw_nftables_add_local_dnat_internal(ctx, add, af, protocol, local_port, remote, remote_port, NULL);
+}
index 59e1e502fda05697cbbe18b096c05f67405ff840..07e2d0bbd3dc35db035eaf22afd3b393bf6f56f3 100644 (file)
@@ -4,22 +4,27 @@
 #include <stdbool.h>
 #include <stdint.h>
 
-#include "in-addr-util.h"
 #include "sd-netlink.h"
 
-enum FirewallBackend {
+#include "in-addr-util.h"
+
+typedef enum FirewallBackend {
         FW_BACKEND_NONE,
 #if HAVE_LIBIPTC
         FW_BACKEND_IPTABLES,
 #endif
         FW_BACKEND_NFTABLES,
-};
+        _FW_BACKEND_MAX,
+        _FW_BACKEND_INVALID = -EINVAL,
+} FirewallBackend;
 
 struct FirewallContext {
-        enum FirewallBackend firewall_backend;
+        FirewallBackend backend;
         sd_netlink *nfnl;
 };
 
+const char *firewall_backend_to_string(FirewallBackend b) _const_;
+
 int fw_nftables_init(FirewallContext *ctx);
 void fw_nftables_exit(FirewallContext *ctx);
 
index 3bed941127fcbdf7cdb3641b8439b94982814419..afa3e02b45463dfac980975f2642c10fab06d5be 100644 (file)
@@ -7,31 +7,53 @@
 #include "alloc-util.h"
 #include "firewall-util.h"
 #include "firewall-util-private.h"
+#include "log.h"
+#include "string-table.h"
 
-static enum FirewallBackend firewall_backend_probe(FirewallContext *ctx) {
-        if (fw_nftables_init(ctx) == 0)
-               return FW_BACKEND_NFTABLES;
+static const char * const firewall_backend_table[_FW_BACKEND_MAX] = {
+        [FW_BACKEND_NONE] = "none",
 #if HAVE_LIBIPTC
-        return FW_BACKEND_IPTABLES;
+        [FW_BACKEND_IPTABLES] = "iptables",
+#endif
+        [FW_BACKEND_NFTABLES] = "nftables",
+};
+
+DEFINE_STRING_TABLE_LOOKUP_TO_STRING(firewall_backend, FirewallBackend);
+
+static void firewall_backend_probe(FirewallContext *ctx) {
+        assert(ctx);
+
+        if (ctx->backend != _FW_BACKEND_INVALID)
+                return;
+
+        if (fw_nftables_init(ctx) >= 0)
+                ctx->backend = FW_BACKEND_NFTABLES;
+        else
+#if HAVE_LIBIPTC
+                ctx->backend = FW_BACKEND_IPTABLES;
 #else
-        return FW_BACKEND_NONE;
+                ctx->backend = FW_BACKEND_NONE;
 #endif
+
+        if (ctx->backend != FW_BACKEND_NONE)
+                log_debug("Using %s as firewall backend.", firewall_backend_to_string(ctx->backend));
+        else
+                log_debug("No firewall backend found.");
 }
 
 int fw_ctx_new(FirewallContext **ret) {
         _cleanup_free_ FirewallContext *ctx = NULL;
 
-        ctx = new0(FirewallContext, 1);
+        ctx = new(FirewallContext, 1);
         if (!ctx)
                 return -ENOMEM;
 
-        /* could probe here.  However, this means that we will load
-         * iptable_nat or nf_tables, both will enable connection tracking.
-         *
-         * Alternative would be to probe here but only call
-         * fw_ctx_new when nspawn/networkd know they will call
-         * fw_add_masquerade/local_dnat later anyway.
-         */
+        *ctx = (FirewallContext) {
+                .backend = _FW_BACKEND_INVALID,
+        };
+
+        firewall_backend_probe(ctx);
+
         *ret = TAKE_PTR(ctx);
         return 0;
 }
@@ -40,47 +62,42 @@ FirewallContext *fw_ctx_free(FirewallContext *ctx) {
         if (!ctx)
                 return NULL;
 
-        if (ctx->firewall_backend == FW_BACKEND_NFTABLES)
-                fw_nftables_exit(ctx);
+        fw_nftables_exit(ctx);
 
         return mfree(ctx);
 }
 
 int fw_add_masquerade(
-                FirewallContext **fw_ctx,
+                FirewallContext **ctx,
                 bool add,
                 int af,
                 const union in_addr_union *source,
                 unsigned source_prefixlen) {
-        FirewallContext *ctx;
+
         int r;
 
-        if (!*fw_ctx) {
-                r = fw_ctx_new(fw_ctx);
+        assert(ctx);
+
+        if (!*ctx) {
+                r = fw_ctx_new(ctx);
                 if (r < 0)
                         return r;
         }
 
-        ctx = *fw_ctx;
-        if (ctx->firewall_backend == FW_BACKEND_NONE)
-                ctx->firewall_backend = firewall_backend_probe(ctx);
-
-        switch (ctx->firewall_backend) {
-        case FW_BACKEND_NONE:
-                return -EOPNOTSUPP;
+        switch ((*ctx)->backend) {
 #if HAVE_LIBIPTC
         case FW_BACKEND_IPTABLES:
                 return fw_iptables_add_masquerade(add, af, source, source_prefixlen);
 #endif
         case FW_BACKEND_NFTABLES:
-                return fw_nftables_add_masquerade(ctx, add, af, source, source_prefixlen);
+                return fw_nftables_add_masquerade(*ctx, add, af, source, source_prefixlen);
+        default:
+                return -EOPNOTSUPP;
         }
-
-        return -EOPNOTSUPP;
 }
 
 int fw_add_local_dnat(
-                FirewallContext **fw_ctx,
+                FirewallContext **ctx,
                 bool add,
                 int af,
                 int protocol,
@@ -88,28 +105,25 @@ int fw_add_local_dnat(
                 const union in_addr_union *remote,
                 uint16_t remote_port,
                 const union in_addr_union *previous_remote) {
-        FirewallContext *ctx;
 
-        if (!*fw_ctx) {
-                int ret = fw_ctx_new(fw_ctx);
-                if (ret < 0)
-                        return ret;
-        }
+        int r;
 
-        ctx = *fw_ctx;
-        if (ctx->firewall_backend == FW_BACKEND_NONE)
-                ctx->firewall_backend = firewall_backend_probe(ctx);
+        assert(ctx);
 
-        switch (ctx->firewall_backend) {
-        case FW_BACKEND_NONE:
-                return -EOPNOTSUPP;
-        case FW_BACKEND_NFTABLES:
-                return fw_nftables_add_local_dnat(ctx, add, af, protocol, local_port, remote, remote_port, previous_remote);
+        if (!*ctx) {
+                r = fw_ctx_new(ctx);
+                if (r < 0)
+                        return r;
+        }
+
+        switch ((*ctx)->backend) {
 #if HAVE_LIBIPTC
         case FW_BACKEND_IPTABLES:
                 return fw_iptables_add_local_dnat(add, af, protocol, local_port, remote, remote_port, previous_remote);
 #endif
+        case FW_BACKEND_NFTABLES:
+                return fw_nftables_add_local_dnat(*ctx, add, af, protocol, local_port, remote, remote_port, previous_remote);
+        default:
+                return -EOPNOTSUPP;
         }
-
-        return -EOPNOTSUPP;
 }
index 5180b429d3d7356ee246448fdbc53cc9a59f748d..7725a5e58dfd31a20ae5de8dc7fee653ab969be3 100644 (file)
@@ -9,19 +9,19 @@
 typedef struct FirewallContext FirewallContext;
 
 int fw_ctx_new(FirewallContext **ret);
-FirewallContext *fw_ctx_free(FirewallContext *fw_ctx);
+FirewallContext *fw_ctx_free(FirewallContext *ctx);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(FirewallContext *, fw_ctx_free);
 
 int fw_add_masquerade(
-                FirewallContext **fw_ctx,
+                FirewallContext **ctx,
                 bool add,
                 int af,
                 const union in_addr_union *source,
                 unsigned source_prefixlen);
 
 int fw_add_local_dnat(
-                FirewallContext **fw_ctx,
+                FirewallContext **ctx,
                 bool add,
                 int af,
                 int protocol,
index 8aaa9ccfa415bcbb10d4f6909799683db401cda3..6bbc8bd509e1dfc9b0562b5b3336bcfbaa331e3b 100644 (file)
@@ -122,7 +122,7 @@ static size_t TABLE_CELL_TO_INDEX(TableCell *cell) {
 }
 
 static TableCell* TABLE_INDEX_TO_CELL(size_t index) {
-        assert(index != (size_t) -1);
+        assert(index != SIZE_MAX);
         return SIZE_TO_PTR(index + 1);
 }
 
@@ -131,9 +131,9 @@ struct Table {
         size_t n_cells;
 
         bool header;   /* Whether to show the header row? */
-        size_t width;  /* If == 0 format this as wide as necessary. If (size_t) -1 format this to console
+        size_t width;  /* If == 0 format this as wide as necessary. If SIZE_MAX format this to console
                         * width or less wide, but not wider. Otherwise the width to format this table in. */
-        size_t cell_height_max; /* Maximum number of lines per cell. (If there are more, ellipsis is shown. If (size_t) -1 then no limit is set, the default. == 0 is not allowed.) */
+        size_t cell_height_max; /* Maximum number of lines per cell. (If there are more, ellipsis is shown. If SIZE_MAX then no limit is set, the default. == 0 is not allowed.) */
 
         TableData **data;
         size_t n_allocated;
@@ -161,8 +161,8 @@ Table *table_new_raw(size_t n_columns) {
         *t = (struct Table) {
                 .n_columns = n_columns,
                 .header = true,
-                .width = (size_t) -1,
-                .cell_height_max = (size_t) -1,
+                .width = SIZE_MAX,
+                .cell_height_max = SIZE_MAX,
         };
 
         return TAKE_PTR(t);
@@ -427,16 +427,16 @@ int table_add_cell_full(
                 p = NULL;
 
         /* If formatting parameters are left unspecified, copy from the previous row */
-        if (minimum_width == (size_t) -1)
+        if (minimum_width == SIZE_MAX)
                 minimum_width = p ? p->minimum_width : 1;
 
-        if (weight == (unsigned) -1)
+        if (weight == UINT_MAX)
                 weight = p ? p->weight : DEFAULT_WEIGHT;
 
-        if (align_percent == (unsigned) -1)
+        if (align_percent == UINT_MAX)
                 align_percent = p ? p->align_percent : 0;
 
-        if (ellipsize_percent == (unsigned) -1)
+        if (ellipsize_percent == UINT_MAX)
                 ellipsize_percent = p ? p->ellipsize_percent : 100;
 
         assert(align_percent <= 100);
@@ -591,7 +591,7 @@ int table_set_minimum_width(Table *t, TableCell *cell, size_t minimum_width) {
         assert(t);
         assert(cell);
 
-        if (minimum_width == (size_t) -1)
+        if (minimum_width == SIZE_MAX)
                 minimum_width = 1;
 
         r = table_dedup_cell(t, cell);
@@ -622,7 +622,7 @@ int table_set_weight(Table *t, TableCell *cell, unsigned weight) {
         assert(t);
         assert(cell);
 
-        if (weight == (unsigned) -1)
+        if (weight == UINT_MAX)
                 weight = DEFAULT_WEIGHT;
 
         r = table_dedup_cell(t, cell);
@@ -639,7 +639,7 @@ int table_set_align_percent(Table *t, TableCell *cell, unsigned percent) {
         assert(t);
         assert(cell);
 
-        if (percent == (unsigned) -1)
+        if (percent == UINT_MAX)
                 percent = 0;
 
         assert(percent <= 100);
@@ -658,7 +658,7 @@ int table_set_ellipsize_percent(Table *t, TableCell *cell, unsigned percent) {
         assert(t);
         assert(cell);
 
-        if (percent == (unsigned) -1)
+        if (percent == UINT_MAX)
                 percent = 100;
 
         assert(percent <= 100);
@@ -1067,7 +1067,7 @@ void table_set_width(Table *t, size_t width) {
 
 void table_set_cell_height_max(Table *t, size_t height) {
         assert(t);
-        assert(height >= 1 || height == (size_t) -1);
+        assert(height >= 1 || height == SIZE_MAX);
 
         t->cell_height_max = height;
 }
@@ -1078,23 +1078,27 @@ int table_set_empty_string(Table *t, const char *empty) {
         return free_and_strdup(&t->empty_string, empty);
 }
 
-int table_set_display_all(Table *t) {
+static int table_set_display_all(Table *t) {
+        size_t *d;
+
         assert(t);
 
-        size_t allocated = t->n_display_map;
+        /* Initialize the display map to the identity */
 
-        if (!GREEDY_REALLOC(t->display_map, allocated, MAX(t->n_columns, allocated)))
+        d = reallocarray(t->display_map, t->n_columns, sizeof(size_t));
+        if (!d)
                 return -ENOMEM;
 
         for (size_t i = 0; i < t->n_columns; i++)
-                t->display_map[i] = i;
+                d[i] = i;
 
+        t->display_map = d;
         t->n_display_map = t->n_columns;
 
         return 0;
 }
 
-int table_set_display(Table *t, size_t first_column, ...) {
+int table_set_display_internal(Table *t, size_t first_column, ...) {
         size_t allocated, column;
         va_list ap;
 
@@ -1115,7 +1119,7 @@ int table_set_display(Table *t, size_t first_column, ...) {
                 t->display_map[t->n_display_map++] = column;
 
                 column = va_arg(ap, size_t);
-                if (column == (size_t) -1)
+                if (column == SIZE_MAX)
                         break;
 
         }
@@ -1124,7 +1128,7 @@ int table_set_display(Table *t, size_t first_column, ...) {
         return 0;
 }
 
-int table_set_sort(Table *t, size_t first_column, ...) {
+int table_set_sort_internal(Table *t, size_t first_column, ...) {
         size_t allocated, column;
         va_list ap;
 
@@ -1145,7 +1149,7 @@ int table_set_sort(Table *t, size_t first_column, ...) {
                 t->sort_map[t->n_sort_map++] = column;
 
                 column = va_arg(ap, size_t);
-                if (column == (size_t) -1)
+                if (column == SIZE_MAX)
                         break;
         }
         va_end(ap);
@@ -1317,9 +1321,9 @@ static int table_data_compare(const size_t *a, const size_t *b, Table *t) {
 }
 
 static char* format_strv_width(char **strv, size_t column_width) {
+        _cleanup_free_ char *buf = NULL; /* buf must be freed after f */
         _cleanup_fclose_ FILE *f = NULL;
         size_t sz = 0;
-        _cleanup_free_ char *buf = NULL;
 
         f = open_memstream_unlocked(&buf, &sz);
         if (!f)
@@ -1758,7 +1762,7 @@ static int console_width_height(
                         k = utf8_console_width(s);
                         s = NULL;
                 }
-                if (k == (size_t) -1)
+                if (k == SIZE_MAX)
                         return -EINVAL;
                 if (k > max_width)
                         max_width = k;
@@ -1794,7 +1798,7 @@ static int table_data_requested_width_height(
         if (!t)
                 return -ENOMEM;
 
-        if (table->cell_height_max != (size_t) -1) {
+        if (table->cell_height_max != SIZE_MAX) {
                 r = string_truncate_lines(t, table->cell_height_max, &truncated);
                 if (r < 0)
                         return r;
@@ -1808,7 +1812,7 @@ static int table_data_requested_width_height(
         if (r < 0)
                 return r;
 
-        if (d->maximum_width != (size_t) -1 && width > d->maximum_width)
+        if (d->maximum_width != SIZE_MAX && width > d->maximum_width)
                 width = d->maximum_width;
 
         if (width < d->minimum_width)
@@ -1965,14 +1969,14 @@ int table_print(Table *t, FILE *f) {
 
         for (size_t j = 0; j < display_columns; j++) {
                 minimum_width[j] = 1;
-                maximum_width[j] = (size_t) -1;
+                maximum_width[j] = SIZE_MAX;
         }
 
         for (unsigned pass = 0; pass < 2; pass++) {
                 /* First pass: determine column sizes */
 
                 for (size_t j = 0; j < display_columns; j++)
-                        requested_width[j] = (size_t) -1;
+                        requested_width[j] = SIZE_MAX;
 
                 bool any_soft = false;
 
@@ -2020,7 +2024,7 @@ int table_print(Table *t, FILE *f) {
                                 }
 
                                 /* Determine the biggest width that any cell in this column would like to have */
-                                if (requested_width[j] == (size_t) -1 ||
+                                if (requested_width[j] == SIZE_MAX ||
                                     requested_width[j] < req_width)
                                         requested_width[j] = req_width;
 
@@ -2029,8 +2033,8 @@ int table_print(Table *t, FILE *f) {
                                         minimum_width[j] = d->minimum_width;
 
                                 /* Determine the maximum width any cell in this column needs */
-                                if (d->maximum_width != (size_t) -1 &&
-                                    (maximum_width[j] == (size_t) -1 ||
+                                if (d->maximum_width != SIZE_MAX &&
+                                    (maximum_width[j] == SIZE_MAX ||
                                      maximum_width[j] > d->maximum_width))
                                         maximum_width[j] = d->maximum_width;
 
@@ -2049,8 +2053,8 @@ int table_print(Table *t, FILE *f) {
 
                         table_minimum_width += minimum_width[j];
 
-                        if (maximum_width[j] == (size_t) -1)
-                                table_maximum_width = (size_t) -1;
+                        if (maximum_width[j] == SIZE_MAX)
+                                table_maximum_width = SIZE_MAX;
                         else
                                 table_maximum_width += maximum_width[j];
 
@@ -2058,7 +2062,7 @@ int table_print(Table *t, FILE *f) {
                 }
 
                 /* Calculate effective table width */
-                if (t->width != 0 && t->width != (size_t) -1)
+                if (t->width != 0 && t->width != SIZE_MAX)
                         table_effective_width = t->width;
                 else if (t->width == 0 ||
                          ((pass > 0 || !any_soft) && (pager_have() || !isatty(STDOUT_FILENO))))
@@ -2066,7 +2070,7 @@ int table_print(Table *t, FILE *f) {
                 else
                         table_effective_width = MIN(table_requested_width, columns());
 
-                if (table_maximum_width != (size_t) -1 && table_effective_width > table_maximum_width)
+                if (table_maximum_width != SIZE_MAX && table_effective_width > table_maximum_width)
                         table_effective_width = table_maximum_width;
 
                 if (table_effective_width < table_minimum_width)
@@ -2091,7 +2095,7 @@ int table_print(Table *t, FILE *f) {
                                 else
                                         width[j] = requested_width[j] + (extra * column_weight[j]) / weight_sum;
 
-                                if (maximum_width[j] != (size_t) -1 && width[j] > maximum_width[j])
+                                if (maximum_width[j] != SIZE_MAX && width[j] > maximum_width[j])
                                         width[j] = maximum_width[j];
 
                                 if (width[j] < minimum_width[j])
@@ -2119,7 +2123,7 @@ int table_print(Table *t, FILE *f) {
                         extra = table_effective_width - table_minimum_width;
 
                         for (size_t j = 0; j < display_columns; j++)
-                                width[j] = (size_t) -1;
+                                width[j] = SIZE_MAX;
 
                         for (;;) {
                                 bool restart = false;
@@ -2128,7 +2132,7 @@ int table_print(Table *t, FILE *f) {
                                         size_t delta, w;
 
                                         /* Did this column already get something assigned? If so, let's skip to the next */
-                                        if (width[j] != (size_t) -1)
+                                        if (width[j] != SIZE_MAX)
                                                 continue;
 
                                         if (weight_sum == 0)
@@ -2210,7 +2214,7 @@ int table_print(Table *t, FILE *f) {
                                         return r;
                                 if (r > 0) {
                                         /* There are more lines to come */
-                                        if ((t->cell_height_max == (size_t) -1 || n_subline + 1 < t->cell_height_max))
+                                        if ((t->cell_height_max == SIZE_MAX || n_subline + 1 < t->cell_height_max))
                                                 more_sublines = true; /* There are more lines to come */
                                         else
                                                 lines_truncated = true;
@@ -2320,8 +2324,8 @@ int table_print(Table *t, FILE *f) {
 }
 
 int table_format(Table *t, char **ret) {
+        _cleanup_free_ char *buf = NULL;
         _cleanup_fclose_ FILE *f = NULL;
-        char *buf = NULL;
         size_t sz = 0;
         int r;
 
@@ -2335,7 +2339,7 @@ int table_format(Table *t, char **ret) {
 
         f = safe_fclose(f);
 
-        *ret = buf;
+        *ret = TAKE_PTR(buf);
 
         return 0;
 }
@@ -2445,7 +2449,7 @@ static int table_data_to_json(TableData *d, JsonVariant **ret) {
 
         case TABLE_SIZE:
         case TABLE_BPS:
-                if (d->size == (uint64_t) -1)
+                if (d->size == UINT64_MAX)
                         return json_variant_new_null(ret);
 
                 return json_variant_new_unsigned(ret, d->size);
index 5a8c1adfae85179e4c14f9e8251f839e2aa991b7..57f167f7f11eb749db15863d61b61dea79015e2a 100644 (file)
@@ -73,7 +73,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Table*, table_unref);
 
 int table_add_cell_full(Table *t, TableCell **ret_cell, TableDataType type, const void *data, size_t minimum_width, size_t maximum_width, unsigned weight, unsigned align_percent, unsigned ellipsize_percent);
 static inline int table_add_cell(Table *t, TableCell **ret_cell, TableDataType type, const void *data) {
-        return table_add_cell_full(t, ret_cell, type, data, (size_t) -1, (size_t) -1, (unsigned) -1, (unsigned) -1, (unsigned) -1);
+        return table_add_cell_full(t, ret_cell, type, data, SIZE_MAX, SIZE_MAX, UINT_MAX, UINT_MAX, UINT_MAX);
 }
 int table_add_cell_stringf(Table *t, TableCell **ret_cell, const char *format, ...) _printf_(3, 4);
 
@@ -100,9 +100,10 @@ void table_set_header(Table *table, bool b);
 void table_set_width(Table *t, size_t width);
 void table_set_cell_height_max(Table *t, size_t height);
 int table_set_empty_string(Table *t, const char *empty);
-int table_set_display_all(Table *t);
-int table_set_display(Table *t, size_t first_column, ...);
-int table_set_sort(Table *t, size_t first_column, ...);
+int table_set_display_internal(Table *t, size_t first_column, ...);
+#define table_set_display(...) table_set_display_internal(__VA_ARGS__, SIZE_MAX)
+int table_set_sort_internal(Table *t, size_t first_column, ...);
+#define table_set_sort(...) table_set_sort_internal(__VA_ARGS__, SIZE_MAX)
 int table_set_reverse(Table *t, size_t column, bool b);
 int table_hide_column_from_display(Table *t, size_t column);
 
index 292b97cd6929b506ecef5f30e5ceeb80cc0a3dba..f683f05981596b0c9c627a62338ebdc7c2b7b9ba 100644 (file)
@@ -79,34 +79,95 @@ int fstab_is_mount_point(const char *mount) {
         return false;
 }
 
-int fstab_filter_options(const char *opts, const char *names,
-                         const char **ret_namefound, char **ret_value, char **ret_filtered) {
+int fstab_filter_options(
+                const char *opts,
+                const char *names,
+                const char **ret_namefound,
+                char **ret_value,
+                char ***ret_values,
+                char **ret_filtered) {
+
         const char *name, *namefound = NULL, *x;
-        _cleanup_strv_free_ char **stor = NULL;
-        _cleanup_free_ char *v = NULL, **strv = NULL;
+        _cleanup_strv_free_ char **stor = NULL, **values = NULL;
+        _cleanup_free_ char *value = NULL, **filtered = NULL;
         int r;
 
         assert(names && *names);
+        assert(!(ret_value && ret_values));
 
         if (!opts)
                 goto answer;
 
-        /* If !ret_value and !ret_filtered, this function is not allowed to fail. */
+        /* Finds any options matching 'names', and returns:
+         * - the last matching option name in ret_namefound,
+         * - the last matching value in ret_value,
+         * - any matching values in ret_values,
+         * - the rest of the option string in ret_filtered.
+         *
+         * If !ret_value and !ret_values and !ret_filtered, this function is not allowed to fail.
+         *
+         * Returns negative on error, true if any matching options were found, false otherwise. */
+
+        if (ret_filtered || ret_value || ret_values) {
+                /* For backwards compatibility, we need to pass-through escape characters.
+                 * The only ones we "consume" are the ones used as "\," or "\\". */
+                r = strv_split_full(&stor, opts, ",", EXTRACT_UNESCAPE_SEPARATORS | EXTRACT_UNESCAPE_RELAX);
+                if (r < 0)
+                        return r;
+
+                filtered = memdup(stor, sizeof(char*) * (strv_length(stor) + 1));
+                if (!filtered)
+                        return -ENOMEM;
+
+                char **t = filtered;
+                for (char **s = t; *s; s++) {
+                        NULSTR_FOREACH(name, names) {
+                                x = startswith(*s, name);
+                                if (!x)
+                                        continue;
+                                /* Match name, but when ret_values, only when followed by assignment. */
+                                if (*x == '=' || (!ret_values && *x == '\0'))
+                                        goto found;
+                        }
 
-        if (!ret_filtered) {
+                        *t = *s;
+                        t++;
+                        continue;
+                found:
+                        /* Keep the last occurrence found */
+                        namefound = name;
+
+                        if (ret_value || ret_values) {
+                                assert(IN_SET(*x, '=', '\0'));
+
+                                if (ret_value) {
+                                        r = free_and_strdup(&value, *x == '=' ? x + 1 : NULL);
+                                        if (r < 0)
+                                                return r;
+                                } else if (*x) {
+                                        r = strv_extend(&values, x + 1);
+                                        if (r < 0)
+                                                return r;
+                                }
+                        }
+                }
+                *t = NULL;
+        } else
                 for (const char *word = opts;;) {
                         const char *end = word;
 
-                        /* Look for an *non-escaped* comma separator. Only commas can be escaped, so "\," is
-                         * the only valid escape sequence, so we can do a very simple test here. */
+                        /* Look for a *non-escaped* comma separator. Only commas and backslashes can be
+                         * escaped, so "\," and "\\" are the only valid escape sequences, and we can do a
+                         * very simple test here. */
                         for (;;) {
-                                size_t n = strcspn(end, ",");
+                                end += strcspn(end, ",\\");
 
-                                end += n;
-                                if (n > 0 && end[-1] == '\\')
-                                        end++;
-                                else
+                                if (IN_SET(*end, ',', '\0'))
                                         break;
+                                assert(*end == '\\');
+                                end ++;                 /* Skip the backslash */
+                                if (*end != '\0')
+                                        end ++;         /* Skip the escaped char, but watch out for a trailing comma */
                         }
 
                         NULSTR_FOREACH(name, names) {
@@ -119,17 +180,6 @@ int fstab_filter_options(const char *opts, const char *names,
                                 x = word + strlen(name);
                                 if (IN_SET(*x, '\0', '=', ',')) {
                                         namefound = name;
-                                        if (ret_value) {
-                                                bool eq = *x == '=';
-                                                assert(eq || IN_SET(*x, ',', '\0'));
-
-                                                r = free_and_strndup(&v,
-                                                                     eq ? x + 1 : NULL,
-                                                                     eq ? end - x - 1 : 0);
-                                                if (r < 0)
-                                                        return r;
-                                        }
-
                                         break;
                                 }
                         }
@@ -139,38 +189,6 @@ int fstab_filter_options(const char *opts, const char *names,
                         else
                                 break;
                 }
-        } else {
-                r = strv_split_full(&stor, opts, ",", EXTRACT_DONT_COALESCE_SEPARATORS | EXTRACT_UNESCAPE_SEPARATORS);
-                if (r < 0)
-                        return r;
-
-                strv = memdup(stor, sizeof(char*) * (strv_length(stor) + 1));
-                if (!strv)
-                        return -ENOMEM;
-
-                char **t = strv;
-                for (char **s = strv; *s; s++) {
-                        NULSTR_FOREACH(name, names) {
-                                x = startswith(*s, name);
-                                if (x && IN_SET(*x, '\0', '='))
-                                        goto found;
-                        }
-
-                        *t = *s;
-                        t++;
-                        continue;
-                found:
-                        /* Keep the last occurrence found */
-                        namefound = name;
-                        if (ret_value) {
-                                assert(IN_SET(*x, '=', '\0'));
-                                r = free_and_strdup(&v, *x == '=' ? x + 1 : NULL);
-                                if (r < 0)
-                                        return r;
-                        }
-                }
-                *t = NULL;
-        }
 
 answer:
         if (ret_namefound)
@@ -178,54 +196,27 @@ answer:
         if (ret_filtered) {
                 char *f;
 
-                f = strv_join_full(strv, ",", NULL, true);
+                f = strv_join_full(filtered, ",", NULL, true);
                 if (!f)
                         return -ENOMEM;
 
                 *ret_filtered = f;
         }
         if (ret_value)
-                *ret_value = TAKE_PTR(v);
+                *ret_value = TAKE_PTR(value);
+        if (ret_values)
+                *ret_values = TAKE_PTR(values);
 
         return !!namefound;
 }
 
-int fstab_extract_values(const char *opts, const char *name, char ***values) {
-        _cleanup_strv_free_ char **optsv = NULL, **res = NULL;
-        char **s;
-
-        assert(opts);
-        assert(name);
-        assert(values);
-
-        optsv = strv_split(opts, ",");
-        if (!optsv)
-                return -ENOMEM;
-
-        STRV_FOREACH(s, optsv) {
-                char *arg;
-                int r;
-
-                arg = startswith(*s, name);
-                if (!arg || *arg != '=')
-                        continue;
-                r = strv_extend(&res, arg + 1);
-                if (r < 0)
-                        return r;
-        }
-
-        *values = TAKE_PTR(res);
-
-        return !!*values;
-}
-
 int fstab_find_pri(const char *options, int *ret) {
         _cleanup_free_ char *opt = NULL;
         int r, pri;
 
         assert(ret);
 
-        r = fstab_filter_options(options, "pri\0", NULL, &opt, NULL);
+        r = fstab_filter_options(options, "pri\0", NULL, &opt, NULL, NULL);
         if (r < 0)
                 return r;
         if (r == 0 || !opt)
index 1a602cb56b292fb22945c72dce6e5dadfbcfee77..6b596baafa100c843d38c704ab56d27665255aaa 100644 (file)
@@ -10,12 +10,16 @@ bool fstab_is_extrinsic(const char *mount, const char *opts);
 int fstab_is_mount_point(const char *mount);
 int fstab_has_fstype(const char *fstype);
 
-int fstab_filter_options(const char *opts, const char *names, const char **namefound, char **value, char **filtered);
-
-int fstab_extract_values(const char *opts, const char *name, char ***values);
+int fstab_filter_options(
+                const char *opts,
+                const char *names,
+                const char **ret_namefound,
+                char **ret_value,
+                char ***ret_values,
+                char **ret_filtered);
 
 static inline bool fstab_test_option(const char *opts, const char *names) {
-        return !!fstab_filter_options(opts, names, NULL, NULL, NULL);
+        return !!fstab_filter_options(opts, names, NULL, NULL, NULL, NULL);
 }
 
 int fstab_find_pri(const char *options, int *ret);
@@ -26,7 +30,7 @@ static inline bool fstab_test_yes_no_option(const char *opts, const char *yes_no
         /* If first name given is last, return 1.
          * If second name given is last or neither is found, return 0. */
 
-        assert_se(fstab_filter_options(opts, yes_no, &opt, NULL, NULL) >= 0);
+        assert_se(fstab_filter_options(opts, yes_no, &opt, NULL, NULL, NULL) >= 0);
 
         return opt == yes_no;
 }
index 8b95c772db184b75cac7df3ef74f9d603276eda9..5b9c43252714b7b891f88b823af9d82c5f75bd65 100644 (file)
@@ -215,9 +215,13 @@ int generator_write_timeouts(
 
         r = fstab_filter_options(opts, "comment=systemd.device-timeout\0"
                                        "x-systemd.device-timeout\0",
-                                 NULL, &timeout, filtered);
-        if (r <= 0)
-                return r;
+                                 NULL, &timeout, NULL, filtered);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to parse fstab options, ignoring: %m");
+                return 0;
+        }
+        if (r == 0)
+                return 0;
 
         r = parse_sec_fix_0(timeout, &u);
         if (r < 0) {
index 15ea2f0a1f1af01660cc1a0efa2e7049a06a30af..a96f5ee02daba899a757806dcbe8cd9f856c381a 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "gpt.h"
 #include "string-util.h"
+#include "utf8.h"
 
 const GptPartitionType gpt_partition_type_table[] = {
         { GPT_ROOT_X86,              "root-x86"              },
@@ -95,3 +96,13 @@ int gpt_partition_type_uuid_from_string(const char *s, sd_id128_t *ret) {
 
         return sd_id128_from_string(s, ret);
 }
+
+int gpt_partition_label_valid(const char *s) {
+        _cleanup_free_ char16_t *recoded = NULL;
+
+        recoded = utf8_to_utf16(s, strlen(s));
+        if (!recoded)
+                return -ENOMEM;
+
+        return char16_strlen(recoded) <= 36;
+}
index 315cde6be3224f38f645ed1e2741aa8e52dca2ce..2e0f50c3c648fc83798261ff301524dd63676c96 100644 (file)
@@ -126,3 +126,5 @@ typedef struct GptPartitionType {
 } GptPartitionType;
 
 extern const GptPartitionType gpt_partition_type_table[];
+
+int gpt_partition_label_valid(const char *s);
index 183da5865e0247914fae5a2be8e6e1d08605bb6c..c6cea43126f866a8aac41862f1eced06e27caf46 100644 (file)
@@ -705,132 +705,88 @@ static int is_symlink_with_known_name(const UnitFileInstallInfo *i, const char *
         return false;
 }
 
-static int find_symlinks_fd(
+static int find_symlinks_in_directory(
+                DIR *dir,
+                const char *dir_path,
                 const char *root_dir,
                 const UnitFileInstallInfo *i,
                 bool match_aliases,
                 bool ignore_same_name,
-                int fd,
-                const char *path,
                 const char *config_path,
                 bool *same_name_link) {
 
-        _cleanup_closedir_ DIR *d = NULL;
         struct dirent *de;
         int r = 0;
 
-        assert(i);
-        assert(fd >= 0);
-        assert(path);
-        assert(config_path);
-        assert(same_name_link);
-
-        d = fdopendir(fd);
-        if (!d) {
-                safe_close(fd);
-                return -errno;
-        }
-
-        FOREACH_DIRENT(de, d, return -errno) {
-
-                dirent_ensure_type(d, de);
-
-                if (de->d_type == DT_DIR) {
-                        _cleanup_free_ char *p = NULL;
-                        int nfd, q;
-
-                        nfd = openat(fd, de->d_name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW);
-                        if (nfd < 0) {
-                                if (errno == ENOENT)
-                                        continue;
+        FOREACH_DIRENT(de, dir, return -errno) {
+                _cleanup_free_ char *dest = NULL;
+                bool found_path = false, found_dest, b = false;
+                int q;
 
-                                if (r == 0)
-                                        r = -errno;
-                                continue;
-                        }
+                dirent_ensure_type(dir, de);
 
-                        p = path_make_absolute(de->d_name, path);
-                        if (!p) {
-                                safe_close(nfd);
-                                return -ENOMEM;
-                        }
+                if (de->d_type != DT_LNK)
+                        continue;
 
-                        /* This will close nfd, regardless whether it succeeds or not */
-                        q = find_symlinks_fd(root_dir, i, match_aliases, ignore_same_name, nfd,
-                                             p, config_path, same_name_link);
-                        if (q > 0)
-                                return 1;
+                /* Acquire symlink destination */
+                q = readlinkat_malloc(dirfd(dir), de->d_name, &dest);
+                if (q == -ENOENT)
+                        continue;
+                if (q < 0) {
                         if (r == 0)
                                 r = q;
+                        continue;
+                }
 
-                } else if (de->d_type == DT_LNK) {
-                        _cleanup_free_ char *p = NULL, *dest = NULL;
-                        bool found_path = false, found_dest, b = false;
-                        int q;
+                /* Make absolute */
+                if (!path_is_absolute(dest)) {
+                        char *x;
 
-                        /* Acquire symlink name */
-                        p = path_make_absolute(de->d_name, path);
-                        if (!p)
+                        x = path_join(dir_path, dest);
+                        if (!x)
                                 return -ENOMEM;
 
-                        /* Acquire symlink destination */
-                        q = readlink_malloc(p, &dest);
-                        if (q == -ENOENT)
-                                continue;
-                        if (q < 0) {
-                                if (r == 0)
-                                        r = q;
-                                continue;
-                        }
+                        free_and_replace(dest, x);
+                }
 
-                        /* Make absolute */
-                        if (!path_is_absolute(dest)) {
-                                char *x;
+                assert(unit_name_is_valid(i->name, UNIT_NAME_ANY));
+                if (!ignore_same_name)
+                               /* Check if the symlink itself matches what we are looking for.
+                                *
+                                * If ignore_same_name is specified, we are in one of the directories which
+                                * have lower priority than the unit file, and even if a file or symlink with
+                                * this name was found, we should ignore it. */
+                                found_path = streq(de->d_name, i->name);
 
-                                x = path_join(root_dir, dest);
-                                if (!x)
-                                        return -ENOMEM;
+                /* Check if what the symlink points to matches what we are looking for */
+                found_dest = streq(basename(dest), i->name);
 
-                                free_and_replace(dest, x);
-                        }
+                if (found_path && found_dest) {
+                        _cleanup_free_ char *p = NULL, *t = NULL;
 
-                        assert(unit_name_is_valid(i->name, UNIT_NAME_ANY));
-                        if (!ignore_same_name)
-                                /* Check if the symlink itself matches what we are looking for.
-                                 *
-                                 * If ignore_same_name is specified, we are in one of the directories which
-                                 * have lower priority than the unit file, and even if a file or symlink with
-                                 * this name was found, we should ignore it. */
-                                 found_path = streq(de->d_name, i->name);
-
-                        /* Check if what the symlink points to matches what we are looking for */
-                        found_dest = streq(basename(dest), i->name);
-
-                        if (found_path && found_dest) {
-                                _cleanup_free_ char *t = NULL;
-
-                                /* Filter out same name links in the main
-                                 * config path */
-                                t = path_make_absolute(i->name, config_path);
-                                if (!t)
-                                        return -ENOMEM;
+                        /* Filter out same name links in the main
+                         * config path */
+                        p = path_make_absolute(de->d_name, dir_path);
+                        t = path_make_absolute(i->name, config_path);
 
-                                b = path_equal(t, p);
-                        }
+                        if (!p || !t)
+                                return -ENOMEM;
 
-                        if (b)
-                                *same_name_link = true;
-                        else if (found_path || found_dest) {
-                                if (!match_aliases)
-                                        return 1;
-
-                                /* Check if symlink name is in the set of names used by [Install] */
-                                q = is_symlink_with_known_name(i, de->d_name);
-                                if (q < 0)
-                                        return q;
-                                if (q > 0)
-                                        return 1;
-                        }
+                        b = path_equal(p, t);
+                }
+
+                if (b)
+                        *same_name_link = true;
+                else if (found_path || found_dest) {
+                        if (!match_aliases)
+                                return 1;
+
+                        /* Check if symlink name is in the set of names used by [Install] */
+                        q = is_symlink_with_known_name(i, de->d_name);
+                        if (q < 0)
+                                return q;
+                        if (q > 0)
+                                return 1;
                 }
         }
 
@@ -845,22 +801,55 @@ static int find_symlinks(
                 const char *config_path,
                 bool *same_name_link) {
 
-        int fd;
+        _cleanup_closedir_ DIR *config_dir = NULL;
+        struct dirent *de;
+        int r = 0;
 
         assert(i);
         assert(config_path);
         assert(same_name_link);
 
-        fd = open(config_path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC);
-        if (fd < 0) {
+        config_dir = opendir(config_path);
+        if (!config_dir) {
                 if (IN_SET(errno, ENOENT, ENOTDIR, EACCES))
                         return 0;
                 return -errno;
         }
 
-        /* This takes possession of fd and closes it */
-        return find_symlinks_fd(root_dir, i, match_name, ignore_same_name, fd,
-                                config_path, config_path, same_name_link);
+        FOREACH_DIRENT(de, config_dir, return -errno) {
+                const char *suffix;
+                _cleanup_free_ const char *path = NULL;
+                _cleanup_closedir_ DIR *d = NULL;
+
+                dirent_ensure_type(config_dir, de);
+
+                if (de->d_type != DT_DIR)
+                        continue;
+
+                suffix = strrchr(de->d_name, '.');
+                if (!STRPTR_IN_SET(suffix, ".wants", ".requires"))
+                        continue;
+
+                path = path_join(config_path, de->d_name);
+                if (!path)
+                        return -ENOMEM;
+
+                d = opendir(path);
+                if (!d) {
+                        log_error_errno(errno, "Failed to open directory '%s' while scanning for symlinks, ignoring: %m", path);
+                        continue;
+                }
+
+                r = find_symlinks_in_directory(d, path, root_dir, i, match_name, ignore_same_name, config_path, same_name_link);
+                if (r > 0)
+                        return 1;
+                else if (r < 0)
+                        log_debug_errno(r, "Failed to lookup for symlinks in '%s': %m", path);
+        }
+
+        /* We didn't find any suitable symlinks in .wants or .requires directories, let's look for linked unit files in this directory. */
+        rewinddir(config_dir);
+        return find_symlinks_in_directory(config_dir, config_path, root_dir, i, match_name, ignore_same_name, config_path, same_name_link);
 }
 
 static int find_symlinks_in_scope(
@@ -1335,8 +1324,8 @@ static int unit_file_load_or_readlink(
                 const char *path,
                 const char *root_dir,
                 SearchFlags flags) {
+
         _cleanup_free_ char *resolved = NULL;
-        struct stat st;
         int r;
 
         r = unit_file_load(c, info, path, root_dir, flags);
@@ -1351,9 +1340,7 @@ static int unit_file_load_or_readlink(
                  * so let's see if the path is a (possibly dangling) symlink to /dev/null. */
                 info->type = UNIT_FILE_TYPE_MASKED;
 
-        else if (r > 0 &&
-                 stat(resolved, &st) >= 0 &&
-                 null_or_empty(&st))
+        else if (r > 0 && null_or_empty_path(resolved) > 0)
 
                 info->type = UNIT_FILE_TYPE_MASKED;
 
index 305e4f74b8fcd89aa009228dcb1c0204a74201c3..948faa0ca7d8b479fc05fae6cbe3f75f69d8903e 100644 (file)
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
+#include <stdbool.h>
+
 typedef enum UnitFilePresetMode UnitFilePresetMode;
 typedef enum UnitFileChangeType UnitFileChangeType;
 typedef enum UnitFileFlags UnitFileFlags;
@@ -9,8 +11,6 @@ typedef struct UnitFileChange UnitFileChange;
 typedef struct UnitFileList UnitFileList;
 typedef struct UnitFileInstallInfo UnitFileInstallInfo;
 
-#include <stdbool.h>
-
 #include "hashmap.h"
 #include "macro.h"
 #include "path-lookup.h"
index d391eb01cc1a7ba49f4adb665d64b777828f766d..ef1e937645914ee714153b8e11f636ce3c4732ef 100644 (file)
@@ -393,10 +393,10 @@ int json_variant_new_stringn(JsonVariant **ret, const char *s, size_t n) {
 
         assert_return(ret, -EINVAL);
         if (!s) {
-                assert_return(IN_SET(n, 0, (size_t) -1), -EINVAL);
+                assert_return(IN_SET(n, 0, SIZE_MAX), -EINVAL);
                 return json_variant_new_null(ret);
         }
-        if (n == (size_t) -1) /* determine length automatically */
+        if (n == SIZE_MAX) /* determine length automatically */
                 n = strlen(s);
         else if (memchr(s, 0, n)) /* don't allow embedded NUL, as we can't express that in JSON */
                 return -EINVAL;
@@ -2508,7 +2508,7 @@ static int json_parse_string(const char **p, char **ret) {
                         continue;
                 }
 
-                len = utf8_encoded_valid_unichar(c, (size_t) -1);
+                len = utf8_encoded_valid_unichar(c, SIZE_MAX);
                 if (len < 0)
                         return len;
 
@@ -2828,7 +2828,7 @@ typedef struct JsonStack {
         size_t n_elements, n_elements_allocated;
         unsigned line_before;
         unsigned column_before;
-        size_t n_suppress; /* When building: if > 0, suppress this many subsequent elements. If == (size_t) -1, suppress all subsequent elements */
+        size_t n_suppress; /* When building: if > 0, suppress this many subsequent elements. If == SIZE_MAX, suppress all subsequent elements */
 } JsonStack;
 
 static void json_stack_release(JsonStack *s) {
@@ -3532,7 +3532,7 @@ int json_buildv(JsonVariant **ret, va_list ap) {
 
                         stack[n_stack++] = (JsonStack) {
                                 .expect = EXPECT_ARRAY_ELEMENT,
-                                .n_suppress = current->n_suppress != 0 ? (size_t) -1 : 0, /* if we shall suppress the
+                                .n_suppress = current->n_suppress != 0 ? SIZE_MAX : 0, /* if we shall suppress the
                                                                                            * new array, then we should
                                                                                            * also suppress all array
                                                                                            * members */
@@ -3729,7 +3729,7 @@ int json_buildv(JsonVariant **ret, va_list ap) {
 
                         stack[n_stack++] = (JsonStack) {
                                 .expect = EXPECT_OBJECT_KEY,
-                                .n_suppress = current->n_suppress != 0 ? (size_t) -1 : 0, /* if we shall suppress the
+                                .n_suppress = current->n_suppress != 0 ? SIZE_MAX : 0, /* if we shall suppress the
                                                                                            * new object, then we should
                                                                                            * also suppress all object
                                                                                            * members */
@@ -3801,7 +3801,7 @@ int json_buildv(JsonVariant **ret, va_list ap) {
 
                         n_subtract = 1; /* we generated one item */
 
-                        if (!b && current->n_suppress != (size_t) -1)
+                        if (!b && current->n_suppress != SIZE_MAX)
                                 current->n_suppress += 2; /* Suppress this one and the next item */
 
                         current->expect = EXPECT_OBJECT_VALUE;
@@ -3819,9 +3819,9 @@ int json_buildv(JsonVariant **ret, va_list ap) {
                 }
 
                 /* If we are supposed to suppress items, let's subtract how many items where generated from that
-                 * counter. Except if the counter is (size_t) -1, i.e. we shall suppress an infinite number of elements
+                 * counter. Except if the counter is SIZE_MAX, i.e. we shall suppress an infinite number of elements
                  * on this stack level */
-                if (current->n_suppress != (size_t) -1) {
+                if (current->n_suppress != SIZE_MAX) {
                         if (current->n_suppress <= n_subtract) /* Saturated */
                                 current->n_suppress = 0;
                         else
@@ -4233,7 +4233,7 @@ int json_dispatch_uid_gid(const char *name, JsonVariant *variant, JsonDispatchFl
         assert_cc(sizeof(gid_t) == sizeof(uint32_t));
 
         DISABLE_WARNING_TYPE_LIMITS;
-        assert_cc(((uid_t) -1 < (uid_t) 0) == ((gid_t) -1 < (gid_t) 0));
+        assert_cc((UID_INVALID < (uid_t) 0) == (GID_INVALID < (gid_t) 0));
         REENABLE_WARNING;
 
         if (json_variant_is_null(variant)) {
@@ -4448,7 +4448,7 @@ int json_variant_unbase64(JsonVariant *v, void **ret, size_t *ret_size) {
         if (!json_variant_is_string(v))
                 return -EINVAL;
 
-        return unbase64mem(json_variant_string(v), (size_t) -1, ret, ret_size);
+        return unbase64mem(json_variant_string(v), SIZE_MAX, ret, ret_size);
 }
 
 int json_variant_unhex(JsonVariant *v, void **ret, size_t *ret_size) {
@@ -4456,7 +4456,7 @@ int json_variant_unhex(JsonVariant *v, void **ret, size_t *ret_size) {
         if (!json_variant_is_string(v))
                 return -EINVAL;
 
-        return unhexmem(json_variant_string(v), (size_t) -1, ret, ret_size);
+        return unhexmem(json_variant_string(v), SIZE_MAX, ret, ret_size);
 }
 
 static const char* const json_variant_type_table[_JSON_VARIANT_TYPE_MAX] = {
index d14740db882b77f8e7979e7ad51aa40abe5d940c..148701a54fed71ba4faf834bda77971da477764f 100644 (file)
@@ -71,7 +71,7 @@ int json_variant_new_null(JsonVariant **ret);
 int json_variant_new_id128(JsonVariant **ret, sd_id128_t id);
 
 static inline int json_variant_new_string(JsonVariant **ret, const char *s) {
-        return json_variant_new_stringn(ret, s, (size_t) -1);
+        return json_variant_new_stringn(ret, s, SIZE_MAX);
 }
 
 JsonVariant *json_variant_ref(JsonVariant *v);
diff --git a/src/shared/kbd-util.c b/src/shared/kbd-util.c
new file mode 100644 (file)
index 0000000..92abaea
--- /dev/null
@@ -0,0 +1,134 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <ftw.h>
+
+#include "errno-util.h"
+#include "kbd-util.h"
+#include "log.h"
+#include "nulstr-util.h"
+#include "path-util.h"
+#include "set.h"
+#include "string-util.h"
+#include "strv.h"
+#include "utf8.h"
+
+static thread_local const char *keymap_name = NULL;
+static thread_local Set *keymaps = NULL;
+
+static int nftw_cb(
+                const char *fpath,
+                const struct stat *sb,
+                int tflag,
+                struct FTW *ftwbuf) {
+
+        _cleanup_free_ char *p = NULL;
+        int r;
+
+        /* If keymap_name is non-null, return true if keymap keymap_name is found.
+         * Otherwise, add all keymaps to keymaps. */
+
+        if (tflag != FTW_F)
+                return 0;
+
+        fpath = basename(fpath);
+
+        const char *e = endswith(fpath, ".map") ?: endswith(fpath, ".map.gz");
+        if (!e)
+                return 0;
+
+        p = strndup(fpath, e - fpath);
+        if (!p) {
+                errno = ENOMEM;
+                return -1;
+        }
+
+        if (keymap_name)
+                return streq(p, keymap_name);
+
+        if (!keymap_is_valid(p))
+                return 0;
+
+        r = set_consume(keymaps, TAKE_PTR(p));
+        if (r < 0 && r != -EEXIST) {
+                errno = -r;
+                return -1;
+        }
+
+        return 0;
+}
+
+int get_keymaps(char ***ret) {
+        keymaps = set_new(&string_hash_ops);
+        if (!keymaps)
+                return -ENOMEM;
+
+        const char *dir;
+        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS)
+                if (nftw(dir, nftw_cb, 20, FTW_PHYS) < 0) {
+                        if (errno == ENOENT)
+                                continue;
+                        if (ERRNO_IS_RESOURCE(errno)) {
+                                keymaps = set_free_free(keymaps);
+                                return log_warning_errno(errno, "Failed to read keymap list from %s: %m", dir);
+                        }
+                        log_debug_errno(errno, "Failed to read keymap list from %s, ignoring: %m", dir);
+                }
+
+        _cleanup_strv_free_ char **l = set_get_strv(keymaps);
+        if (!l) {
+                keymaps = set_free_free(keymaps);
+                return -ENOMEM;
+        }
+
+        keymaps = set_free(keymaps);
+
+        if (strv_isempty(l))
+                return -ENOENT;
+
+        strv_sort(l);
+
+        *ret = TAKE_PTR(l);
+
+        return 0;
+}
+
+bool keymap_is_valid(const char *name) {
+        if (isempty(name))
+                return false;
+
+        if (strlen(name) >= 128)
+                return false;
+
+        if (!utf8_is_valid(name))
+                return false;
+
+        if (!filename_is_valid(name))
+                return false;
+
+        if (!string_is_safe(name))
+                return false;
+
+        return true;
+}
+
+int keymap_exists(const char *name) {
+        int r = 0;
+
+        if (!keymap_is_valid(name))
+                return -EINVAL;
+
+        keymap_name = name;
+
+        const char *dir;
+        NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
+                r = nftw(dir, nftw_cb, 20, FTW_PHYS);
+                if (r > 0)
+                        break;
+                if (r < 0 && errno != ENOENT)
+                        log_debug_errno(errno, "Failed to read keymap list from %s, ignoring: %m", dir);
+        }
+
+        keymap_name = NULL;
+
+        return r > 0;
+}
similarity index 94%
rename from src/basic/kbd-util.h
rename to src/shared/kbd-util.h
index 6714aeb9e047ce630ce8a9c0f38c4f9eeb0853ae..a2fc2e6a3ee2c8cfdb702da51233381b771ad619 100644 (file)
@@ -18,3 +18,4 @@
 
 int get_keymaps(char ***l);
 bool keymap_is_valid(const char *name);
+int keymap_exists(const char *name);
index 2c860f76d5d164eb4eddf59a004cda4830bed1e9..1de890f1421fe5416bcd2135e8ab8ebbee3d5ed4 100644 (file)
@@ -204,7 +204,7 @@ int local_gateways(sd_netlink *context, int ifindex, int af, struct local_addres
                 union in_addr_union gateway;
                 uint16_t type;
                 unsigned char dst_len, src_len, table;
-                uint32_t ifi, metric = 0;
+                uint32_t ifi = 0, metric = 0;
                 size_t rta_len;
                 int family;
                 RouteVia via;
index a217c1e0810d91975e59ab19505b326ea54c0c44..706a00c7f0612d6e087f265e965c2d2908a3aceb 100644 (file)
@@ -1323,7 +1323,7 @@ int show_journal(
         assert(mode >= 0);
         assert(mode < _OUTPUT_MODE_MAX);
 
-        if (how_many == (unsigned) -1)
+        if (how_many == UINT_MAX)
                 need_seek = true;
         else {
                 /* Seek to end */
@@ -1396,7 +1396,7 @@ int show_journal(
                         bool noaccess = journal_access_blocked(j);
 
                         if (line == 0 && noaccess)
-                                fprintf(f, "Warning: some journal files were not opened due to insufficient permissions.");
+                                fprintf(f, "Warning: some journal files were not opened due to insufficient permissions.\n");
                         else if (!noaccess)
                                 fprintf(f, "Notice: journal has been rotated since unit was started, output may be incomplete.\n");
                         else
index 4b27a95cc2301a47eb8514b84943b465831b9f74..a2e4958fdcd4a65e45557218aa8d8ed339821e35 100644 (file)
@@ -149,6 +149,8 @@ shared_sources = files('''
         json-internal.h
         json.c
         json.h
+        kbd-util.c
+        kbd-util.h
         killall.c
         killall.h
         libcrypt-util.c
@@ -242,8 +244,6 @@ shared_sources = files('''
         specifier.h
         switch-root.c
         switch-root.h
-        sysctl-util.c
-        sysctl-util.h
         tmpfile-util-label.c
         tmpfile-util-label.h
         tomoyo-util.c
index d1c2168dea2917491bc5a758756d9babcd87e4fc..b5bba809151b97acec061425697d120e0a4c8456 100644 (file)
@@ -69,3 +69,11 @@ int namespace_flags_to_string(unsigned long flags, char **ret) {
 
         return 0;
 }
+
+const char *namespace_single_flag_to_string(unsigned long flag) {
+        for (unsigned i = 0; namespace_flag_map[i].name; i++)
+                if (namespace_flag_map[i].flag == flag)
+                        return namespace_flag_map[i].name;
+
+        return NULL;
+}
index 3d774c755ca4bb08de058a9c4c95e98334824421..a35332dd9701ccc6b1cdcf5e6dd7703bdfa26735 100644 (file)
                           CLONE_NEWUSER|                                \
                           CLONE_NEWUTS))
 
-#define NAMESPACE_FLAGS_INITIAL  ((unsigned long) -1)
+#define NAMESPACE_FLAGS_INITIAL  ULONG_MAX
 
 int namespace_flags_from_string(const char *name, unsigned long *ret);
 int namespace_flags_to_string(unsigned long flags, char **ret);
+const char *namespace_single_flag_to_string(unsigned long flag);
 
 struct namespace_flag_map {
         unsigned long flag;
index d140c371c2474df4e4c33c2567158a392d86ab9a..4bbad7e37be48abb80c63c156d83a19ccfd97c9c 100644 (file)
@@ -37,7 +37,7 @@ static bool stderr_redirected = false;
 _noreturn_ static void pager_fallback(void) {
         int r;
 
-        r = copy_bytes(STDIN_FILENO, STDOUT_FILENO, (uint64_t) -1, 0);
+        r = copy_bytes(STDIN_FILENO, STDOUT_FILENO, UINT64_MAX, 0);
         if (r < 0) {
                 log_error_errno(r, "Internal pager failed: %m");
                 _exit(EXIT_FAILURE);
index 754b4f5a94f92d3395601f4f95b302ba7cd7ea48..4c309f925f15d2fd26687c63ac8d18a228ee64c3 100644 (file)
@@ -646,24 +646,24 @@ int pty_forward_set_width_height(PTYForward *f, unsigned width, unsigned height)
 
         assert(f);
 
-        if (width == (unsigned) -1 && height == (unsigned) -1)
+        if (width == UINT_MAX && height == UINT_MAX)
                 return 0; /* noop */
 
-        if (width != (unsigned) -1 &&
+        if (width != UINT_MAX &&
             (width == 0 || width > USHRT_MAX))
                 return -ERANGE;
 
-        if (height != (unsigned) -1 &&
+        if (height != UINT_MAX &&
             (height == 0 || height > USHRT_MAX))
                 return -ERANGE;
 
-        if (width == (unsigned) -1 || height == (unsigned) -1) {
+        if (width == UINT_MAX || height == UINT_MAX) {
                 if (ioctl(f->master, TIOCGWINSZ, &ws) < 0)
                         return -errno;
 
-                if (width != (unsigned) -1)
+                if (width != UINT_MAX)
                         ws.ws_col = width;
-                if (height != (unsigned) -1)
+                if (height != UINT_MAX)
                         ws.ws_row = height;
         } else
                 ws = (struct winsize) {
index ab24baaf9e65fb95f677836ed35745ece2d99430..9813d82f9568d749c21bd44988613e2941be9799 100644 (file)
@@ -1059,14 +1059,14 @@ int seccomp_load_syscall_filter_set(uint32_t default_action, const SyscallFilter
         return 0;
 }
 
-int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* set, uint32_t action, bool log_missing) {
+int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* filter, uint32_t action, bool log_missing) {
         uint32_t arch;
         int r;
 
-        /* Similar to seccomp_load_syscall_filter_set(), but takes a raw Set* of syscalls, instead of a
-         * SyscallFilterSet* table. */
+        /* Similar to seccomp_load_syscall_filter_set(), but takes a raw Hashmap* of syscalls, instead
+         * of a SyscallFilterSet* table. */
 
-        if (hashmap_isempty(set) && default_action == SCMP_ACT_ALLOW)
+        if (hashmap_isempty(filter) && default_action == SCMP_ACT_ALLOW)
                 return 0;
 
         SECCOMP_FOREACH_LOCAL_ARCH(arch) {
@@ -1079,7 +1079,7 @@ int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* set, u
                 if (r < 0)
                         return r;
 
-                HASHMAP_FOREACH_KEY(val, syscall_id, set) {
+                HASHMAP_FOREACH_KEY(val, syscall_id, filter) {
                         uint32_t a = action;
                         int id = PTR_TO_INT(syscall_id) - 1;
                         int error = PTR_TO_INT(val);
@@ -1090,12 +1090,13 @@ int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* set, u
                         else if (action == SCMP_ACT_LOG)
                                 a = SCMP_ACT_LOG;
 #endif
-                        else if (action != SCMP_ACT_ALLOW && error >= 0)
+                        else if (error >= 0)
                                 a = SCMP_ACT_ERRNO(error);
 
                         r = seccomp_rule_add_exact(seccomp, a, id, 0);
                         if (r < 0) {
-                                /* If the system call is not known on this architecture, then that's fine, let's ignore it */
+                                /* If the system call is not known on this architecture, then that's
+                                 * fine, let's ignore it */
                                 _cleanup_free_ char *n = NULL;
                                 bool ignore;
 
@@ -1113,7 +1114,8 @@ int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* set, u
                 if (ERRNO_IS_SECCOMP_FATAL(r))
                         return r;
                 if (r < 0)
-                        log_debug_errno(r, "Failed to install filter set for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                        log_debug_errno(r, "Failed to install systemc call filter for architecture %s, skipping: %m",
+                                        seccomp_arch_to_string(arch));
         }
 
         return 0;
@@ -1133,16 +1135,19 @@ int seccomp_parse_syscall_filter(
         assert(name);
         assert(filter);
 
+        if (!FLAGS_SET(flags, SECCOMP_PARSE_INVERT) && errno_num >= 0)
+                return -EINVAL;
+
         if (name[0] == '@') {
                 const SyscallFilterSet *set;
                 const char *i;
 
                 set = syscall_filter_set_find(name);
                 if (!set) {
-                        if (!(flags & SECCOMP_PARSE_PERMISSIVE))
+                        if (!FLAGS_SET(flags, SECCOMP_PARSE_PERMISSIVE))
                                 return -EINVAL;
 
-                        log_syntax(unit, flags & SECCOMP_PARSE_LOG ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
+                        log_syntax(unit, FLAGS_SET(flags, SECCOMP_PARSE_LOG) ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
                                    "Unknown system call group, ignoring: %s", name);
                         return 0;
                 }
@@ -1161,22 +1166,24 @@ int seccomp_parse_syscall_filter(
 
                 id = seccomp_syscall_resolve_name(name);
                 if (id == __NR_SCMP_ERROR) {
-                        if (!(flags & SECCOMP_PARSE_PERMISSIVE))
+                        if (!FLAGS_SET(flags, SECCOMP_PARSE_PERMISSIVE))
                                 return -EINVAL;
 
-                        log_syntax(unit, flags & SECCOMP_PARSE_LOG ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
+                        log_syntax(unit, FLAGS_SET(flags, SECCOMP_PARSE_LOG) ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
                                    "Failed to parse system call, ignoring: %s", name);
                         return 0;
                 }
 
-                /* If we previously wanted to forbid a syscall and now
-                 * we want to allow it, then remove it from the list. */
-                if (!(flags & SECCOMP_PARSE_INVERT) == !!(flags & SECCOMP_PARSE_ALLOW_LIST)) {
+                /* If we previously wanted to forbid a syscall and now we want to allow it, then remove
+                 * it from the list. The entries in allow-list with non-negative error value will be
+                 * handled with SCMP_ACT_ERRNO() instead of the default action. */
+                if (!FLAGS_SET(flags, SECCOMP_PARSE_INVERT) == FLAGS_SET(flags, SECCOMP_PARSE_ALLOW_LIST) ||
+                    (FLAGS_SET(flags, SECCOMP_PARSE_INVERT | SECCOMP_PARSE_ALLOW_LIST) && errno_num >= 0)) {
                         r = hashmap_put(filter, INT_TO_PTR(id + 1), INT_TO_PTR(errno_num));
                         if (r < 0)
                                 switch (r) {
                                 case -ENOMEM:
-                                        return flags & SECCOMP_PARSE_LOG ? log_oom() : -ENOMEM;
+                                        return FLAGS_SET(flags, SECCOMP_PARSE_LOG) ? log_oom() : -ENOMEM;
                                 case -EEXIST:
                                         assert_se(hashmap_update(filter, INT_TO_PTR(id + 1), INT_TO_PTR(errno_num)) == 0);
                                         break;
index 9d732dca2cdeb53c750677828dee23cd6974cc7f..06aede9d364697058630066f5ec107d232f4fa33 100644 (file)
@@ -458,7 +458,7 @@ size_t udev_replace_chars(char *str, const char *allow) {
                 }
 
                 /* accept valid utf8 */
-                len = utf8_encoded_valid_unichar(str + i, (size_t) -1);
+                len = utf8_encoded_valid_unichar(str + i, SIZE_MAX);
                 if (len > 1) {
                         i += len;
                         continue;
index b470a2f37c24e895ff8888aa9ed53c8c37d812b5..bc35edd72928f833fac71196abc6ad81d700518b 100644 (file)
@@ -570,7 +570,7 @@ static int json_dispatch_umask(const char *name, JsonVariant *variant, JsonDispa
         uintmax_t k;
 
         if (json_variant_is_null(variant)) {
-                *m = (mode_t) -1;
+                *m = MODE_INVALID;
                 return 0;
         }
 
@@ -590,7 +590,7 @@ static int json_dispatch_access_mode(const char *name, JsonVariant *variant, Jso
         uintmax_t k;
 
         if (json_variant_is_null(variant)) {
-                *m = (mode_t) -1;
+                *m = MODE_INVALID;
                 return 0;
         }
 
@@ -866,7 +866,7 @@ static int dispatch_pkcs11_key_data(const char *name, JsonVariant *variant, Json
         if (!json_variant_is_string(variant))
                 return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
 
-        r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+        r = unbase64mem(json_variant_string(variant), SIZE_MAX, &b, &l);
         if (r < 0)
                 return json_log(variant, flags, r, "Failed to decode encrypted PKCS#11 key: %m");
 
@@ -933,7 +933,7 @@ static int dispatch_fido2_hmac_credential(const char *name, JsonVariant *variant
         if (!json_variant_is_string(variant))
                 return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
 
-        r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+        r = unbase64mem(json_variant_string(variant), SIZE_MAX, &b, &l);
         if (r < 0)
                 return json_log(variant, flags, r, "Failed to decode FIDO2 credential ID: %m");
 
@@ -963,7 +963,7 @@ static int dispatch_fido2_hmac_credential_array(const char *name, JsonVariant *v
                 if (!array)
                         return log_oom();
 
-                r = unbase64mem(json_variant_string(e), (size_t) -1, &b, &l);
+                r = unbase64mem(json_variant_string(e), SIZE_MAX, &b, &l);
                 if (r < 0)
                         return json_log(variant, flags, r, "Failed to decode FIDO2 credential ID: %m");
 
@@ -993,7 +993,7 @@ static int dispatch_fido2_hmac_salt_value(const char *name, JsonVariant *variant
         if (!json_variant_is_string(variant))
                 return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
 
-        r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+        r = unbase64mem(json_variant_string(variant), SIZE_MAX, &b, &l);
         if (r < 0)
                 return json_log(variant, flags, r, "Failed to decode FIDO2 salt: %m");
 
@@ -1754,7 +1754,7 @@ const char *user_record_skeleton_directory(UserRecord *h) {
 mode_t user_record_access_mode(UserRecord *h) {
         assert(h);
 
-        return h->access_mode != (mode_t) -1 ? h->access_mode : 0700;
+        return h->access_mode != MODE_INVALID ? h->access_mode : 0700;
 }
 
 const char* user_record_home_directory(UserRecord *h) {
index 31128e02e0606f200d16ab91533137da0e6c6f80..6ed72075ba5beda6ac98bb2dbcaad0f96c19fcd4 100644 (file)
@@ -1206,8 +1206,9 @@ int varlink_close(Varlink *v) {
 
         varlink_set_state(v, VARLINK_DISCONNECTED);
 
-        /* Let's take a reference first, since varlink_detach_server() might drop the final (dangling) ref
-         * which would destroy us before we can call varlink_clear() */
+        /* Let's take a reference first, since varlink_detach_server() might drop the final ref from the
+         * disconnect callback, which would invalidate the pointer we are holding before we can call
+         * varlink_clear(). */
         varlink_ref(v);
         varlink_detach_server(v);
         varlink_clear(v);
@@ -1220,17 +1221,33 @@ Varlink* varlink_close_unref(Varlink *v) {
         if (!v)
                 return NULL;
 
-        (void) varlink_close(v);
+        /* A reference is given to us to be destroyed. But when calling varlink_close(), a callback might
+         * also drop a reference. We allow this, and will hold a temporary reference to the object to make
+         * sure that the object still exists when control returns to us. If there's just one reference
+         * remaining after varlink_close(), even though there were at least two right before, we'll handle
+         * that gracefully instead of crashing.
+         *
+         * In other words, this call drops the donated reference, but if the internal call to varlink_close()
+         * dropped a reference to, we don't drop the reference afain. This allows the caller to say:
+         *     global_object->varlink = varlink_close_unref(global_object->varlink);
+         * even though there is some callback which has access to global_object and may drop the reference
+         * stored in global_object->varlink. Without this step, the same code would have to be written as:
+         *     Varlink *t = TAKE_PTR(global_object->varlink);
+         *     varlink_close_unref(t);
+         */
+                                   /* n_ref >= 1 */
+        varlink_ref(v);            /* n_ref >= 2 */
+        varlink_close(v);          /* n_ref >= 1 */
+        if (v->n_ref > 1)
+                v->n_ref--;        /* n_ref >= 1 */
         return varlink_unref(v);
 }
 
 Varlink* varlink_flush_close_unref(Varlink *v) {
-        if (!v)
-                return NULL;
+        if (v)
+                varlink_flush(v);
 
-        (void) varlink_flush(v);
-        (void) varlink_close(v);
-        return varlink_unref(v);
+        return varlink_close_unref(v);
 }
 
 static int varlink_enqueue_json(Varlink *v, JsonVariant *m) {
index 245bb37ae464a715555e8e624b9abd7d80370ce4..03819e38cd7c046c3533c2327aad1a62fbda0568 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <stdbool.h>
 
-#define VERB_ANY ((unsigned) -1)
+#define VERB_ANY (UINT_MAX)
 
 typedef enum VerbFlags {
         VERB_DEFAULT      = 1 << 0,  /* The verb to run if no verb is specified */
index 06b6618ff4c94cd176df81bec0ebba8b09ccbb54..29b24906a6fb52452255b78dcd33c771f929fa00 100644 (file)
@@ -490,7 +490,7 @@ int main(int argc, char *argv[]) {
                         /* There are things we cannot get rid of. Loop one more time
                          * with LOG_ERR to inform the user. Note that we don't need
                          * to do this if there is a initrd to switch to, because that
-                         * one is likely to get rid of the remounting mounts. If not,
+                         * one is likely to get rid of the remaining mounts. If not,
                          * it will log about them. */
                         umount_log_level = LOG_ERR;
                         continue;
index 5d8b514874b7ca7895d652be8f77c5b005b71a56..217bd97ea5e4049acab607b1104b9a4b7ab12d66 100644 (file)
@@ -2,7 +2,6 @@
 
 #include <errno.h>
 #include <getopt.h>
-#include <poll.h>
 #include <stddef.h>
 #include <string.h>
 #include <unistd.h>
@@ -15,6 +14,7 @@
 #include "bus-internal.h"
 #include "bus-util.h"
 #include "errno-util.h"
+#include "io-util.h"
 #include "log.h"
 #include "main-func.h"
 #include "util.h"
@@ -181,8 +181,9 @@ static int run(int argc, char *argv[]) {
         for (;;) {
                 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
                 int events_a, events_b, fd;
-                uint64_t timeout_a, timeout_b, t;
-                struct timespec _ts, *ts;
+                usec_t timeout_a, timeout_b, t;
+
+                assert_cc(sizeof(usec_t) == sizeof(uint64_t));
 
                 r = sd_bus_process(a, &m);
                 if (r < 0)
@@ -235,23 +236,7 @@ static int run(int argc, char *argv[]) {
                 if (r < 0)
                         return log_error_errno(r, "Failed to get timeout: %m");
 
-                t = timeout_a;
-                if (t == (uint64_t) -1 || (timeout_b != (uint64_t) -1 && timeout_b < timeout_a))
-                        t = timeout_b;
-
-                if (t == (uint64_t) -1)
-                        ts = NULL;
-                else {
-                        usec_t nw;
-
-                        nw = now(CLOCK_MONOTONIC);
-                        if (t > nw)
-                                t -= nw;
-                        else
-                                t = 0;
-
-                        ts = timespec_store(&_ts, t);
-                }
+                t = usec_sub_unsigned(MIN(timeout_a, timeout_b), now(CLOCK_MONOTONIC));
 
                 struct pollfd p[3] = {
                         { .fd = fd,            .events = events_a           },
@@ -259,13 +244,9 @@ static int run(int argc, char *argv[]) {
                         { .fd = STDOUT_FILENO, .events = events_b & POLLOUT },
                 };
 
-                r = ppoll(p, ELEMENTSOF(p), ts, NULL);
+                r = ppoll_usec(p, ELEMENTSOF(p), t);
                 if (r < 0)
-                        return log_error_errno(errno, "ppoll() failed: %m");
-                if (p[0].revents & POLLNVAL ||
-                    p[1].revents & POLLNVAL ||
-                    p[2].revents & POLLNVAL)
-                        return log_error_errno(SYNTHETIC_ERRNO(EBADF), "Invalid file descriptor to poll on?");
+                        return log_error_errno(r, "ppoll() failed: %m");
         }
 
         return 0;
index f68eaa12dba04ebf756e200320f40e6428884c0f..9b1c4908a40c189e246b0d0a6f7bb6bd7727aa8b 100644 (file)
@@ -228,7 +228,7 @@ static int verb_status(int argc, char **argv, void *userdata) {
                         ret = r;
         }
 
-        (void) table_set_sort(t, (size_t) 0, (size_t) -1);
+        (void) table_set_sort(t, (size_t) 0);
 
         r = table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
         if (r < 0)
@@ -842,7 +842,7 @@ static int verb_list(int argc, char **argv, void *userdata) {
                         return table_log_add_error(r);
         }
 
-        (void) table_set_sort(t, (size_t) 0, (size_t) -1);
+        (void) table_set_sort(t, (size_t) 0);
 
         return table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
 }
index 4186ec3aea76cd7822d2754c1a07c0d87344b9a5..314962ac69fb87af3e60d625c13407f4dae5408a 100644 (file)
@@ -146,7 +146,6 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
                 _cleanup_free_ char *new_contents = NULL;
                 _cleanup_fclose_ FILE *f = NULL;
                 char **path;
-                size_t size;
 
                 r = mac_selinux_create_file_prepare(new_path, S_IFREG);
                 if (r < 0)
@@ -161,7 +160,7 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
                 if (r < 0)
                         return log_error_errno(errno, "Failed to change mode of \"%s\": %m", t);
 
-                r = read_full_file(new_path, &new_contents, &size);
+                r = read_full_file(new_path, &new_contents, NULL);
                 if (r < 0 && r != -ENOENT)
                         return log_error_errno(r, "Failed to read \"%s\": %m", new_path);
 
@@ -182,16 +181,18 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
                         if (path_equal(*path, new_path))
                                 continue;
 
-                        r = read_full_file(*path, &contents, &size);
+                        r = read_full_file(*path, &contents, NULL);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to read \"%s\": %m", *path);
 
                         fprintf(f, "\n\n### %s", *path);
                         if (!isempty(contents)) {
-                                contents = strreplace(strstrip(contents), "\n", "\n# ");
-                                if (!contents)
+                                _cleanup_free_ char *commented_contents = NULL;
+
+                                commented_contents = strreplace(strstrip(contents), "\n", "\n# ");
+                                if (!commented_contents)
                                         return log_oom();
-                                fprintf(f, "\n# %s", contents);
+                                fprintf(f, "\n# %s", commented_contents);
                         }
                 }
 
@@ -468,10 +469,12 @@ static int trim_edit_markers(const char *path) {
         int r;
 
         /* Trim out the lines between the two markers */
-        r = read_full_file(path, &contents, &size);
+        r = read_full_file(path, &contents, NULL);
         if (r < 0)
                 return log_error_errno(r, "Failed to read temporary file \"%s\": %m", path);
 
+        size = strlen(contents);
+
         contents_start = strstr(contents, EDIT_MARKER_START);
         if (contents_start)
                 contents_start += strlen(EDIT_MARKER_START);
index 3f5b42f03774e1d293bfd71cb6a4deb0280f290d..e02a7608feef5d0a18a1d3c07fb6fab689058b73 100644 (file)
@@ -360,7 +360,7 @@ static int output_sockets_list(struct socket_info *socket_infos, unsigned cs) {
 
         if (!arg_show_types) {
                 /* Hide the second (TYPE) column */
-                r = table_set_display(table, (size_t) 0, (size_t) 2, (size_t) 3, (size_t) -1);
+                r = table_set_display(table, (size_t) 0, (size_t) 2, (size_t) 3);
                 if (r < 0)
                         return log_error_errno(r, "Failed to set columns to display: %m");
         }
index 6410a4194478dd16fa7462a2c5c64f972fc58dd6..c3c81f03fbd0b1241ed7a3fa43f0fecb51cdcbe9 100644 (file)
@@ -648,7 +648,7 @@ static void print_status_info(
         if (i->status_errno > 0)
                 printf("      Error: %i (%s)\n", i->status_errno, strerror_safe(i->status_errno));
 
-        if (i->ip_ingress_bytes != (uint64_t) -1 && i->ip_egress_bytes != (uint64_t) -1) {
+        if (i->ip_ingress_bytes != UINT64_MAX && i->ip_egress_bytes != UINT64_MAX) {
                 char buf_in[FORMAT_BYTES_MAX], buf_out[FORMAT_BYTES_MAX];
 
                 printf("         IP: %s in, %s out\n",
@@ -664,16 +664,16 @@ static void print_status_info(
                         format_bytes(buf_out, sizeof(buf_out), i->io_write_bytes));
         }
 
-        if (i->tasks_current != (uint64_t) -1) {
+        if (i->tasks_current != UINT64_MAX) {
                 printf("      Tasks: %" PRIu64, i->tasks_current);
 
-                if (i->tasks_max != (uint64_t) -1)
+                if (i->tasks_max != UINT64_MAX)
                         printf(" (limit: %" PRIu64 ")\n", i->tasks_max);
                 else
                         printf("\n");
         }
 
-        if (i->memory_current != (uint64_t) -1) {
+        if (i->memory_current != UINT64_MAX) {
                 char buf[FORMAT_BYTES_MAX];
 
                 printf("     Memory: %s", format_bytes(buf, sizeof(buf), i->memory_current));
@@ -714,7 +714,7 @@ static void print_status_info(
                 printf("\n");
         }
 
-        if (i->cpu_usage_nsec != (uint64_t) -1) {
+        if (i->cpu_usage_nsec != UINT64_MAX) {
                 char buf[FORMAT_TIMESPAN_MAX];
                 printf("        CPU: %s\n", format_timespan(buf, sizeof(buf), i->cpu_usage_nsec / NSEC_PER_USEC, USEC_PER_MSEC));
         }
@@ -1823,16 +1823,16 @@ static int show_one(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_set_free_ Set *found_properties = NULL;
         _cleanup_(unit_status_info_free) UnitStatusInfo info = {
-                .memory_current = (uint64_t) -1,
+                .memory_current = UINT64_MAX,
                 .memory_high = CGROUP_LIMIT_MAX,
                 .memory_max = CGROUP_LIMIT_MAX,
                 .memory_swap_max = CGROUP_LIMIT_MAX,
-                .memory_limit = (uint64_t) -1,
-                .cpu_usage_nsec = (uint64_t) -1,
-                .tasks_current = (uint64_t) -1,
-                .tasks_max = (uint64_t) -1,
-                .ip_ingress_bytes = (uint64_t) -1,
-                .ip_egress_bytes = (uint64_t) -1,
+                .memory_limit = UINT64_MAX,
+                .cpu_usage_nsec = UINT64_MAX,
+                .tasks_current = UINT64_MAX,
+                .tasks_max = UINT64_MAX,
+                .ip_ingress_bytes = UINT64_MAX,
+                .ip_egress_bytes = UINT64_MAX,
                 .io_read_bytes = UINT64_MAX,
                 .io_write_bytes = UINT64_MAX,
         };
index 822286919ea9c29657801c62f45062c279da1e29..c784cbcb9acb7ce5541e6605c8da18aafd5a9805 100644 (file)
@@ -125,6 +125,10 @@ int sd_dhcp_client_set_request_broadcast(
 int sd_dhcp_client_set_ifindex(
                 sd_dhcp_client *client,
                 int interface_index);
+int sd_dhcp_client_set_ifname(
+                sd_dhcp_client *client,
+                const char *interface_name);
+const char *sd_dhcp_client_get_ifname(sd_dhcp_client *client);
 int sd_dhcp_client_set_mac(
                 sd_dhcp_client *client,
                 const uint8_t *addr,
index aa49a7434c37a12cb0e7920f9c4f8e0be7f6bd93..e3097ebb312eb3c53fb156dfbc94998fb4b70cfe 100644 (file)
@@ -37,6 +37,9 @@ enum {
 
 int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex);
 
+int sd_dhcp_server_set_ifname(sd_dhcp_server *server, const char *ifname);
+const char *sd_dhcp_server_get_ifname(sd_dhcp_server *server);
+
 sd_dhcp_server *sd_dhcp_server_ref(sd_dhcp_server *server);
 sd_dhcp_server *sd_dhcp_server_unref(sd_dhcp_server *server);
 
index 84e31701303c39cba454709dc21b43a7b98df03f..e02d67632a102f7f84d9d3cab6103d87a8b3067f 100644 (file)
@@ -91,6 +91,10 @@ int sd_dhcp6_client_set_callback(
 int sd_dhcp6_client_set_ifindex(
                 sd_dhcp6_client *client,
                 int interface_index);
+int sd_dhcp6_client_set_ifname(
+                sd_dhcp6_client *client,
+                const char *interface_name);
+const char * sd_dhcp6_client_get_ifname(sd_dhcp6_client *client);
 int sd_dhcp6_client_set_local_address(
                 sd_dhcp6_client *client,
                 const struct in6_addr *local_address);
index 2809d8748bd7ea1ef154017f5efa488faebab28e..1e89a81b31516e0ca99907b5fdd94d33f4d27aa0 100644 (file)
@@ -44,6 +44,7 @@ int sd_ipv4acd_set_callback(sd_ipv4acd *acd, sd_ipv4acd_callback_t cb, void *use
 int sd_ipv4acd_set_mac(sd_ipv4acd *acd, const struct ether_addr *addr);
 int sd_ipv4acd_set_ifindex(sd_ipv4acd *acd, int interface_index);
 int sd_ipv4acd_get_ifindex(sd_ipv4acd *acd);
+int sd_ipv4acd_set_ifname(sd_ipv4acd *acd, const char *interface_name);
 const char *sd_ipv4acd_get_ifname(sd_ipv4acd *acd);
 int sd_ipv4acd_set_address(sd_ipv4acd *acd, const struct in_addr *address);
 int sd_ipv4acd_is_running(sd_ipv4acd *acd);
index aa4d174e4b795f877238ffdff3ddc1fb170e61c6..bf5596ab613c8391a701342e2a8445e062a522a9 100644 (file)
@@ -44,6 +44,7 @@ int sd_ipv4ll_set_callback(sd_ipv4ll *ll, sd_ipv4ll_callback_t cb, void *userdat
 int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr);
 int sd_ipv4ll_set_ifindex(sd_ipv4ll *ll, int interface_index);
 int sd_ipv4ll_get_ifindex(sd_ipv4ll *ll);
+int sd_ipv4ll_set_ifname(sd_ipv4ll *ll, const char *interface_name);
 const char *sd_ipv4ll_get_ifname(sd_ipv4ll *ll);
 int sd_ipv4ll_set_address(sd_ipv4ll *ll, const struct in_addr *address);
 int sd_ipv4ll_set_address_seed(sd_ipv4ll *ll, uint64_t seed);
index d1d520afbd54dbe715e79eddef99df6a3498ec1c..64047ee81716ce1cb96a90e2967b96fa6bf462d4 100644 (file)
@@ -81,7 +81,7 @@ enum {
         SD_LLDP_SYSTEM_CAPABILITIES_TPMR     = 1 << 10,
 };
 
-#define SD_LLDP_SYSTEM_CAPABILITIES_ALL ((uint16_t) -1)
+#define SD_LLDP_SYSTEM_CAPABILITIES_ALL UINT16_MAX
 
 #define SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS                         \
         ((uint16_t)                                                     \
@@ -147,6 +147,8 @@ sd_event *sd_lldp_get_event(sd_lldp *lldp);
 
 int sd_lldp_set_callback(sd_lldp *lldp, sd_lldp_callback_t cb, void *userdata);
 int sd_lldp_set_ifindex(sd_lldp *lldp, int ifindex);
+int sd_lldp_set_ifname(sd_lldp *lldp, const char *ifname);
+const char *sd_lldp_get_ifname(sd_lldp *lldp);
 
 /* Controls how much and what to store in the neighbors database */
 int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t n);
index 49b127c01817af95a257420f6710527a5c4774cd..6088def1b61d257582ca1412a529ef87fe9b48bf 100644 (file)
@@ -78,6 +78,8 @@ sd_event *sd_ndisc_get_event(sd_ndisc *nd);
 
 int sd_ndisc_set_callback(sd_ndisc *nd, sd_ndisc_callback_t cb, void *userdata);
 int sd_ndisc_set_ifindex(sd_ndisc *nd, int interface_index);
+int sd_ndisc_set_ifname(sd_ndisc *nd, const char *interface_name);
+const char *sd_ndisc_get_ifname(sd_ndisc *nd);
 int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr);
 
 int sd_ndisc_get_mtu(sd_ndisc *nd, uint32_t *ret);
index 3f6c149d5e259daba08b92da1799b184195c9893..be5cf1b94e65d867d87b20f4d7a1ed14ba77b66e 100644 (file)
@@ -53,6 +53,8 @@ int sd_radv_stop(sd_radv *ra);
 int sd_radv_is_running(sd_radv *ra);
 
 int sd_radv_set_ifindex(sd_radv *ra, int interface_index);
+int sd_radv_set_ifname(sd_radv *ra, const char *interface_name);
+const char *sd_radv_get_ifname(sd_radv *ra);
 int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr);
 int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu);
 int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit);
index ee58d18137d4ad0d8f2e9ccaec6ebeb903de5749..530bfd516e95784b7afaa85812353f6d78141165 100644 (file)
@@ -68,7 +68,7 @@ int sd_resolve_get_fd(sd_resolve *resolve);
  * POLLOUT, ...) to check for. */
 int sd_resolve_get_events(sd_resolve *resolve);
 
-/* Return the poll() timeout to pass. Returns (uint64_t) -1 as
+/* Return the poll() timeout to pass. Returns UINT64_MAX as
  * timeout if no timeout is needed. */
 int sd_resolve_get_timeout(sd_resolve *resolve, uint64_t *timeout_usec);
 
index 4e231be856ebd63f9f37f9660588f36b2aa78715..b098eb27cd46468fbeb711f2433a82d247da7ed5 100644 (file)
@@ -256,7 +256,7 @@ static int make_backup(const char *target, const char *x) {
         if (r < 0)
                 return r;
 
-        r = copy_bytes(src, fileno(dst), (uint64_t) -1, COPY_REFLINK);
+        r = copy_bytes(src, fileno(dst), UINT64_MAX, COPY_REFLINK);
         if (r < 0)
                 return r;
 
@@ -393,7 +393,7 @@ static int write_temporary_passwd(const char *passwd_path, FILE **tmpfile, char
         original = fopen(passwd_path, "re");
         if (original) {
 
-                r = sync_rights(fileno(original), fileno(passwd));
+                r = copy_rights(fileno(original), fileno(passwd));
                 if (r < 0)
                         return r;
 
@@ -494,7 +494,7 @@ static int write_temporary_shadow(const char *shadow_path, FILE **tmpfile, char
         original = fopen(shadow_path, "re");
         if (original) {
 
-                r = sync_rights(fileno(original), fileno(shadow));
+                r = copy_rights(fileno(original), fileno(shadow));
                 if (r < 0)
                         return r;
 
@@ -539,7 +539,7 @@ static int write_temporary_shadow(const char *shadow_path, FILE **tmpfile, char
                         .sp_warn = -1,
                         .sp_inact = -1,
                         .sp_expire = -1,
-                        .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
+                        .sp_flag = ULONG_MAX, /* this appears to be what everybody does ... */
                 };
 
                 r = putspent_sane(&n, shadow);
@@ -590,7 +590,7 @@ static int write_temporary_group(const char *group_path, FILE **tmpfile, char **
         original = fopen(group_path, "re");
         if (original) {
 
-                r = sync_rights(fileno(original), fileno(group));
+                r = copy_rights(fileno(original), fileno(group));
                 if (r < 0)
                         return r;
 
@@ -688,7 +688,7 @@ static int write_temporary_gshadow(const char * gshadow_path, FILE **tmpfile, ch
         if (original) {
                 struct sgrp *sg;
 
-                r = sync_rights(fileno(original), fileno(gshadow));
+                r = copy_rights(fileno(original), fileno(gshadow));
                 if (r < 0)
                         return r;
 
index 62e31fd830993f60ef56a8ecffb9ef739e698b8e..ff40a8d10ddd0452db642b953d53b2aecc4d0485 100644 (file)
@@ -224,9 +224,7 @@ tests += [
 
         [['src/test/test-parse-argument.c']],
 
-        [['src/test/test-parse-util.c'],
-         [],
-         [libseccomp]],
+        [['src/test/test-parse-util.c']],
 
         [['src/test/test-sysctl-util.c']],
 
index 9c5d551d276255a96ed3d29cc46777ad1c806d64..42922a35007da5d1e3a77c1623d5ecf531816e96 100644 (file)
@@ -4,7 +4,7 @@
 
 int main(int argc, const char *argv[]) {
         _cleanup_bitmap_free_ Bitmap *b = NULL, *b2 = NULL;
-        unsigned n = (unsigned) -1, i = 0;
+        unsigned n = UINT_MAX, i = 0;
 
         b = bitmap_new();
         assert_se(b);
@@ -59,10 +59,10 @@ int main(int argc, const char *argv[]) {
                 else if (i == 1)
                         i = 256;
                 else if (i == 256)
-                        i = (unsigned) -1;
+                        i = UINT_MAX;
         }
 
-        assert_se(i == (unsigned) -1);
+        assert_se(i == UINT_MAX);
 
         i = 0;
 
@@ -73,10 +73,10 @@ int main(int argc, const char *argv[]) {
                 else if (i == 1)
                         i = 256;
                 else if (i == 256)
-                        i = (unsigned) -1;
+                        i = UINT_MAX;
         }
 
-        assert_se(i == (unsigned) -1);
+        assert_se(i == UINT_MAX);
 
         b2 = bitmap_copy(b);
         assert_se(b2);
@@ -92,7 +92,7 @@ int main(int argc, const char *argv[]) {
         bitmap_free(b2);
         b2 = NULL;
 
-        assert_se(bitmap_set(b, (unsigned) -1) == -ERANGE);
+        assert_se(bitmap_set(b, UINT_MAX) == -ERANGE);
 
         bitmap_free(b);
         b = NULL;
index e0b7f2280843db66a371c6da1b5c4259fd5a7d3f..4f1d0f64d5772f3353aee98b4a87810f2bab0e5d 100644 (file)
@@ -2,11 +2,11 @@
 
 #include "alloc-util.h"
 #include "calendarspec.h"
+#include "env-util.h"
 #include "errno-util.h"
 #include "string-util.h"
-#include "util.h"
 
-static void test_one(const char *input, const char *output) {
+static void _test_one(int line, const char *input, const char *output) {
         CalendarSpec *c;
         _cleanup_free_ char *p = NULL, *q = NULL;
         usec_t u;
@@ -16,13 +16,13 @@ static void test_one(const char *input, const char *output) {
         assert_se(calendar_spec_from_string(input, &c) >= 0);
 
         assert_se(calendar_spec_to_string(c, &p) >= 0);
-        printf("\"%s\" → \"%s\"\n", input, p);
+        log_info("line %d: \"%s\" → \"%s\"", line, input, p);
 
         assert_se(streq(p, output));
 
         u = now(CLOCK_REALTIME);
         r = calendar_spec_next_usec(c, u, &u);
-        printf("Next: %s\n", r < 0 ? strerror_safe(r) : format_timestamp(buf, sizeof(buf), u));
+        log_info("Next: %s", r < 0 ? strerror_safe(r) : format_timestamp(buf, sizeof buf, u));
         calendar_spec_free(c);
 
         assert_se(calendar_spec_from_string(p, &c) >= 0);
@@ -31,8 +31,9 @@ static void test_one(const char *input, const char *output) {
 
         assert_se(streq(q, p));
 }
+#define test_one(input, output) _test_one(__LINE__, input, output)
 
-static void test_next(const char *input, const char *new_tz, usec_t after, usec_t expect) {
+static void _test_next(int line, const char *input, const char *new_tz, usec_t after, usec_t expect) {
         CalendarSpec *c;
         usec_t u;
         char *old_tz;
@@ -43,35 +44,30 @@ static void test_next(const char *input, const char *new_tz, usec_t after, usec_
         if (old_tz)
                 old_tz = strdupa(old_tz);
 
-        if (new_tz) {
-                char *colon_tz;
+        if (!isempty(new_tz))
+                new_tz = strjoina(":", new_tz);
 
-                colon_tz = strjoina(":", new_tz);
-                assert_se(setenv("TZ", colon_tz, 1) >= 0);
-        } else
-                assert_se(unsetenv("TZ") >= 0);
+        assert_se(set_unset_env("TZ", new_tz, true) == 0);
         tzset();
 
         assert_se(calendar_spec_from_string(input, &c) >= 0);
 
-        printf("\"%s\"\n", input);
+        log_info("line %d: \"%s\" new_tz=%s", line, input, strnull(new_tz));
 
         u = after;
         r = calendar_spec_next_usec(c, after, &u);
-        printf("At: %s\n", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US));
-        if (expect != (usec_t)-1)
+        log_info("At: %s", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US));
+        if (expect != USEC_INFINITY)
                 assert_se(r >= 0 && u == expect);
         else
                 assert(r == -ENOENT);
 
         calendar_spec_free(c);
 
-        if (old_tz)
-                assert_se(setenv("TZ", old_tz, 1) >= 0);
-        else
-                assert_se(unsetenv("TZ") >= 0);
+        assert_se(set_unset_env("TZ", old_tz, true) == 0);
         tzset();
 }
+#define test_next(input, new_tz, after, expect) _test_next(__LINE__, input,new_tz,after,expect)
 
 static void test_timestamp(void) {
         char buf[FORMAT_TIMESTAMP_MAX];
@@ -83,12 +79,12 @@ static void test_timestamp(void) {
 
         x = now(CLOCK_REALTIME);
 
-        assert_se(format_timestamp_style(buf, sizeof(buf), x, TIMESTAMP_US));
-        printf("%s\n", buf);
+        assert_se(format_timestamp_style(buf, sizeof buf, x, TIMESTAMP_US));
+        log_info("%s", buf);
         assert_se(calendar_spec_from_string(buf, &c) >= 0);
         assert_se(calendar_spec_to_string(c, &t) >= 0);
         calendar_spec_free(c);
-        printf("%s\n", t);
+        log_info("%s", t);
 
         assert_se(parse_timestamp(t, &y) >= 0);
         assert_se(y == x);
@@ -104,11 +100,11 @@ static void test_hourly_bug_4031(void) {
         n = now(CLOCK_REALTIME);
         assert_se((r = calendar_spec_next_usec(c, n, &u)) >= 0);
 
-        printf("Now: %s (%"PRIu64")\n", format_timestamp_style(buf, sizeof buf, n, TIMESTAMP_US), n);
-        printf("Next hourly: %s (%"PRIu64")\n", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US), u);
+        log_info("Now: %s (%"PRIu64")", format_timestamp_style(buf, sizeof buf, n, TIMESTAMP_US), n);
+        log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US), u);
 
         assert_se((r = calendar_spec_next_usec(c, u, &w)) >= 0);
-        printf("Next hourly: %s (%"PRIu64")\n", r < 0 ? strerror_safe(r) : format_timestamp_style(zaf, sizeof zaf, w, TIMESTAMP_US), w);
+        log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : format_timestamp_style(zaf, sizeof zaf, w, TIMESTAMP_US), w);
 
         assert_se(n < u);
         assert_se(u <= n + USEC_PER_HOUR);
@@ -209,15 +205,18 @@ int main(int argc, char* argv[]) {
         test_next("2017-08-06 9..17/2:00 UTC", "", 1502029800000000, 1502031600000000);
         test_next("2016-12-* 3..21/6:00 UTC", "", 1482613200000001, 1482634800000000);
         test_next("2017-09-24 03:30:00 Pacific/Auckland", "", 12345, 1506177000000000);
-        // Due to daylight saving time - 2017-09-24 02:30:00 does not exist
+        /* Due to daylight saving time - 2017-09-24 02:30:00 does not exist */
         test_next("2017-09-24 02:30:00 Pacific/Auckland", "", 12345, -1);
         test_next("2017-04-02 02:30:00 Pacific/Auckland", "", 12345, 1491053400000000);
-        // Confirm that even though it's a time change here (backward) 02:30 happens only once
+        /* Confirm that even though it's a time change here (backward) 02:30 happens only once */
         test_next("2017-04-02 02:30:00 Pacific/Auckland", "", 1491053400000000, -1);
         test_next("2017-04-02 03:30:00 Pacific/Auckland", "", 12345, 1491060600000000);
-        // Confirm that timezones in the Spec work regardless of current timezone
+        /* Confirm that timezones in the Spec work regardless of current timezone */
         test_next("2017-09-09 20:42:00 Pacific/Auckland", "", 12345, 1504946520000000);
         test_next("2017-09-09 20:42:00 Pacific/Auckland", "EET", 12345, 1504946520000000);
+        /* Check that we don't start looping if mktime() moves us backwards */
+        test_next("Sun *-*-* 01:00:00 Europe/Dublin", "", 1616412478000000, 1617494400000000);
+        test_next("Sun *-*-* 01:00:00 Europe/Dublin", "IST", 1616412478000000, 1617494400000000);
 
         assert_se(calendar_spec_from_string("test", &c) < 0);
         assert_se(calendar_spec_from_string(" utc", &c) < 0);
index 211b4a492595275c499e2ee7f3fdb96c551a69bc..7b8f8fa1b2babe4c9817ebcf2deefbe34721d062 100644 (file)
@@ -207,7 +207,7 @@ static void test_copy_bytes(void) {
 
         assert_se(pipe2(pipefd, O_CLOEXEC) == 0);
 
-        r = copy_bytes(infd, pipefd[1], (uint64_t) -1, 0);
+        r = copy_bytes(infd, pipefd[1], UINT64_MAX, 0);
         assert_se(r == 0);
 
         r = read(pipefd[0], buf, sizeof(buf));
@@ -249,7 +249,7 @@ static void test_copy_bytes_regular_file(const char *src, bool try_reflink, uint
         assert_se(fd3 >= 0);
 
         r = copy_bytes(fd, fd2, max_bytes, try_reflink ? COPY_REFLINK : 0);
-        if (max_bytes == (uint64_t) -1)
+        if (max_bytes == UINT64_MAX)
                 assert_se(r == 0);
         else
                 assert_se(IN_SET(r, 0, 1));
@@ -258,14 +258,14 @@ static void test_copy_bytes_regular_file(const char *src, bool try_reflink, uint
         assert_se(fstat(fd2, &buf2) == 0);
         assert_se((uint64_t) buf2.st_size == MIN((uint64_t) buf.st_size, max_bytes));
 
-        if (max_bytes < (uint64_t) -1)
+        if (max_bytes < UINT64_MAX)
                 /* Make sure the file is now higher than max_bytes */
                 assert_se(ftruncate(fd2, max_bytes + 1) == 0);
 
         assert_se(lseek(fd2, 0, SEEK_SET) == 0);
 
         r = copy_bytes(fd2, fd3, max_bytes, try_reflink ? COPY_REFLINK : 0);
-        if (max_bytes == (uint64_t) -1)
+        if (max_bytes == UINT64_MAX)
                 assert_se(r == 0);
         else
                 /* We cannot distinguish between the input being exactly max_bytes
@@ -277,7 +277,7 @@ static void test_copy_bytes_regular_file(const char *src, bool try_reflink, uint
 
         assert_se(fstat(fd3, &buf3) == 0);
 
-        if (max_bytes == (uint64_t) -1)
+        if (max_bytes == UINT64_MAX)
                 assert_se(buf3.st_size == buf2.st_size);
         else
                 assert_se((uint64_t) buf3.st_size == max_bytes);
@@ -312,12 +312,12 @@ static void test_copy_proc(void) {
 
         assert_se(mkdtemp_malloc(NULL, &p) >= 0);
         assert_se(f = path_join(p, "version"));
-        assert_se(copy_file("/proc/version", f, 0, (mode_t) -1, 0, 0, 0) >= 0);
+        assert_se(copy_file("/proc/version", f, 0, MODE_INVALID, 0, 0, 0) >= 0);
 
         assert_se(read_one_line_file("/proc/version", &a) >= 0);
         assert_se(read_one_line_file(f, &b) >= 0);
         assert_se(streq(a, b));
-        assert_se(strlen(a) > 0);
+        assert_se(!isempty(a));
 }
 
 int main(int argc, char *argv[]) {
@@ -327,8 +327,8 @@ int main(int argc, char *argv[]) {
         test_copy_file_fd();
         test_copy_tree();
         test_copy_bytes();
-        test_copy_bytes_regular_file(argv[0], false, (uint64_t) -1);
-        test_copy_bytes_regular_file(argv[0], true, (uint64_t) -1);
+        test_copy_bytes_regular_file(argv[0], false, UINT64_MAX);
+        test_copy_bytes_regular_file(argv[0], true, UINT64_MAX);
         test_copy_bytes_regular_file(argv[0], false, 1000); /* smaller than copy buffer size */
         test_copy_bytes_regular_file(argv[0], true, 1000);
         test_copy_bytes_regular_file(argv[0], false, 32000); /* larger than copy buffer size */
index 9efb3fe3b3f9754ab426fb9793f840aa8d86a57a..c914d78324f9b8b6b5288c8298082db0ccb14e89 100644 (file)
@@ -31,6 +31,7 @@ static void test_encode_devnode_name(void) {
         assert_se(expect_encoded_as("s/ash/ng", "s\\x2fash\\x2fng"));
         assert_se(expect_encoded_as("/", "\\x2f"));
         assert_se(expect_encoded_as("!", "\\x21"));
+        assert_se(expect_encoded_as("QEMU    ", "QEMU\\x20\\x20\\x20\\x20"));
 }
 
 int main(int argc, char *argv[]) {
index c0e046b5e21f0d8873549d88bdd5b438ce841b61..239fcea5e3d90e1f46a1d39b6bea6bb0fe7963c9 100644 (file)
@@ -444,6 +444,7 @@ static void test_exec_systemcallfilter(Manager *m) {
         test(m, "exec-systemcallfilter-with-errno-name.service", errno_from_name("EILSEQ"), CLD_EXITED);
         test(m, "exec-systemcallfilter-with-errno-number.service", 255, CLD_EXITED);
         test(m, "exec-systemcallfilter-with-errno-multi.service", errno_from_name("EILSEQ"), CLD_EXITED);
+        test(m, "exec-systemcallfilter-with-errno-in-allow-list.service", errno_from_name("EILSEQ"), CLD_EXITED);
         test(m, "exec-systemcallfilter-override-error-action.service", SIGSYS, CLD_KILLED);
         test(m, "exec-systemcallfilter-override-error-action2.service", errno_from_name("EILSEQ"), CLD_EXITED);
 #endif
index 56b516fe40af2ada77fec8f3302e4b09240fd94a..f1085266df23c80babb8b848b3a5e13656348a85 100644 (file)
@@ -172,19 +172,19 @@ static void test_extract_first_word(void) {
         assert_se(isempty(p));
 
         p = original = "fooo\\";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX) > 0);
         assert_se(streq(t, "fooo\\"));
         free(t);
         assert_se(isempty(p));
 
         p = original = "fooo\\";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
         assert_se(streq(t, "fooo\\"));
         free(t);
         assert_se(isempty(p));
 
         p = original = "fooo\\";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
         assert_se(streq(t, "fooo\\"));
         free(t);
         assert_se(isempty(p));
@@ -230,17 +230,17 @@ static void test_extract_first_word(void) {
         assert_se(isempty(p));
 
         p = original = "\"foo\\";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE_RELAX) == -EINVAL);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_UNESCAPE_RELAX) == -EINVAL);
         assert_se(p == original + 5);
 
         p = original = "\"foo\\";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
         assert_se(streq(t, "foo\\"));
         free(t);
         assert_se(isempty(p));
 
         p = original = "\"foo\\";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
         assert_se(streq(t, "foo\\"));
         free(t);
         assert_se(isempty(p));
@@ -252,13 +252,13 @@ static void test_extract_first_word(void) {
         assert_se(p == original + 10);
 
         p = original = "fooo\\ bar quux";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX) > 0);
         assert_se(streq(t, "fooo bar"));
         free(t);
         assert_se(p == original + 10);
 
         p = original = "fooo\\ bar quux";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
         assert_se(streq(t, "fooo bar"));
         free(t);
         assert_se(p == original + 10);
@@ -268,7 +268,7 @@ static void test_extract_first_word(void) {
         assert_se(p == original + 5);
 
         p = original = "fooo\\ bar quux";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
         assert_se(streq(t, "fooo\\ bar"));
         free(t);
         assert_se(p == original + 10);
@@ -278,13 +278,13 @@ static void test_extract_first_word(void) {
         assert_se(p == original + 1);
 
         p = original = "\\w+@\\K[\\d.]+";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
         assert_se(streq(t, "\\w+@\\K[\\d.]+"));
         free(t);
         assert_se(isempty(p));
 
         p = original = "\\w+\\b";
-        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+        assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
         assert_se(streq(t, "\\w+\b"));
         free(t);
         assert_se(isempty(p));
@@ -344,6 +344,39 @@ static void test_extract_first_word(void) {
         free(t);
         assert_se(p == NULL);
 
+        p = "\\:";
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, ":"));
+        free(t);
+        assert_se(p == NULL);
+
+        p = "a\\:b";
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "a:b"));
+        free(t);
+        assert_se(p == NULL);
+
+        p = "a\\ b:c";
+        assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "a b"));
+        free(t);
+        assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "c"));
+        free(t);
+        assert_se(p == NULL);
+
+        p = "a\\ b:c\\x";
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == -EINVAL);
+
+        p = "a\\\\ b:c\\\\x";
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "a\\ b"));
+        free(t);
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "c\\x"));
+        free(t);
+        assert_se(p == NULL);
+
         p = "\\:";
         assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1);
         assert_se(streq(t, ":"));
@@ -365,6 +398,18 @@ static void test_extract_first_word(void) {
         free(t);
         assert_se(p == NULL);
 
+        p = "a\\ b:c\\x";
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == -EINVAL);
+
+        p = "a\\\\ b:c\\\\x";
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "a\\ b"));
+        free(t);
+        assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1);
+        assert_se(streq(t, "c\\x"));
+        free(t);
+        assert_se(p == NULL);
+
         p = "\\:";
         assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE) == -EINVAL);
 
index a5834eba364a0812ed89a9e4b31950eb2bc19cd7..c5c8116e96d3db831925d85b1ff8b3896d66ebfb 100644 (file)
@@ -9,6 +9,7 @@
 #include "ctype.h"
 #include "env-file.h"
 #include "env-util.h"
+#include "errno-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "fs-util.h"
@@ -703,28 +704,28 @@ static const char buffer[] =
 static void test_read_line_one_file(FILE *f) {
         _cleanup_free_ char *line = NULL;
 
-        assert_se(read_line(f, (size_t) -1, &line) == 15 && streq(line, "Some test data"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 15 && streq(line, "Some test data"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) > 0 && streq(line, "루Non-ascii chars: ąę„”"));
+        assert_se(read_line(f, SIZE_MAX, &line) > 0 && streq(line, "루Non-ascii chars: ąę„”"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) == 13 && streq(line, "terminators"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 13 && streq(line, "terminators"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) == 15 && streq(line, "and even more"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 15 && streq(line, "and even more"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) == 25 && streq(line, "now the same with a NUL"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 25 && streq(line, "now the same with a NUL"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) == 10 && streq(line, "and more"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 10 && streq(line, "and more"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) == 16 && streq(line, "and even more"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 16 && streq(line, "and even more"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, &line) == 20 && streq(line, "and yet even more"));
+        assert_se(read_line(f, SIZE_MAX, &line) == 20 && streq(line, "and yet even more"));
         line = mfree(line);
 
         assert_se(read_line(f, 1024, &line) == 30 && streq(line, "With newlines, and a NUL byte"));
@@ -736,7 +737,7 @@ static void test_read_line_one_file(FILE *f) {
         assert_se(read_line(f, 1024, &line) == 14 && streq(line, "an empty line"));
         line = mfree(line);
 
-        assert_se(read_line(f, (size_t) -1, NULL) == 16);
+        assert_se(read_line(f, SIZE_MAX, NULL) == 16);
 
         assert_se(read_line(f, 16, &line) == -ENOBUFS);
         line = mfree(line);
@@ -819,11 +820,11 @@ static void test_read_line4(void) {
 
                 assert_se(f = fmemopen_unlocked((void*) eof_endings[i].string, eof_endings[i].length, "r"));
 
-                r = read_line(f, (size_t) -1, &s);
+                r = read_line(f, SIZE_MAX, &s);
                 assert_se((size_t) r == eof_endings[i].length);
                 assert_se(streq_ptr(s, "foo"));
 
-                assert_se(read_line(f, (size_t) -1, NULL) == 0); /* Ensure we hit EOF */
+                assert_se(read_line(f, SIZE_MAX, NULL) == 0); /* Ensure we hit EOF */
         }
 }
 
@@ -964,6 +965,24 @@ static void test_read_full_file_offset_size(void) {
         rbuf = mfree(rbuf);
 }
 
+static void test_read_full_virtual_file(void) {
+        const char *filename;
+        int r;
+
+        FOREACH_STRING(filename,
+                       "/proc/1/cmdline",
+                       "/etc/nsswitch.conf",
+                       "/sys/kernel/uevent_seqnum") {
+
+                _cleanup_free_ char *buf = NULL;
+                size_t size = 0;
+
+                r = read_full_virtual_file(filename, &buf, &size);
+                log_info_errno(r, "read_full_virtual_file(\"%s\"): %m (%zu bytes)", filename, size);
+                assert_se(r == 0 || ERRNO_IS_PRIVILEGE(r) || r == -ENOENT);
+        }
+}
+
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
@@ -991,6 +1010,7 @@ int main(int argc, char *argv[]) {
         test_read_nul_string();
         test_read_full_file_socket();
         test_read_full_file_offset_size();
+        test_read_full_virtual_file();
 
         return 0;
 }
index 8d69f192d81dcacdfa0401a0e15198ef05a2f73e..dfde01a678899a4fc3b22a68afb0c51cce5df99a 100644 (file)
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
+#include <unistd.h>
+
 #include "firewall-util.h"
+#include "firewall-util-private.h"
 #include "log.h"
 #include "random-util.h"
+#include "socket-util.h"
 #include "tests.h"
 
-#define MAKE_IN_ADDR_UNION(a,b,c,d) (union in_addr_union) { .in.s_addr = htobe32((uint32_t) (a) << 24 | (uint32_t) (b) << 16 | (uint32_t) (c) << 8 | (uint32_t) (d))}
-#define MAKE_IN6_ADDR_UNION(str, u) assert_se(in_addr_from_string(AF_INET6, str, u) >= 0)
-
-static void test_v6(FirewallContext **ctx) {
-        union in_addr_union u = {}, u2 = {};
+static void test_v6(FirewallContext *ctx) {
+        union in_addr_union u1, u2, u3;
         uint8_t prefixlen;
         int r;
 
-        MAKE_IN6_ADDR_UNION("dead::beef", &u);
-
-        r = fw_add_masquerade(ctx, true, AF_INET6, &u, 128);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+        assert_se(ctx);
 
-        r = fw_add_masquerade(ctx, false, AF_INET6, &u, 128);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+        log_info("/* %s(backend=%s) */", __func__, firewall_backend_to_string(ctx->backend));
 
-        r = fw_add_masquerade(ctx, true, AF_INET6, &u, 64);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+        if (!socket_ipv6_is_supported())
+                return log_info("IPv6 is not supported by kernel, skipping tests.");
 
-        r = fw_add_masquerade(ctx, false, AF_INET6, &u, 64);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+        assert_se(in_addr_from_string(AF_INET6, "dead::beef", &u1) >= 0);
+        assert_se(in_addr_from_string(AF_INET6, "1c3::c01d", &u2) >= 0);
 
-        r = fw_add_local_dnat(ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u, 815, NULL);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        prefixlen = random_u64_range(128 + 1 - 8) + 8;
+        pseudo_random_bytes(&u3, sizeof(u3));
 
-        MAKE_IN6_ADDR_UNION("1c3::c01d", &u2);
-        r = fw_add_local_dnat(ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, &u);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        assert_se(fw_add_masquerade(&ctx, true, AF_INET6, &u1, 128) >= 0);
+        assert_se(fw_add_masquerade(&ctx, false, AF_INET6, &u1, 128) >= 0);
+        assert_se(fw_add_masquerade(&ctx, true, AF_INET6, &u1, 64) >= 0);
+        assert_se(fw_add_masquerade(&ctx, false, AF_INET6, &u1, 64) >= 0);
+        assert_se(fw_add_masquerade(&ctx, true, AF_INET6, &u3, prefixlen) >= 0);
+        assert_se(fw_add_masquerade(&ctx, false, AF_INET6, &u3, prefixlen) >= 0);
 
-        r = fw_add_local_dnat(ctx, false, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, NULL);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        r = fw_add_local_dnat(&ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u1, 815, NULL);
+        if (r == -EOPNOTSUPP) {
+                log_info("IPv6 DNAT seems not supported, skipping the following tests.");
+                return;
+        }
+        assert_se(r >= 0);
 
-        prefixlen = random_u32() % (128 + 1 - 8);
-        prefixlen += 8;
-        pseudo_random_bytes(&u, sizeof(u));
+        assert_se(fw_add_local_dnat(&ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, &u1) >= 0);
+        assert_se(fw_add_local_dnat(&ctx, false, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, NULL) >= 0);
 
-        r = fw_add_masquerade(ctx, true, AF_INET6, &u, prefixlen);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+}
 
-        r = fw_add_masquerade(ctx, false, AF_INET6, &u, prefixlen);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+static union in_addr_union *parse_addr(const char *str, union in_addr_union *u) {
+        assert(str);
+        assert(u);
+        assert_se(in_addr_from_string(AF_INET, str, u) >= 0);
+        return u;
 }
 
-int main(int argc, char *argv[]) {
-        _cleanup_(fw_ctx_freep) FirewallContext *ctx;
+static bool test_v4(FirewallContext *ctx) {
+        union in_addr_union u, v;
         int r;
-        test_setup_logging(LOG_DEBUG);
-        uint8_t prefixlen = 32;
 
-        r = fw_ctx_new(&ctx);
-        if (r < 0)
-                return log_error_errno(r, "Failed to init firewall: %m");
+        assert_se(ctx);
 
-        r = fw_add_masquerade(&ctx, true, AF_INET, NULL, 0);
-        if (r == 0)
-                log_error("Expected failure: NULL source");
+        log_info("/* %s(backend=%s) */", __func__, firewall_backend_to_string(ctx->backend));
 
-        r = fw_add_masquerade(&ctx, true, AF_INET, &MAKE_IN_ADDR_UNION(10,1,2,0), 0);
-        if (r == 0)
-                log_error("Expected failure: 0 prefixlen");
+        assert_se(fw_add_masquerade(&ctx, true, AF_INET, NULL, 0) == -EINVAL);
+        assert_se(fw_add_masquerade(&ctx, true, AF_INET, parse_addr("10.1.2.0", &u), 0) == -EINVAL);
 
-        r = fw_add_masquerade(&ctx, true, AF_INET, &MAKE_IN_ADDR_UNION(10,1,2,3), prefixlen);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        r = fw_add_masquerade(&ctx, true, AF_INET, parse_addr("10.1.2.3", &u), 32);
+        if (r < 0) {
+                bool ignore = IN_SET(r, -EPERM, -EOPNOTSUPP, -ENOPROTOOPT);
 
-        prefixlen = 28;
-        r = fw_add_masquerade(&ctx, true, AF_INET, &MAKE_IN_ADDR_UNION(10,0,2,0), prefixlen);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+                log_full_errno(ignore ? LOG_DEBUG : LOG_ERR, r,
+                               "Failed to add IPv4 masquerade%s: %m",
+                               ignore ? ", skipping following tests" : "");
 
-        r = fw_add_masquerade(&ctx, false, AF_INET, &MAKE_IN_ADDR_UNION(10,0,2,0), prefixlen);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+                if (ignore)
+                        return false;
+        }
+        assert(r >= 0);
 
-        r = fw_add_masquerade(&ctx, false, AF_INET, &MAKE_IN_ADDR_UNION(10,1,2,3), 32);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        assert_se(fw_add_masquerade(&ctx, true, AF_INET, parse_addr("10.0.2.0", &u), 28) >= 0);
+        assert_se(fw_add_masquerade(&ctx, false, AF_INET, parse_addr("10.0.2.0", &u), 28) >= 0);
+        assert_se(fw_add_masquerade(&ctx, false, AF_INET, parse_addr("10.1.2.3", &u), 32) >= 0);
+        assert_se(fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.4", &u), 815, NULL) >= 0);
+        assert_se(fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.4", &u), 815, NULL) >= 0);
+        assert_se(fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.5", &u), 815, parse_addr("1.2.3.4", &v)) >= 0);
+        assert_se(fw_add_local_dnat(&ctx, false, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.5", &u), 815, NULL) >= 0);
+
+        return true;
+}
+
+int main(int argc, char *argv[]) {
+        _cleanup_(fw_ctx_freep) FirewallContext *ctx = NULL;
+
+        test_setup_logging(LOG_DEBUG);
 
-        r = fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 4), 815, NULL);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        if (getuid() != 0)
+                return log_tests_skipped("not root");
 
-        r = fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 4), 815, NULL);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        assert_se(fw_ctx_new(&ctx) >= 0);
+        assert_se(ctx);
 
-        r = fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 5), 815, &MAKE_IN_ADDR_UNION(1, 2, 3, 4));
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        if (ctx->backend == FW_BACKEND_NONE)
+                return EXIT_TEST_SKIP;
 
-        r = fw_add_local_dnat(&ctx, false, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 5), 815, NULL);
-        if (r < 0)
-                log_error_errno(r, "Failed to modify firewall: %m");
+        if (test_v4(ctx) && ctx->backend == FW_BACKEND_NFTABLES)
+                test_v6(ctx);
 
-        test_v6(&ctx);
+#if HAVE_LIBIPTC
+        if (ctx->backend != FW_BACKEND_IPTABLES) {
+                ctx->backend = FW_BACKEND_IPTABLES;
+                test_v4(ctx);
+        }
+#endif
 
         return 0;
 }
index b2943e6fc1c44d2e3f83be0159ada7978c88ecb5..44d92a719d1b6dcdf69e08232dbf14a618712e4a 100644 (file)
@@ -75,7 +75,7 @@ static void test_multiline(void) {
                         "lines     \n"));
         formatted = mfree(formatted);
 
-        table_set_cell_height_max(table, (size_t) -1);
+        table_set_cell_height_max(table, SIZE_MAX);
         assert_se(table_format(table, &formatted) >= 0);
         fputs(formatted, stdout);
         assert_se(streq(formatted,
@@ -131,7 +131,7 @@ static void test_multiline(void) {
                         "          line…\n"));
         formatted = mfree(formatted);
 
-        table_set_cell_height_max(table, (size_t) -1);
+        table_set_cell_height_max(table, SIZE_MAX);
         assert_se(table_format(table, &formatted) >= 0);
         fputs(formatted, stdout);
         assert_se(streq(formatted,
@@ -189,7 +189,7 @@ static void test_strv(void) {
                         "lines     \n"));
         formatted = mfree(formatted);
 
-        table_set_cell_height_max(table, (size_t) -1);
+        table_set_cell_height_max(table, SIZE_MAX);
         assert_se(table_format(table, &formatted) >= 0);
         fputs(formatted, stdout);
         assert_se(streq(formatted,
@@ -245,7 +245,7 @@ static void test_strv(void) {
                         "          line…\n"));
         formatted = mfree(formatted);
 
-        table_set_cell_height_max(table, (size_t) -1);
+        table_set_cell_height_max(table, SIZE_MAX);
         assert_se(table_format(table, &formatted) >= 0);
         fputs(formatted, stdout);
         assert_se(streq(formatted,
@@ -300,7 +300,7 @@ static void test_strv_wrapped(void) {
                         "three different lines two lines\n"));
         formatted = mfree(formatted);
 
-        table_set_cell_height_max(table, (size_t) -1);
+        table_set_cell_height_max(table, SIZE_MAX);
         assert_se(table_format(table, &formatted) >= 0);
         fputs(formatted, stdout);
         assert_se(streq(formatted,
@@ -352,7 +352,7 @@ static void test_strv_wrapped(void) {
                         "                  ___7___ ___8___\n"));
         formatted = mfree(formatted);
 
-        table_set_cell_height_max(table, (size_t) -1);
+        table_set_cell_height_max(table, SIZE_MAX);
         assert_se(table_format(table, &formatted) >= 0);
         fputs(formatted, stdout);
         assert_se(streq(formatted,
@@ -443,8 +443,8 @@ int main(int argc, char *argv[]) {
 
         formatted = mfree(formatted);
 
-        table_set_width(t, (size_t) -1);
-        assert_se(table_set_sort(t, (size_t) 0, (size_t) 2, (size_t) -1) >= 0);
+        table_set_width(t, SIZE_MAX);
+        assert_se(table_set_sort(t, (size_t) 0, (size_t) 2, SIZE_MAX) >= 0);
 
         assert_se(table_format(t, &formatted) >= 0);
         printf("%s\n", formatted);
@@ -485,7 +485,7 @@ int main(int argc, char *argv[]) {
 
         formatted = mfree(formatted);
 
-        assert_se(table_set_display(t, (size_t) 2, (size_t) 0, (size_t) 2, (size_t) 0, (size_t) 0, (size_t) -1) >= 0);
+        assert_se(table_set_display(t, (size_t) 2, (size_t) 0, (size_t) 2, (size_t) 0, (size_t) 0, SIZE_MAX) >= 0);
 
         assert_se(table_format(t, &formatted) >= 0);
         printf("%s\n", formatted);
index 8d6984d04cc22ab2be9c0a174da43af565b743f2..c42c48722f9fe6b214c767532d2905b6888c0abd 100644 (file)
@@ -864,7 +864,7 @@ static void test_conservative_rename(void) {
         assert_se(access(q, F_OK) < 0 && errno == ENOENT);
 
         /* Check that a manual copy is detected */
-        assert_se(copy_file(p, q, 0, (mode_t) -1, 0, 0, COPY_REFLINK) >= 0);
+        assert_se(copy_file(p, q, 0, MODE_INVALID, 0, 0, COPY_REFLINK) >= 0);
         assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) == 0);
         assert_se(access(q, F_OK) < 0 && errno == ENOENT);
 
index 222ffbb2a75b6b487d0c2ff11353d54b57cef67d..d2f201852650d76d6b3db9bde440d660be49fcac 100644 (file)
 #include "fstab-util.h"
 #include "log.h"
 #include "string-util.h"
+#include "strv.h"
 
 /*
-int fstab_filter_options(const char *opts, const char *names,
-                         const char **namefound, char **value, char **filtered);
+int fstab_filter_options(
+        const char *opts,
+        const char *names,
+        const char **ret_namefound,
+        const char **ret_value,
+        const char **ret_values,
+        char **ret_filtered);
 */
 
 static void do_fstab_filter_options(const char *opts,
                                     const char *remove,
                                     int r_expected,
+                                    int r_values_expected,
                                     const char *name_expected,
                                     const char *value_expected,
+                                    const char *values_expected,
                                     const char *filtered_expected) {
         int r;
         const char *name;
-        _cleanup_free_ char *value = NULL, *filtered = NULL;
+        _cleanup_free_ char *value = NULL, *filtered = NULL, *joined = NULL;
+        _cleanup_strv_free_ char **values = NULL;
 
-        r = fstab_filter_options(opts, remove, &name, &value, &filtered);
-        log_info("\"%s\" → %d, \"%s\", \"%s\", \"%s\", expected %d, \"%s\", \"%s\", \"%s\"",
-                 opts, r, name, value, filtered,
+        /* test mode which returns the last value */
+
+        r = fstab_filter_options(opts, remove, &name, &value, NULL, &filtered);
+        log_info("1: \"%s\" → %d, \"%s\", \"%s\", \"%s\", expected %d, \"%s\", \"%s\", \"%s\"",
+                 opts, r, strnull(name), value, filtered,
                  r_expected, name_expected, value_expected, filtered_expected ?: opts);
         assert_se(r == r_expected);
         assert_se(streq_ptr(name, name_expected));
         assert_se(streq_ptr(value, value_expected));
         assert_se(streq_ptr(filtered, filtered_expected ?: opts));
 
+        /* test mode which returns all the values */
+
+        r = fstab_filter_options(opts, remove, &name, NULL, &values, NULL);
+        assert_se(joined = strv_join(values, ":"));
+        log_info("2: \"%s\" → %d, \"%s\", \"%s\", expected %d, \"%s\", \"%s\"",
+                 opts, r, strnull(name), joined,
+                 r_values_expected, name_expected, values_expected);
+        assert_se(r == r_values_expected);
+        assert_se(streq_ptr(name, r_values_expected > 0 ? name_expected : NULL));
+        assert_se(streq_ptr(joined, values_expected));
+
         /* also test the malloc-less mode */
-        r = fstab_filter_options(opts, remove, &name, NULL, NULL);
-        log_info("\"%s\" → %d, \"%s\", expected %d, \"%s\"\n-",
-                 opts, r, name,
+        r = fstab_filter_options(opts, remove, &name, NULL, NULL, NULL);
+        log_info("3: \"%s\" → %d, \"%s\", expected %d, \"%s\"\n-",
+                 opts, r, strnull(name),
                  r_expected, name_expected);
         assert_se(r == r_expected);
         assert_se(streq_ptr(name, name_expected));
 }
 
 static void test_fstab_filter_options(void) {
-        do_fstab_filter_options("opt=0", "opt\0x-opt\0", 1, "opt", "0", "");
-        do_fstab_filter_options("opt=0", "x-opt\0opt\0", 1, "opt", "0", "");
-        do_fstab_filter_options("opt", "opt\0x-opt\0", 1, "opt", NULL, "");
-        do_fstab_filter_options("opt", "x-opt\0opt\0", 1, "opt", NULL, "");
-        do_fstab_filter_options("x-opt", "x-opt\0opt\0", 1, "x-opt", NULL, "");
-
-        do_fstab_filter_options("opt=0,other", "opt\0x-opt\0", 1, "opt", "0", "other");
-        do_fstab_filter_options("opt=0,other", "x-opt\0opt\0", 1, "opt", "0", "other");
-        do_fstab_filter_options("opt,other", "opt\0x-opt\0", 1, "opt", NULL, "other");
-        do_fstab_filter_options("opt,other", "x-opt\0opt\0", 1, "opt", NULL, "other");
-        do_fstab_filter_options("x-opt,other", "opt\0x-opt\0", 1, "x-opt", NULL, "other");
-
-        do_fstab_filter_options("opt=0\\,1,other", "opt\0x-opt\0", 1, "opt", "0,1", "other");
-        do_fstab_filter_options("opt=0,other,x-opt\\,foobar", "x-opt\0opt\0", 1, "opt", "0", "other,x-opt\\,foobar");
-        do_fstab_filter_options("opt,other,x-opt\\,part", "opt\0x-opt\0", 1, "opt", NULL, "other,x-opt\\,part");
-        do_fstab_filter_options("opt,other,part\\,x-opt", "x-opt\0opt\0", 1, "opt", NULL, "other,part\\,x-opt");
-        do_fstab_filter_options("opt,other\\,\\,\\,opt,x-part", "opt\0x-opt\0", 1, "opt", NULL, "other\\,\\,\\,opt,x-part");
-
-        do_fstab_filter_options("opto=0,other", "opt\0x-opt\0", 0, NULL, NULL, NULL);
-        do_fstab_filter_options("opto,other", "opt\0x-opt\0", 0, NULL, NULL, NULL);
-        do_fstab_filter_options("x-opto,other", "opt\0x-opt\0", 0, NULL, NULL, NULL);
-
-        do_fstab_filter_options("first,opt=0", "opt\0x-opt\0", 1, "opt", "0", "first");
-        do_fstab_filter_options("first=1,opt=0", "opt\0x-opt\0", 1, "opt", "0", "first=1");
-        do_fstab_filter_options("first,opt=", "opt\0x-opt\0", 1, "opt", "", "first");
-        do_fstab_filter_options("first=1,opt", "opt\0x-opt\0", 1, "opt", NULL, "first=1");
-        do_fstab_filter_options("first=1,x-opt", "opt\0x-opt\0", 1, "x-opt", NULL, "first=1");
-
-        do_fstab_filter_options("first,opt=0,last=1", "opt\0x-opt\0", 1, "opt", "0", "first,last=1");
-        do_fstab_filter_options("first=1,opt=0,last=2", "x-opt\0opt\0", 1, "opt", "0", "first=1,last=2");
-        do_fstab_filter_options("first,opt,last", "opt\0", 1, "opt", NULL, "first,last");
-        do_fstab_filter_options("first=1,opt,last", "x-opt\0opt\0", 1, "opt", NULL, "first=1,last");
-        do_fstab_filter_options("first=,opt,last", "opt\0noopt\0", 1, "opt", NULL, "first=,last");
+        do_fstab_filter_options("opt=0", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "");
+        do_fstab_filter_options("opt=0", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "");
+        do_fstab_filter_options("opt", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "");
+        do_fstab_filter_options("opt", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "");
+        do_fstab_filter_options("x-opt", "x-opt\0opt\0", 1, 0, "x-opt", NULL, "", "");
+
+        do_fstab_filter_options("opt=0,other", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "other");
+        do_fstab_filter_options("opt=0,other", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "other");
+        do_fstab_filter_options("opt,other", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "other");
+        do_fstab_filter_options("opt,other", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "other");
+        do_fstab_filter_options("x-opt,other", "opt\0x-opt\0", 1, 0, "x-opt", NULL, "", "other");
+
+        do_fstab_filter_options("opt=0\\,1,other", "opt\0x-opt\0", 1, 1, "opt", "0,1", "0,1", "other");
+        do_fstab_filter_options("opt=0,other,x-opt\\,foobar", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "other,x-opt\\,foobar");
+        do_fstab_filter_options("opt,other,x-opt\\,part", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "other,x-opt\\,part");
+        do_fstab_filter_options("opt,other,part\\,x-opt", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "other,part\\,x-opt");
+        do_fstab_filter_options("opt,other\\,\\,\\,opt,x-part", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "other\\,\\,\\,opt,x-part");
+
+        do_fstab_filter_options("opto=0,other", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+        do_fstab_filter_options("opto,other", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+        do_fstab_filter_options("x-opto,other", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+
+        do_fstab_filter_options("first,opt=0", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "first");
+        do_fstab_filter_options("first=1,opt=0", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "first=1");
+        do_fstab_filter_options("first,opt=", "opt\0x-opt\0", 1, 1, "opt", "", "", "first");
+        do_fstab_filter_options("first=1,opt", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "first=1");
+        do_fstab_filter_options("first=1,x-opt", "opt\0x-opt\0", 1, 0, "x-opt", NULL, "", "first=1");
+
+        do_fstab_filter_options("first,opt=0,last=1", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "first,last=1");
+        do_fstab_filter_options("first=1,opt=0,last=2", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "first=1,last=2");
+        do_fstab_filter_options("first,opt,last", "opt\0", 1, 0, "opt", NULL, "", "first,last");
+        do_fstab_filter_options("first=1,opt,last", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "first=1,last");
+        do_fstab_filter_options("first=,opt,last", "opt\0noopt\0", 1, 0, "opt", NULL, "", "first=,last");
 
         /* check repeated options */
-        do_fstab_filter_options("first,opt=0,noopt=1,last=1", "opt\0noopt\0", 1, "noopt", "1", "first,last=1");
-        do_fstab_filter_options("first=1,opt=0,last=2,opt=1", "opt\0", 1, "opt", "1", "first=1,last=2");
-        do_fstab_filter_options("x-opt=0,x-opt=1", "opt\0x-opt\0", 1, "x-opt", "1", "");
-        do_fstab_filter_options("opt=0,x-opt=1", "opt\0x-opt\0", 1, "x-opt", "1", "");
+        do_fstab_filter_options("first,opt=0,noopt=1,last=1", "opt\0noopt\0", 1, 1, "noopt", "1", "0:1", "first,last=1");
+        do_fstab_filter_options("first=1,opt=0,last=2,opt=1", "opt\0", 1, 1, "opt", "1", "0:1", "first=1,last=2");
+        do_fstab_filter_options("x-opt=0,x-opt=1", "opt\0x-opt\0", 1, 1, "x-opt", "1", "0:1", "");
+        do_fstab_filter_options("opt=0,x-opt=1", "opt\0x-opt\0", 1, 1, "x-opt", "1", "0:1", "");
+        do_fstab_filter_options("opt=0,opt=1,opt=,opt=,opt=2", "opt\0noopt\0", 1, 1, "opt", "2", "0:1:::2", "");
 
         /* check that semicolons are not misinterpreted */
-        do_fstab_filter_options("opt=0;", "opt\0", 1, "opt", "0;", "");
-        do_fstab_filter_options("opt;=0", "x-opt\0opt\0noopt\0x-noopt\0", 0, NULL, NULL, NULL);
-        do_fstab_filter_options("opt;", "opt\0x-opt\0", 0, NULL, NULL, NULL);
+        do_fstab_filter_options("opt=0;", "opt\0", 1, 1, "opt", "0;", "0;", "");
+        do_fstab_filter_options("opt;=0", "x-opt\0opt\0noopt\0x-noopt\0", 0, 0, NULL, NULL, "", NULL);
+        do_fstab_filter_options("opt;", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
 
         /* check that spaces are not misinterpreted */
-        do_fstab_filter_options("opt=0 ", "opt\0", 1, "opt", "0 ", "");
-        do_fstab_filter_options("opt =0", "x-opt\0opt\0noopt\0x-noopt\0", 0, NULL, NULL, NULL);
-        do_fstab_filter_options(" opt ", "opt\0x-opt\0", 0, NULL, NULL, NULL);
+        do_fstab_filter_options("opt=0 ", "opt\0", 1, 1, "opt", "0 ", "0 ", "");
+        do_fstab_filter_options("opt =0", "x-opt\0opt\0noopt\0x-noopt\0", 0, 0, NULL, NULL, "", NULL);
+        do_fstab_filter_options(" opt ", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+
+        /* check function with NULL args */
+        do_fstab_filter_options(NULL, "opt\0", 0, 0, NULL, NULL, "", "");
+        do_fstab_filter_options("", "opt\0", 0, 0, NULL, NULL, "", "");
+
+        /* unnecessary comma separators */
+        do_fstab_filter_options("opt=x,,,,", "opt\0", 1, 1, "opt", "x", "x", "");
+        do_fstab_filter_options(",,,opt=x,,,,", "opt\0", 1, 1, "opt", "x", "x", "");
 
-        /* check function will NULL args */
-        do_fstab_filter_options(NULL, "opt\0", 0, NULL, NULL, "");
-        do_fstab_filter_options("", "opt\0", 0, NULL, NULL, "");
+        /* escaped characters */
+        do_fstab_filter_options("opt1=\\\\,opt2=\\xff", "opt1\0", 1, 1, "opt1", "\\", "\\", "opt2=\\xff");
+        do_fstab_filter_options("opt1=\\\\,opt2=\\xff", "opt2\0", 1, 1, "opt2", "\\xff", "\\xff", "opt1=\\");
 }
 
 static void test_fstab_find_pri(void) {
index f0f96797690439d0477968c228ddb16fd9cb6c0f..c9d318b8d16183e3261a6506f8154b060b07c69b 100644 (file)
@@ -80,7 +80,7 @@ static void test_unhexmem_one(const char *s, size_t l, int retval) {
         if (retval == 0) {
                 char *answer;
 
-                if (l == (size_t) -1)
+                if (l == SIZE_MAX)
                         l = strlen(s);
 
                 assert_se(hex = hexmem(mem, len));
@@ -96,15 +96,15 @@ static void test_unhexmem(void) {
 
         test_unhexmem_one(NULL, 0, 0);
         test_unhexmem_one("", 0, 0);
-        test_unhexmem_one("", (size_t) -1, 0);
-        test_unhexmem_one("   \n \t\r   \t\t \n\n\n", (size_t) -1, 0);
+        test_unhexmem_one("", SIZE_MAX, 0);
+        test_unhexmem_one("   \n \t\r   \t\t \n\n\n", SIZE_MAX, 0);
         test_unhexmem_one(hex_invalid, strlen(hex_invalid), -EINVAL);
         test_unhexmem_one(hex_invalid, (size_t) - 1, -EINVAL);
         test_unhexmem_one(hex, strlen(hex) - 1, -EPIPE);
         test_unhexmem_one(hex, strlen(hex), 0);
-        test_unhexmem_one(hex, (size_t) -1, 0);
+        test_unhexmem_one(hex, SIZE_MAX, 0);
         test_unhexmem_one(hex_space, strlen(hex_space), 0);
-        test_unhexmem_one(hex_space, (size_t) -1, 0);
+        test_unhexmem_one(hex_space, SIZE_MAX, 0);
 }
 
 /* https://tools.ietf.org/html/rfc4648#section-10 */
@@ -186,7 +186,7 @@ static void test_unbase32hexmem_one(const char *hex, bool padding, int retval, c
         _cleanup_free_ void *mem = NULL;
         size_t len;
 
-        assert_se(unbase32hexmem(hex, (size_t) -1, padding, &mem, &len) == retval);
+        assert_se(unbase32hexmem(hex, SIZE_MAX, padding, &mem, &len) == retval);
         if (retval == 0) {
                 char *str;
 
@@ -279,7 +279,7 @@ static void test_unbase64mem_one(const char *input, const char *output, int ret)
         _cleanup_free_ void *buffer = NULL;
         size_t size = 0;
 
-        assert_se(unbase64mem(input, (size_t) -1, &buffer, &size) == ret);
+        assert_se(unbase64mem(input, SIZE_MAX, &buffer, &size) == ret);
 
         if (ret >= 0) {
                 assert_se(size == strlen(output));
index b162928482cb7e17b553596b7e74740603f1e8f3..bf4b87e8a678d72d4d89826fa18b9155f28c8cf5 100644 (file)
@@ -63,7 +63,7 @@ static void test_tmpdir(const char *id, const char *A, const char *B) {
         }
 }
 
-static void test_netns(void) {
+static void test_shareable_ns(unsigned long nsflag) {
         _cleanup_close_pair_ int s[2] = { -1, -1 };
         pid_t pid1, pid2, pid3;
         int r, n = 0;
@@ -80,7 +80,7 @@ static void test_netns(void) {
         assert_se(pid1 >= 0);
 
         if (pid1 == 0) {
-                r = setup_netns(s);
+                r = setup_shareable_ns(s, nsflag);
                 assert_se(r >= 0);
                 _exit(r);
         }
@@ -89,7 +89,7 @@ static void test_netns(void) {
         assert_se(pid2 >= 0);
 
         if (pid2 == 0) {
-                r = setup_netns(s);
+                r = setup_shareable_ns(s, nsflag);
                 assert_se(r >= 0);
                 exit(r);
         }
@@ -98,7 +98,7 @@ static void test_netns(void) {
         assert_se(pid3 >= 0);
 
         if (pid3 == 0) {
-                r = setup_netns(s);
+                r = setup_shareable_ns(s, nsflag);
                 assert_se(r >= 0);
                 exit(r);
         }
@@ -121,6 +121,14 @@ static void test_netns(void) {
         assert_se(n == 1);
 }
 
+static void test_netns(void) {
+        test_shareable_ns(CLONE_NEWNET);
+}
+
+static void test_ipcns(void) {
+        test_shareable_ns(CLONE_NEWIPC);
+}
+
 static void test_protect_kernel_logs(void) {
         int r;
         pid_t pid;
@@ -224,6 +232,7 @@ int main(int argc, char *argv[]) {
         test_tmpdir("sys-devices-pci0000:00-0000:00:1a.0-usb3-3\\x2d1-3\\x2d1:1.0-bluetooth-hci0.device", z, zz);
 
         test_netns();
+        test_ipcns();
         test_protect_kernel_logs();
 
         return EXIT_SUCCESS;
index 756934acad557b53e4e53c6355890a370033b656..b1b23e2fbfada53a86857adb595ca6fb64a802cd 100644 (file)
@@ -11,9 +11,6 @@
 #include "log.h"
 #include "parse-util.h"
 #include "string-util.h"
-#if HAVE_SECCOMP
-#include "seccomp-util.h"
-#endif
 
 static void test_parse_boolean(void) {
         assert_se(parse_boolean("1") == 1);
@@ -783,60 +780,6 @@ static void test_parse_errno(void) {
         assert_se(parse_errno("EINVALaaa") == -EINVAL);
 }
 
-static void test_parse_syscall_and_errno(void) {
-#if HAVE_SECCOMP
-        _cleanup_free_ char *n = NULL;
-        int e;
-
-        assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
-        assert_se(streq(n, "uname"));
-        assert_se(e == errno_from_name("EILSEQ") && e >= 0);
-        n = mfree(n);
-
-        assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
-        assert_se(streq(n, "uname"));
-        assert_se(e == errno_from_name("EINVAL") && e >= 0);
-        n = mfree(n);
-
-        assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
-        assert_se(streq(n, "@sync"));
-        assert_se(e == 4095);
-        n = mfree(n);
-
-        /* If errno is omitted, then e is set to -1 */
-        assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
-        assert_se(streq(n, "mount"));
-        assert_se(e == -1);
-        n = mfree(n);
-
-        /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
-        assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
-        assert_se(streq(n, "hoge"));
-        assert_se(e == 255);
-        n = mfree(n);
-
-        assert_se(parse_syscall_and_errno("hoge:kill", &n, &e) >= 0);
-        assert_se(streq(n, "hoge"));
-        assert_se(e == SECCOMP_ERROR_NUMBER_KILL);
-        n = mfree(n);
-
-        /* The function checks the syscall name is empty or not. */
-        assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
-
-        /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095, or "kill" */
-        assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
-        assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
-        assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
-        assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
-#endif
-}
-
 static void test_parse_mtu(void) {
         uint32_t mtu = 0;
 
@@ -914,7 +857,6 @@ int main(int argc, char *argv[]) {
         test_parse_nice();
         test_parse_dev();
         test_parse_errno();
-        test_parse_syscall_and_errno();
         test_parse_mtu();
         test_parse_loadavg_fixed_point();
 
index b92a77b9f4013cb0881294136d1156d1c5d1a462..b49b0ae9081691cdcfb559e1bdd32e4ad0d93c14 100644 (file)
@@ -838,6 +838,15 @@ static void test_path_startswith_strv(void) {
 int main(int argc, char **argv) {
         test_setup_logging(LOG_DEBUG);
 
+        log_info("PATH_MAX=%zu\n"
+                 "FILENAME_MAX=%zu\n"
+                 "NAME_MAX=%zu",
+                 (size_t) PATH_MAX,
+                 (size_t) FILENAME_MAX,
+                 (size_t) NAME_MAX);
+
+        assert_cc(FILENAME_MAX == PATH_MAX);
+
         test_print_paths();
         test_path();
         test_path_equal_root();
index 4bfa18195e5abccd1f2b38a9db903de5c4f18733..de902ca4270b6ce81b6f9aa99a6ec3d311a3b254 100644 (file)
@@ -72,7 +72,7 @@ static void test_struct(void) {
         assert_se(prioq_peek(q) == NULL);
         assert_se(prioq_peek_by_index(q, 0) == NULL);
         assert_se(prioq_peek_by_index(q, 1) == NULL);
-        assert_se(prioq_peek_by_index(q, (unsigned) -1) == NULL);
+        assert_se(prioq_peek_by_index(q, UINT_MAX) == NULL);
 
         for (i = 0; i < SET_SIZE; i++) {
                 assert_se(t = new0(struct test, 1));
index 0ebef530a032084ddf6ad5985b4cf27640384bab..5ca654e193f9485cbf12ab9385eff3eed51e49da 100644 (file)
@@ -236,6 +236,11 @@ static void test_get_process_cmdline_harder(void) {
                 return;
         }
 
+        /* Set RLIMIT_STACK to infinity to test we don't try to allocate unncessarily large values to read
+         * the cmdline. */
+        if (setrlimit(RLIMIT_STACK, &RLIMIT_MAKE_CONST(RLIM_INFINITY)) < 0)
+                log_warning("Testing without RLIMIT_STACK=infinity");
+
         assert_se(unlink(path) >= 0);
 
         assert_se(prctl(PR_SET_NAME, "testa") >= 0);
index 02a73ecdb269621be12ebe50a129406078db81cc..44103efa62a24a6fd3eb45486b68bf75b491c037 100644 (file)
@@ -1,17 +1,20 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
+#include <math.h>
+
 #include "hexdecoct.h"
-#include "random-util.h"
 #include "log.h"
+#include "memory-util.h"
+#include "random-util.h"
+#include "terminal-util.h"
 #include "tests.h"
 
 static void test_genuine_random_bytes(RandomFlags flags) {
         uint8_t buf[16] = {};
-        unsigned i;
 
         log_info("/* %s */", __func__);
 
-        for (i = 1; i < sizeof buf; i++) {
+        for (size_t i = 1; i < sizeof buf; i++) {
                 assert_se(genuine_random_bytes(buf, i, flags) == 0);
                 if (i + 1 < sizeof buf)
                         assert_se(buf[i] == 0);
@@ -22,11 +25,10 @@ static void test_genuine_random_bytes(RandomFlags flags) {
 
 static void test_pseudo_random_bytes(void) {
         uint8_t buf[16] = {};
-        unsigned i;
 
         log_info("/* %s */", __func__);
 
-        for (i = 1; i < sizeof buf; i++) {
+        for (size_t i = 1; i < sizeof buf; i++) {
                 pseudo_random_bytes(buf, i);
                 if (i + 1 < sizeof buf)
                         assert_se(buf[i] == 0);
@@ -36,9 +38,11 @@ static void test_pseudo_random_bytes(void) {
 }
 
 static void test_rdrand(void) {
-        int r, i;
+        int r;
+
+        log_info("/* %s */", __func__);
 
-        for (i = 0; i < 10; i++) {
+        for (unsigned i = 0; i < 10; i++) {
                 unsigned long x = 0;
 
                 r = rdrand(&x);
@@ -51,6 +55,50 @@ static void test_rdrand(void) {
         }
 }
 
+#define TOTAL 100000
+
+static void test_random_u64_range_one(unsigned mod) {
+        log_info("/* %s(%u) */", __func__, mod);
+
+        unsigned max = 0, count[mod];
+        zero(count);
+
+        for (unsigned i = 0; i < TOTAL; i++) {
+                uint64_t x;
+
+                x = random_u64_range(mod);
+
+                log_trace("%05u: %"PRIu64, i, x);
+                count[x]++;
+                max = MAX(max, count[x]);
+        }
+
+        /* Print histogram: vertical axis — value, horizontal axis — count.
+         *
+         * The expected value is always TOTAL/mod, because the distribution should be flat. The expected
+         * variance is TOTAL×p×(1-p), where p==1/mod, and standard deviation the root of the variance.
+         * Assert that the deviation from the expected value is less than 6 standard deviations.
+         */
+        unsigned scale = 2 * max / (columns() < 20 ? 80 : columns() - 20);
+        double exp = (double) TOTAL / mod;
+
+        for (size_t i = 0; i < mod; i++) {
+                double dev = (count[i] - exp) / sqrt(exp * (mod > 1 ? mod - 1 : 1) / mod);
+                log_debug("%02zu: %5u (%+.3f)%*s",
+                          i, count[i], dev,
+                          count[i] / scale, "x");
+
+                assert_se(fabs(dev) < 6); /* 6 sigma is excessive, but this check should be enough to
+                                           * identify catastrophic failure while minimizing false
+                                           * positives. */
+        }
+}
+
+static void test_random_u64_range(void) {
+        for (unsigned mod = 1; mod < 29; mod++)
+                test_random_u64_range_one(mod);
+}
+
 int main(int argc, char **argv) {
         test_setup_logging(LOG_DEBUG);
 
@@ -61,8 +109,8 @@ int main(int argc, char **argv) {
         test_genuine_random_bytes(RANDOM_ALLOW_INSECURE);
 
         test_pseudo_random_bytes();
-
         test_rdrand();
+        test_random_u64_range();
 
         return 0;
 }
index 10393b6a7cf8989653e52f5c26e5d309c36d0d5a..b1f917eb54e2503f1dadeff43fdcd5a333355a13 100644 (file)
 #  define SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN 0
 #endif
 
+static void test_parse_syscall_and_errno(void) {
+        _cleanup_free_ char *n = NULL;
+        int e;
+
+        assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
+        assert_se(streq(n, "uname"));
+        assert_se(e == errno_from_name("EILSEQ") && e >= 0);
+        n = mfree(n);
+
+        assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
+        assert_se(streq(n, "uname"));
+        assert_se(e == errno_from_name("EINVAL") && e >= 0);
+        n = mfree(n);
+
+        assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
+        assert_se(streq(n, "@sync"));
+        assert_se(e == 4095);
+        n = mfree(n);
+
+        /* If errno is omitted, then e is set to -1 */
+        assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
+        assert_se(streq(n, "mount"));
+        assert_se(e == -1);
+        n = mfree(n);
+
+        /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
+        assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
+        assert_se(streq(n, "hoge"));
+        assert_se(e == 255);
+        n = mfree(n);
+
+        /* 0 is also a valid errno. */
+        assert_se(parse_syscall_and_errno("hoge:0", &n, &e) >= 0);
+        assert_se(streq(n, "hoge"));
+        assert_se(e == 0);
+        n = mfree(n);
+
+        assert_se(parse_syscall_and_errno("hoge:kill", &n, &e) >= 0);
+        assert_se(streq(n, "hoge"));
+        assert_se(e == SECCOMP_ERROR_NUMBER_KILL);
+        n = mfree(n);
+
+        /* The function checks the syscall name is empty or not. */
+        assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
+
+        /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095, or "kill" */
+        assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
+        assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
+        assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
+        assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
+}
+
 static void test_seccomp_arch_to_string(void) {
         uint32_t a, b;
         const char *name;
@@ -1075,6 +1133,7 @@ static void test_restrict_suid_sgid(void) {
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
+        test_parse_syscall_and_errno();
         test_seccomp_arch_to_string();
         test_architecture_table();
         test_syscall_filter_set_find();
index af3ccec166f6ccfb9b89d3c6d3b5d147ec22f01c..da484a40032d07a443d370f5caa47f75a0493ebe 100644 (file)
@@ -74,7 +74,7 @@ static void test_socket_address_parse(void) {
         test_socket_address_parse_one("[::1]:1234%lo", 0, AF_INET6, NULL);
         test_socket_address_parse_one("[::1]:0%lo", -EINVAL, 0, NULL);
         test_socket_address_parse_one("[::1]%lo", -EINVAL, 0, NULL);
-        test_socket_address_parse_one("[::1]:1234%lo%lo", -ENODEV, 0, NULL);
+        test_socket_address_parse_one("[::1]:1234%lo%lo", -EINVAL, 0, NULL);
         test_socket_address_parse_one("[::1]:1234%xxxxasdf", -ENODEV, 0, NULL);
         test_socket_address_parse_one("192.168.1.254:8888", 0, AF_INET, NULL);
         test_socket_address_parse_one("/foo/bar", 0, AF_UNIX, NULL);
index 4ff7d714f8f79cf2f261e71a4d3c4fb6d9844243..584253c2fcb60c9a70b91c6774756ab815f81700 100644 (file)
@@ -504,6 +504,11 @@ static void test_flush_accept(void) {
         assert_se(flush_accept(listen_seqpacket) >= 0);
 }
 
+static void test_ipv6_enabled(void) {
+        log_info("IPv6 supported: %s", yes_no(socket_ipv6_is_supported()));
+        log_info("IPv6 enabled: %s", yes_no(socket_ipv6_is_enabled()));
+}
+
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
@@ -519,6 +524,7 @@ int main(int argc, char *argv[]) {
         test_send_nodata_nofd();
         test_send_emptydata();
         test_flush_accept();
+        test_ipv6_enabled();
 
         return 0;
 }
index 9aca09c4defa359f59a1bd6567a4e0f6bd2768b9..4dd18be65cdd805af0251687ed477fd179e62ff7 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <fcntl.h>
 #include <linux/magic.h>
+#include <sched.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -67,18 +68,22 @@ static void test_path_is_temporary_fs(void) {
         assert_se(path_is_temporary_fs("/i-dont-exist") == -ENOENT);
 }
 
-static void test_fd_is_network_ns(void) {
+static void test_fd_is_ns(void) {
         _cleanup_close_ int fd = -1;
-        assert_se(fd_is_network_ns(STDIN_FILENO) == 0);
-        assert_se(fd_is_network_ns(STDERR_FILENO) == 0);
-        assert_se(fd_is_network_ns(STDOUT_FILENO) == 0);
+        assert_se(fd_is_ns(STDIN_FILENO, CLONE_NEWNET) == 0);
+        assert_se(fd_is_ns(STDERR_FILENO, CLONE_NEWNET) == 0);
+        assert_se(fd_is_ns(STDOUT_FILENO, CLONE_NEWNET) == 0);
 
         assert_se((fd = open("/proc/self/ns/mnt", O_CLOEXEC|O_RDONLY)) >= 0);
-        assert_se(IN_SET(fd_is_network_ns(fd), 0, -EUCLEAN));
+        assert_se(IN_SET(fd_is_ns(fd, CLONE_NEWNET), 0, -EUCLEAN));
+        fd = safe_close(fd);
+
+        assert_se((fd = open("/proc/self/ns/ipc", O_CLOEXEC|O_RDONLY)) >= 0);
+        assert_se(IN_SET(fd_is_ns(fd, CLONE_NEWIPC), 1, -EUCLEAN));
         fd = safe_close(fd);
 
         assert_se((fd = open("/proc/self/ns/net", O_CLOEXEC|O_RDONLY)) >= 0);
-        assert_se(IN_SET(fd_is_network_ns(fd), 1, -EUCLEAN));
+        assert_se(IN_SET(fd_is_ns(fd, CLONE_NEWNET), 1, -EUCLEAN));
 }
 
 static void test_device_major_minor_valid(void) {
@@ -159,7 +164,7 @@ int main(int argc, char *argv[]) {
         test_is_symlink();
         test_path_is_fs_type();
         test_path_is_temporary_fs();
-        test_fd_is_network_ns();
+        test_fd_is_ns();
         test_device_major_minor_valid();
         test_device_path_make_canonical();
 
index fec9577d1f1760dfae628bd4e7a7cce66b0d676e..15ea24ae4bec2f80de03ee5beb2568cc8f85fdb6 100644 (file)
@@ -345,6 +345,12 @@ static void test_strjoina(void) {
 
         actual = strjoina("foo", NULL, "bar");
         assert_se(streq(actual, "foo"));
+
+        actual = strjoina("/sys/fs/cgroup/", "dn", "/a/b/c", "/cgroup.procs");
+        assert_se(streq(actual, "/sys/fs/cgroup/dn/a/b/c/cgroup.procs"));
+
+        actual = strjoina("/sys/fs/cgroup/", "dn", NULL, NULL);
+        assert_se(streq(actual, "/sys/fs/cgroup/dn"));
 }
 
 static void test_strjoin(void) {
index 6b5005f9fc9cedf6a90d556e48d4585e36a76117..039bb2c78af326c33db50d7f7e2d4b924c703d9f 100644 (file)
@@ -118,6 +118,20 @@ static const char* const input_table_one_empty[] = {
         NULL,
 };
 
+static const char* const input_table_unescape[] = {
+        "ID_VENDOR=QEMU",
+        "ID_VENDOR_ENC=QEMUx20x20x20x20",
+        "ID_MODEL_ENC=QEMUx20HARDDISKx20x20x20",
+        NULL,
+};
+
+static const char* const input_table_retain_escape[] = {
+        "ID_VENDOR=QEMU",
+        "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20",
+        "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20",
+        NULL,
+};
+
 static void test_strv_find(void) {
         log_info("/* %s */", __func__);
 
@@ -319,12 +333,12 @@ static void test_strv_split(void) {
         l = strv_free_erase(l);
 
         assert_se(strv_split_full(&l, "    'one'  \"  two\t three \"' four  five", NULL,
-                                     EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_CUNESCAPE_RELAX) == 2);
+                                     EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_UNESCAPE_RELAX) == 2);
         assert_se(strv_equal(l, (char**) input_table_quoted_joined));
 
         l = strv_free_erase(l);
 
-        assert_se(strv_split_full(&l, "\\", NULL, EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_CUNESCAPE_RELAX) == 1);
+        assert_se(strv_split_full(&l, "\\", NULL, EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_UNESCAPE_RELAX) == 1);
         assert_se(strv_equal(l, STRV_MAKE("\\")));
 }
 
@@ -453,6 +467,25 @@ static void test_strv_split_newlines(void) {
                 assert_se(streq(*s, input_table_multiple[i++]));
 }
 
+static void test_strv_split_newlines_full(void) {
+        const char str[] =
+                "ID_VENDOR=QEMU\n"
+                "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20\n"
+                "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20\n"
+                "\n\n\n";
+        _cleanup_strv_free_ char **l = NULL;
+
+        log_info("/* %s */", __func__);
+
+        assert_se(strv_split_newlines_full(&l, str, 0) == 3);
+        assert_se(strv_equal(l, (char**) input_table_unescape));
+
+        l = strv_free(l);
+
+        assert_se(strv_split_newlines_full(&l, str, EXTRACT_RETAIN_ESCAPE) == 3);
+        assert_se(strv_equal(l, (char**) input_table_retain_escape));
+}
+
 static void test_strv_split_nulstr(void) {
         _cleanup_strv_free_ char **l = NULL;
         const char nulstr[] = "str0\0str1\0str2\0str3\0";
@@ -1031,6 +1064,7 @@ int main(int argc, char *argv[]) {
         test_strv_split_full();
         test_strv_split_colon_pairs();
         test_strv_split_newlines();
+        test_strv_split_newlines_full();
         test_strv_split_nulstr();
         test_strv_parse_nulstr();
         test_strv_overlap();
index c7b6d8dd534ec427e4bf68c39fcd683d6de4c149..042b94634b01372007be7eb56967e9a0fcfdb906 100644 (file)
@@ -75,7 +75,7 @@ static void test_utf8_encoded_valid_unichar(void) {
         assert_se(utf8_encoded_valid_unichar("\302\256", 1) == -EINVAL); /* truncated */
         assert_se(utf8_encoded_valid_unichar("\302\256", 2) == 2);
         assert_se(utf8_encoded_valid_unichar("\302\256", 3) == 2);
-        assert_se(utf8_encoded_valid_unichar("\302\256", (size_t) -1) == 2);
+        assert_se(utf8_encoded_valid_unichar("\302\256", SIZE_MAX) == 2);
         assert_se(utf8_encoded_valid_unichar("a", 1) == 1);
         assert_se(utf8_encoded_valid_unichar("a", 2) == 1);
         assert_se(utf8_encoded_valid_unichar("\341\204", 1) == -EINVAL); /* truncated, potentially valid */
@@ -196,7 +196,7 @@ static void test_utf8_n_codepoints(void) {
         assert_se(utf8_n_codepoints("串") == 1);
         assert_se(utf8_n_codepoints("") == 0);
         assert_se(utf8_n_codepoints("…👊🔪💐…") == 5);
-        assert_se(utf8_n_codepoints("\xF1") == (size_t) -1);
+        assert_se(utf8_n_codepoints("\xF1") == SIZE_MAX);
 }
 
 static void test_utf8_console_width(void) {
@@ -207,7 +207,7 @@ static void test_utf8_console_width(void) {
         assert_se(utf8_console_width("串") == 2);
         assert_se(utf8_console_width("") == 0);
         assert_se(utf8_console_width("…👊🔪💐…") == 8);
-        assert_se(utf8_console_width("\xF1") == (size_t) -1);
+        assert_se(utf8_console_width("\xF1") == SIZE_MAX);
 }
 
 static void test_utf8_to_utf16(void) {
index 1257d950aee60e62a406f00c3b5d143f231bd533..567244dc244ede65bc89285c27dd7ef85ba2e0a9 100644 (file)
@@ -211,7 +211,7 @@ static int context_parse_ntp_services_from_disk(Context *c) {
                                 break;
 
                         word = strstrip(line);
-                        if (isempty(word) || startswith("#", word))
+                        if (isempty(word) || startswith(word, "#"))
                                 continue;
 
                         r = context_add_ntp_service(c, word, *f);
index ed6bbb4c81c6fcfe85b075e467493774b55031f3..42b6c29d3b4e18637c2e31ae45e0df001d3fcecb 100644 (file)
@@ -72,6 +72,13 @@ static double ts_to_d(const struct timespec *ts) {
         return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
 }
 
+static uint32_t graceful_add_offset_1900_1970(time_t t) {
+        /* Adds OFFSET_1900_1970 to t and returns it as 32bit value. This is handles overflows
+         * gracefully in a deterministic and well-defined way by cutting off the top bits. */
+        uint64_t a = (uint64_t) t + OFFSET_1900_1970;
+        return (uint32_t) (a & UINT64_C(0xFFFFFFFF));
+}
+
 static int manager_timeout(sd_event_source *source, usec_t usec, void *userdata) {
         _cleanup_free_ char *pretty = NULL;
         Manager *m = userdata;
@@ -121,7 +128,7 @@ static int manager_send_request(Manager *m) {
          */
         assert_se(clock_gettime(clock_boottime_or_monotonic(), &m->trans_time_mon) >= 0);
         assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0);
-        ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
+        ntpmsg.trans_time.sec = htobe32(graceful_add_offset_1900_1970(m->trans_time.tv_sec));
         ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
 
         server_address_pretty(m->current_server_address, &pretty);
@@ -476,7 +483,7 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
         m->missed_replies = 0;
 
         /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
-        if (be32toh(ntpmsg.origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
+        if (be32toh(ntpmsg.origin_time.sec) != graceful_add_offset_1900_1970(m->trans_time.tv_sec) ||
             be32toh(ntpmsg.origin_time.frac) != (unsigned long) m->trans_time.tv_nsec) {
                 log_debug("Invalid reply; not our transmit time. Ignoring.");
                 return 0;
index ee66a3c312a1e4ee3d1768b408302e3cacdf313f..5ee82c708b709ab36f93579b3fce3d86729ede10 100644 (file)
@@ -6,7 +6,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
-#include <poll.h>
 #include <stdbool.h>
 #include <stddef.h>
 #include <sys/prctl.h>
@@ -366,7 +365,7 @@ static int process_and_watch_password_files(bool watch) {
         }
 
         for (;;) {
-                int timeout = -1;
+                usec_t timeout = USEC_INFINITY;
 
                 r = process_password_files();
                 if (r < 0) {
@@ -385,16 +384,11 @@ static int process_and_watch_password_files(bool watch) {
                 if (!watch)
                         break;
 
-                if (poll(pollfd, _FD_MAX, timeout) < 0) {
-                        if (errno == EINTR)
-                                continue;
-
-                        return -errno;
-                }
-
-                if (pollfd[FD_SIGNAL].revents & POLLNVAL ||
-                    pollfd[FD_INOTIFY].revents & POLLNVAL)
-                        return -EBADF;
+                r = ppoll_usec(pollfd, _FD_MAX, timeout);
+                if (r == -EINTR)
+                        continue;
+                if (r < 0)
+                        return r;
 
                 if (pollfd[FD_INOTIFY].revents != 0)
                         (void) flush_fd(notify);
index 10d64d526085302aa3489c1107bc07d083e08a3b..31e5d0cd673f94baf9cbe02aab333bb8e96aa160 100644 (file)
@@ -110,19 +110,20 @@ int link_config_ctx_new(link_config_ctx **ret) {
 
 int link_load_one(link_config_ctx *ctx, const char *filename) {
         _cleanup_(link_config_freep) link_config *link = NULL;
-        _cleanup_fclose_ FILE *file = NULL;
         _cleanup_free_ char *name = NULL;
+        const char *dropin_dirname;
         size_t i;
         int r;
 
         assert(ctx);
         assert(filename);
 
-        file = fopen(filename, "re");
-        if (!file)
-                return errno == ENOENT ? 0 : -errno;
-
-        if (null_or_empty_fd(fileno(file))) {
+        r = null_or_empty_path(filename);
+        if (r == -ENOENT)
+                return 0;
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 log_debug("Skipping empty file: %s", filename);
                 return 0;
         }
@@ -151,11 +152,14 @@ int link_load_one(link_config_ctx *ctx, const char *filename) {
         for (i = 0; i < ELEMENTSOF(link->features); i++)
                 link->features[i] = -1;
 
-        r = config_parse(NULL, filename, file,
-                         "Match\0Link\0",
-                         config_item_perf_lookup, link_config_gperf_lookup,
-                         CONFIG_PARSE_WARN, link,
-                         NULL);
+        dropin_dirname = strjoina(basename(filename), ".d");
+        r = config_parse_many(
+                        STRV_MAKE_CONST(filename),
+                        (const char* const*) CONF_PATHS_STRV("systemd/network"),
+                        dropin_dirname,
+                        "Match\0Link\0",
+                        config_item_perf_lookup, link_config_gperf_lookup,
+                        CONFIG_PARSE_WARN, link, NULL);
         if (r < 0)
                 return r;
 
@@ -437,8 +441,6 @@ static int link_config_apply_rtnl_settings(sd_netlink **rtnl, const link_config
 
 static int link_config_generate_new_name(const link_config_ctx *ctx, const link_config *config, sd_device *device, const char **ret_name) {
         unsigned name_type = NET_NAME_UNKNOWN;
-        const char *new_name = NULL;
-        NamePolicy policy;
         int r;
 
         assert(ctx);
@@ -456,7 +458,8 @@ static int link_config_generate_new_name(const link_config_ctx *ctx, const link_
 
         if (ctx->enable_name_policy && config->name_policy)
                 for (NamePolicy *p = config->name_policy; *p != _NAMEPOLICY_INVALID; p++) {
-                        policy = *p;
+                        const char *new_name = NULL;
+                        NamePolicy policy = *p;
 
                         switch (policy) {
                         case NAMEPOLICY_KERNEL:
@@ -492,16 +495,13 @@ static int link_config_generate_new_name(const link_config_ctx *ctx, const link_
                         default:
                                 assert_not_reached("invalid policy");
                         }
-                        if (ifname_valid(new_name))
-                                break;
+                        if (ifname_valid(new_name)) {
+                                log_device_debug(device, "Policy *%s* yields \"%s\".", name_policy_to_string(policy), new_name);
+                                *ret_name = new_name;
+                                return 0;
+                        }
                 }
 
-        if (new_name) {
-                log_device_debug(device, "Policy *%s* yields \"%s\".", name_policy_to_string(policy), new_name);
-                *ret_name = new_name;
-                return 0;
-        }
-
         if (config->name) {
                 log_device_debug(device, "Policies didn't yield a name, using specified Name=%s.", config->name);
                 *ret_name = config->name;
index 78a999d00a1ed316b1f809aa5e16cb9525270f4a..12597194a91d7e2f64a385d5985da16c99371639 100644 (file)
@@ -573,9 +573,11 @@ static int on_spawn_io(sd_event_source *s, int fd, uint32_t revents, void *userd
                 _cleanup_strv_free_ char **v = NULL;
                 char **q;
 
-                v = strv_split_newlines(p);
-                if (!v)
-                        log_oom_debug();
+                r = strv_split_newlines_full(&v, p, EXTRACT_RETAIN_ESCAPE);
+                if (r < 0)
+                        log_device_debug(spawn->device,
+                                         "Failed to split output from '%s'(%s), ignoring: %m",
+                                         spawn->cmd, fd == spawn->fd_stdout ? "out" : "err");
 
                 STRV_FOREACH(q, v)
                         log_device_debug(spawn->device, "'%s'(%s) '%s'", spawn->cmd,
@@ -1041,6 +1043,8 @@ int udev_event_execute_rules(UdevEvent *event,
         if (r < 0)
                 return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
 
+        device_set_is_initialized(dev);
+
         /* Yes, we run update_devnode() twice, because in the first invocation, that is before update of udev database,
          * it could happen that two contenders are replacing each other's symlink. Hence we run it again to make sure
          * symlinks point to devices that claim them with the highest priority. */
@@ -1048,8 +1052,6 @@ int udev_event_execute_rules(UdevEvent *event,
         if (r < 0)
                 return r;
 
-        device_set_is_initialized(dev);
-
         return 0;
 }
 
index 0f10116a997075600d9d3311e3b9f638b266c05e..57ede6a197f6dffef867b835fb11f4de8c1dd35f 100644 (file)
@@ -1746,9 +1746,10 @@ static int udev_rule_apply_token_to_event(
                         return token->op == OP_NOMATCH;
                 }
 
-                lines = strv_split_newlines(result);
-                if (!lines)
-                        return log_oom();
+                r = strv_split_newlines_full(&lines, result, EXTRACT_RETAIN_ESCAPE);
+                if (r < 0)
+                        log_rule_warning_errno(dev, rules, r,
+                                               "Failed to extract lines from result of command \"%s\", ignoring: %m", buf);
 
                 STRV_FOREACH(line, lines) {
                         char *key, *value;
index 102721dd504a54953e7ea68f18dd069cda7ac07d..e9c6957143aeb642e739a519cf728f5ea38c4a13 100644 (file)
@@ -112,8 +112,8 @@ static int display_user(int argc, char *argv[], void *userdata) {
                 (void) table_set_align_percent(table, table_get_cell(table, 0, 2), 100);
                 (void) table_set_align_percent(table, table_get_cell(table, 0, 3), 100);
                 (void) table_set_empty_string(table, "-");
-                (void) table_set_sort(table, (size_t) 7, (size_t) 2, (size_t) -1);
-                (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 5, (size_t) 6, (size_t) -1);
+                (void) table_set_sort(table, (size_t) 7, (size_t) 2);
+                (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 5, (size_t) 6);
         }
 
         if (argc > 1) {
@@ -262,8 +262,8 @@ static int display_group(int argc, char *argv[], void *userdata) {
 
                 (void) table_set_align_percent(table, table_get_cell(table, 0, 2), 100);
                 (void) table_set_empty_string(table, "-");
-                (void) table_set_sort(table, (size_t) 3, (size_t) 2, (size_t) -1);
-                (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) -1);
+                (void) table_set_sort(table, (size_t) 3, (size_t) 2);
+                (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3);
         }
 
         if (argc > 1) {
@@ -402,7 +402,7 @@ static int display_memberships(int argc, char *argv[], void *userdata) {
                 if (!table)
                         return log_oom();
 
-                (void) table_set_sort(table, (size_t) 0, (size_t) 1, (size_t) -1);
+                (void) table_set_sort(table, (size_t) 0, (size_t) 1);
         }
 
         if (argc > 1) {
@@ -491,7 +491,7 @@ static int display_services(int argc, char *argv[], void *userdata) {
         if (!t)
                 return log_oom();
 
-        (void) table_set_sort(t, (size_t) 0, (size_t) -1);
+        (void) table_set_sort(t, (size_t) 0);
 
         FOREACH_DIRENT(de, d, return -errno) {
                 _cleanup_free_ char *j = NULL, *no = NULL;
index d16d7edebd5a3256c4e7bcc68165929cd0792676..fd95e6f304b1527286d729c41baca4980e6835ee 100644 (file)
@@ -86,7 +86,7 @@ static int create_device(void) {
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        options_escaped = specifier_escape(arg_options ?: "");
+        options_escaped = specifier_escape(strempty(arg_options));
         if (!options_escaped)
                 return log_oom();
 
index 1528432f43329fa9edeeb59bb1f089e531ba609b..00d8b76539844a0ab218c7e8db454c9acd59192c 100644 (file)
@@ -599,6 +599,7 @@ int xdg_autostart_service_generate_unit(
         fprintf(f,
                 "\n[Service]\n"
                 "Type=exec\n"
+                "ExitType=cgroup\n"
                 "ExecStart=:%s\n"
                 "Restart=no\n"
                 "TimeoutSec=5s\n"
diff --git a/sysctl.d/README b/sysctl.d/README
new file mode 100644 (file)
index 0000000..ab216b1
--- /dev/null
@@ -0,0 +1,8 @@
+Files in this directory contain configuration for systemd-sysctl.service, a
+service to configure sysctl kernel parameters.
+
+See man:sysctl.d(5) for explanation of the configuration file format, and
+man:sysctl(8) and man:systemd-sysctl.service(8) for a description of when and
+how this configuration is applied.
+
+Use 'systemd-analyze cat-config sysctl.d' to display the effective config.
index e8d8fc8c53b2d77a166d42dddd5b31da7a866127..7e3482af62a99589b21f8b2060e1d8980a01a1f4 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
 install_data(
+        'README',
         '50-default.conf',
         install_dir : sysctldir)
 
diff --git a/sysusers.d/README b/sysusers.d/README
new file mode 100644 (file)
index 0000000..df3049c
--- /dev/null
@@ -0,0 +1,8 @@
+Files in this directory contain configuration for systemd-sysusers, a program
+to allocate system users and groups.
+
+See man:sysusers.d(5) for explanation of the configuration file format, and
+man:systemd-sysusers(8) for a description of when and how this configuration is
+applied.
+
+Use 'systemd-analyze cat-config sysusers.d' to display the effective config.
index 8e358c02d65e27480952cdfeda5afc04674c4092..4be0bd869e7fff6f7016403ca86f4dab38778417 100644 (file)
@@ -31,6 +31,7 @@ g input   -     -            -
 g kvm     -     -            -
 g lp      -     -            -
 g render  -     -            -
+g sgx     -     -            -
 g tape    -     -            -
 g video   -     -            -
 
index 93a61f0d9a892606e5f7b23f2dbd95e245d86db5..ef809a4f4486dfbbe6e5833f8197086fe9a6d253 100644 (file)
@@ -1,5 +1,9 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
+if enable_sysusers
+        install_data('README', install_dir : sysusersdir)
+endif
+
 in_files = ['basic.conf']
 
 foreach file : in_files
diff --git a/test/TEST-17-UDEV-WANTS/test.sh b/test/TEST-17-UDEV-WANTS/test.sh
deleted file mode 100755 (executable)
index 5b8f22c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-set -e
-TEST_DESCRIPTION="UDEV SYSTEMD_WANTS property"
-TEST_NO_NSPAWN=1
-
-. $TEST_BASE_DIR/test-functions
-QEMU_TIMEOUT=300
-
-do_test "$@" 17
similarity index 61%
rename from test/TEST-29-UDEV-ID_RENAMING/test.sh
rename to test/TEST-17-UDEV/test.sh
index c918e5af6aaed39021904a5bb972a132ccf43a45..b13ae0aa78267ff69c644207aba541fbd8a6babd 100755 (executable)
@@ -1,11 +1,11 @@
 #!/usr/bin/env bash
 set -e
-TEST_DESCRIPTION="UDEV ID_RENAMING property"
-IMAGE_NAME="udev-id-renaming"
+TEST_DESCRIPTION="UDEV"
+IMAGE_NAME="udev"
 TEST_NO_NSPAWN=1
 
 . $TEST_BASE_DIR/test-functions
-QEMU_TIMEOUT=300
+QEMU_TIMEOUT=500
 
 test_append_files() {
     (
@@ -14,4 +14,4 @@ test_append_files() {
     )
 }
 
-do_test "$@" 29
+do_test "$@" 17
index 317e4a88f787f78f21f37ee7df6691e68afdce0a..e4874b4d230ee328627aa5c43b4489880fdb9fb2 100755 (executable)
@@ -4,4 +4,15 @@ TEST_DESCRIPTION="Tmpfiles related tests"
 TEST_NO_QEMU=1
 . $TEST_BASE_DIR/test-functions
 
+test_append_files() {
+    if [[ "$IS_BUILT_WITH_ASAN" == "yes" ]]; then
+        if [[ -z "$initdir" ]]; then
+            echo >&2 "\$initdir is not defined, can't continue"
+            exit 1
+        fi
+
+        sed -i "s/systemd//g" "$initdir/etc/nsswitch.conf"
+    fi
+}
+
 do_test "$@" 22
similarity index 97%
rename from test/TEST-58-PORTABLE/test.sh
rename to test/TEST-29-PORTABLE/test.sh
index 98e697962e324c777b1ee06c1e914dc5d5cdb021..801e74c13d828a4e109fc065ea1e8c69811dad9d 100755 (executable)
@@ -24,4 +24,4 @@ test_append_files() {
     )
 }
 
-do_test "$@" 58
+do_test "$@" 29
similarity index 89%
rename from test/TEST-57-RUNTIME-BIND-PATHS/test.sh
rename to test/TEST-49-RUNTIME-BIND-PATHS/test.sh
index 76d1b496adbf88652bdaa2443272b63f75e54ab1..ff24a4f254efc7afc2a043225ccfcbb9b632f814 100755 (executable)
@@ -4,4 +4,4 @@ set -e
 TEST_DESCRIPTION="test adding new BindPaths while unit is already running"
 . $TEST_BASE_DIR/test-functions
 
-do_test "$@" 57
+do_test "$@" 49
diff --git a/test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh b/test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh
deleted file mode 100755 (executable)
index 249d8a2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-set -e
-
-TEST_DESCRIPTION="test udev's event-timeout and timeout-signal options"
-TEST_NO_NSPAWN=1
-. $TEST_BASE_DIR/test-functions
-
-do_test "$@" 49
similarity index 98%
rename from test/TEST-56-OOMD/test.sh
rename to test/TEST-55-OOMD/test.sh
index 55b0d1dafdb238ef7e375ebf00578f23221a08ac..121aa8d56e9393d1cb615354f6239f76375c353f 100755 (executable)
@@ -45,4 +45,4 @@ check_result_qemu() {
     return $ret
 }
 
-do_test "$@" 56
+do_test "$@" 55
diff --git a/test/TEST-55-UDEV-TAGS/test.sh b/test/TEST-55-UDEV-TAGS/test.sh
deleted file mode 100755 (executable)
index 325d70f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-set -e
-TEST_DESCRIPTION="UDEV tags management"
-TEST_NO_NSPAWN=1
-
-. $TEST_BASE_DIR/test-functions
-
-do_test "$@" 55
diff --git a/test/TEST-56-EXIT-TYPE/test.sh b/test/TEST-56-EXIT-TYPE/test.sh
new file mode 100755 (executable)
index 0000000..fc321e4
--- /dev/null
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -e
+TEST_DESCRIPTION="test ExitType=cgroup"
+. $TEST_BASE_DIR/test-functions
+
+do_test "$@" 56
diff --git a/test/TEST-57-RUNTIME-BIND-PATHS/Makefile b/test/TEST-57-RUNTIME-BIND-PATHS/Makefile
deleted file mode 120000 (symlink)
index e9f93b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../TEST-01-BASIC/Makefile
\ No newline at end of file
diff --git a/test/TEST-58-PORTABLE/Makefile b/test/TEST-58-PORTABLE/Makefile
deleted file mode 120000 (symlink)
index e9f93b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../TEST-01-BASIC/Makefile
\ No newline at end of file
diff --git a/test/fuzz/fuzz-bus-match/bugzilla1935084.input b/test/fuzz/fuzz-bus-match/bugzilla1935084.input
new file mode 100644 (file)
index 0000000..1a0b3cf
--- /dev/null
@@ -0,0 +1 @@
+type='signal',sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0=':1.134'
diff --git a/test/fuzz/fuzz-bus-match/test.input b/test/fuzz/fuzz-bus-match/test.input
new file mode 100644 (file)
index 0000000..92c02fc
--- /dev/null
@@ -0,0 +1,18 @@
+arg2='wal\'do',sender='foo',type='signal',interface='bar.x',
+arg2='wal\'do2',sender='foo',type='signal',interface='bar.x',
+arg3='test',sender='foo',type='signal',interface='bar.x',
+arg3='test',sender='foo',type='method_call',interface='bar.x',
+
+interface='quux.x'
+interface='bar.x'
+member='waldo',path='/foo/bar'
+path='/foo/bar'
+path_namespace='/foo'
+path_namespace='/foo/quux'
+arg1='two'
+member='waldo',arg2path='/prefix/'
+member=waldo,path='/foo/bar',arg3namespace='prefix'
+arg4has='pi'
+arg4has='pa'
+arg4has='po'
+arg4='pi'
index e2e8f61c67c559974433d8690803eafd4caeae86..310dbd6add2be3b09e1e344f122a1b677511bd29 100644 (file)
@@ -94,6 +94,7 @@ ExecStartPre=
 ExecStop=
 ExecStopPost=
 ExecStopPre=
+ExitType=
 FailureAction=
 FileDescriptorName=
 FileDescriptorStoreMax=
@@ -111,6 +112,7 @@ IOWriteIOPSMax=
 IPAccounting=
 IPAddressAllow=
 IPAddressDeny=
+IPCNamespacePath=
 IPTOS=
 IPTTL=
 IgnoreOnIsolate=
@@ -151,6 +153,7 @@ MemorySwapMax=
 MessageQueueMaxMessages=
 MessageQueueMessageSize=
 MountAPIVFS=
+NetworkNamespacePath=
 NoDelay=
 NoExecPaths=
 NoNewPrivileges=
@@ -856,6 +859,7 @@ PivotRoot=
 Port=
 PowerKeyIgnoreInhibited=
 Private=
+PrivateIPC=
 PrivateDevices=
 PrivateNetwork=
 PrivateTmp=
diff --git a/test/test-execute/exec-systemcallfilter-with-errno-in-allow-list.service b/test/test-execute/exec-systemcallfilter-with-errno-in-allow-list.service
new file mode 100644 (file)
index 0000000..4b2636e
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=Test for SystemCallFilter with errno name (for issue #18916)
+
+[Service]
+ExecStart=/usr/bin/python3 -c 'import os\ntry: os.uname()\nexcept Exception as e: exit(e.errno)'
+Type=oneshot
+SystemCallFilter=@system-service
+SystemCallFilter=~uname:EILSEQ
+SystemCallErrorNumber=EACCES
index b2a875ffce4072f0b1c67636b7cf96080be2ccbe..6b94058fd366a989544f5acf97b1406d70162389 100644 (file)
@@ -198,13 +198,15 @@ if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then
     SKIP_INITRD="${SKIP_INITRD:-yes}"
     PATH_TO_INIT=$ROOTLIBDIR/systemd-under-asan
     QEMU_MEM="2048M"
-    QEMU_SMP=4
+    QEMU_SMP="${QEMU_SMP:-4}"
 
     # We need to correctly distinguish between gcc's and clang's ASan DSOs.
-    if ldd $SYSTEMD | grep -q libasan.so; then
+    if ASAN_RT_NAME="$(ldd "$SYSTEMD" | awk '/libasan.so/ {x=$1; exit} END {print x; exit x==""}')"; then
         ASAN_COMPILER=gcc
-    elif ldd $SYSTEMD | grep -q libclang_rt.asan; then
+        ASAN_RT_PATH="$(readlink -f "$(${CC:-gcc} --print-file-name "$ASAN_RT_NAME")")"
+    elif ASAN_RT_NAME="$(ldd "$SYSTEMD" | awk '/libclang_rt.asan/ {x=$1; exit} END {print x; exit x==""}')"; then
         ASAN_COMPILER=clang
+        ASAN_RT_PATH="$(readlink -f "$(${CC:-clang} --print-file-name "$ASAN_RT_NAME")")"
 
         # As clang's ASan DSO is usually in a non-standard path, let's check if
         # the environment is set accordingly. If not, warn the user and exit.
@@ -212,10 +214,8 @@ if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then
         # user should encounter (and fix) the same issue when running the unit
         # tests (meson test)
         if ldd "$SYSTEMD" | grep -q "libclang_rt.asan.*not found"; then
-            _asan_rt_name="$(ldd $SYSTEMD | awk '/libclang_rt.asan/ {print $1; exit}')"
-            _asan_rt_path="$(find /usr/lib* /usr/local/lib* -type f -name "$_asan_rt_name" 2>/dev/null | sed 1q)"
-            echo >&2 "clang's ASan DSO ($_asan_rt_name) is not present in the runtime library path"
-            echo >&2 "Consider setting LD_LIBRARY_PATH=${_asan_rt_path%/*}"
+            echo >&2 "clang's ASan DSO ($ASAN_RT_NAME) is not present in the runtime library path"
+            echo >&2 "Consider setting LD_LIBRARY_PATH=${ASAN_RT_PATH%/*}"
             exit 1
         fi
     else
@@ -223,6 +223,8 @@ if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then
         echo >&2 "gcc does this by default, for clang compile with -shared-libasan"
         exit 1
     fi
+
+    echo "Detected ASan RT '$ASAN_RT_NAME' located at '$ASAN_RT_PATH'"
 fi
 
 function find_qemu_bin() {
@@ -490,6 +492,13 @@ install_verity_minimal() {
         mkdir -p $initdir/usr/lib/systemd/system $initdir/usr/lib/extension-release.d $initdir/etc $initdir/var/tmp $initdir/opt
         setup_basic_dirs
         install_basic_tools
+        if [[ -v ASAN_RT_PATH ]]; then
+            # If we're compiled with ASan, install the ASan RT (and its dependencies)
+            # into the verity images to get rid of the annoying errors about
+            # missing $LD_PRELOAD libraries.
+            inst_libs "$ASAN_RT_PATH"
+            inst_library "$ASAN_RT_PATH"
+        fi
         cp $os_release $initdir/usr/lib/os-release
         ln -s ../usr/lib/os-release $initdir/etc/os-release
         touch $initdir/etc/machine-id $initdir/etc/resolv.conf
@@ -654,26 +663,23 @@ create_asan_wrapper() {
     local _asan_rt_pattern
     ddebug "Create $_asan_wrapper"
 
-    case "$ASAN_COMPILER" in
-        gcc)
-            _asan_rt_pattern="*libasan*"
-            ;;
-        clang)
-            _asan_rt_pattern="libclang_rt.asan-*"
-            # Install llvm-symbolizer to generate useful reports
-            # See: https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
-            dracut_install "llvm-symbolizer"
-            ;;
-        *)
-            dfail "Unsupported compiler: $ASAN_COMPILER"
-            exit 1
-    esac
+    [[ -z "$ASAN_RT_PATH" ]] && dfatal "ASAN_RT_PATH is empty, but it shouldn't be"
+
+    # clang: install llvm-symbolizer to generate useful reports
+    # See: https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
+    [[ "$ASAN_COMPILER" == "clang" ]] && dracut_install "llvm-symbolizer"
 
     cat >$_asan_wrapper <<EOF
 #!/usr/bin/env bash
 
 set -x
 
+echo "ASan RT: $ASAN_RT_PATH"
+if [[ ! -e "$ASAN_RT_PATH" ]]; then
+    echo >&2 "Couldn't find ASan RT at '$ASAN_RT_PATH', can't continue"
+    exit 1
+fi
+
 DEFAULT_ASAN_OPTIONS=${ASAN_OPTIONS:-strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1}
 DEFAULT_UBSAN_OPTIONS=${UBSAN_OPTIONS:-print_stacktrace=1:print_summary=1:halt_on_error=1}
 DEFAULT_ENVIRONMENT="ASAN_OPTIONS=\$DEFAULT_ASAN_OPTIONS UBSAN_OPTIONS=\$DEFAULT_UBSAN_OPTIONS"
@@ -686,15 +692,15 @@ mount -t proc proc /proc
 mount -t sysfs sysfs /sys
 mount -o remount,rw /
 
-PATH_TO_ASAN=\$(find / -name '$_asan_rt_pattern' | sed 1q)
-if [[ "\$PATH_TO_ASAN" ]]; then
-  # A lot of services (most notably dbus) won't start without preloading libasan
-  # See https://github.com/systemd/systemd/issues/5004
-  DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=\$PATH_TO_ASAN"
+# A lot of services (most notably dbus) won't start without preloading libasan
+# See https://github.com/systemd/systemd/issues/5004
+DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=$ASAN_RT_PATH"
+
+if [[ "$ASAN_COMPILER" == "clang" ]]; then
   # Let's add the ASan DSO's path to the dynamic linker's cache. This is pretty
   # unnecessary for gcc & libasan, however, for clang this is crucial, as its
   # runtime ASan DSO is in a non-standard (library) path.
-  echo \${PATH_TO_ASAN%/*} > /etc/ld.so.conf.d/asan-path-override.conf
+  echo "${ASAN_RT_PATH%/*}" > /etc/ld.so.conf.d/asan-path-override.conf
   ldconfig
 fi
 echo DefaultEnvironment=\$DEFAULT_ENVIRONMENT >>/etc/systemd/system.conf
@@ -725,6 +731,21 @@ printf "[Unit]\nConditionVirtualization=container\n\n[Service]\nTimeoutSec=240s\
 mkdir -p /etc/systemd/system/systemd-journal-flush.service.d
 printf "[Service]\nTimeoutSec=180s\n" >/etc/systemd/system/systemd-journal-flush.service.d/timeout.conf
 
+# D-Bus has troubles during system shutdown causing it to fail. Although it's
+# harmless, it causes unnecessary noise in the logs, so let's disable LSan's
+# at_exit check just for the dbus.service
+mkdir -p /etc/systemd/system/dbus.service.d
+printf "[Service]\nEnvironment=ASAN_OPTIONS=leak_check_at_exit=false\n" >/etc/systemd/system/dbus.service.d/disable-lsan.conf
+
+# Some utilities run via IMPORT/RUN/PROGRAM udev directives fail because
+# they're uninstrumented (like dmsetup). Let's add a simple rule which sets
+# LD_PRELOAD to the ASan RT library to fix this.
+mkdir -p /etc/udev/rules.d
+cat > /etc/udev/rules.d/00-set-LD_PRELOAD.rules << INNER_EOF
+SUBSYSTEM=="block", ENV{LD_PRELOAD}="$ASAN_RT_PATH"
+INNER_EOF
+chmod 0644 /etc/udev/rules.d/00-set-LD_PRELOAD.rules
+
 # The 'mount' utility doesn't behave well under libasan, causing unexpected
 # fails during boot and subsequent test results check:
 # bash-5.0# mount -o remount,rw -v /
@@ -1319,6 +1340,7 @@ install_zoneinfo() {
     inst_any /usr/share/zoneinfo/Asia/Vladivostok
     inst_any /usr/share/zoneinfo/Australia/Sydney
     inst_any /usr/share/zoneinfo/Europe/Berlin
+    inst_any /usr/share/zoneinfo/Europe/Dublin
     inst_any /usr/share/zoneinfo/Europe/Kiev
     inst_any /usr/share/zoneinfo/Pacific/Auckland
     inst_any /usr/share/zoneinfo/Pacific/Honolulu
index bf6a5c7a8763a85e4283679bbd757d8c40477ddc..23a39bf09014cd1721a25b83c88d9cda0940dce7 100755 (executable)
@@ -144,7 +144,8 @@ test_linked_units () {
 
     check_ok test15-a Names test15-a.service
     check_ok test15-a Names test15-b.service
-    check_ko test15-a Names test15-b@
+    check_ko test15-a Names test15-a@     # test15-a@.scope is the symlink target.
+                                          # Make sure it is completely ignored.
 
     rm /test15-a@.scope
     clear_services test15-a test15-b
diff --git a/test/units/testsuite-17.01.sh b/test/units/testsuite-17.01.sh
new file mode 100755 (executable)
index 0000000..573ad41
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+rm -f /run/udev/rules.d/50-testsuite.rules
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+    (
+        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
+        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
+        systemctl show -p WantedBy foobar.service | grep -q -v sda
+        systemctl show -p WantedBy waldo.service | grep -q -v sda
+    ) && break
+
+    sleep .5
+done
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="foobar.service"
+EOF
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+    (
+        udevadm info /dev/sda | grep -q SYSTEMD_WANTS=foobar.service
+        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
+        systemctl show -p WantedBy foobar.service | grep -q sda
+        systemctl show -p WantedBy waldo.service | grep -q -v sda
+    ) && break
+
+    sleep .5
+done
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="waldo.service"
+EOF
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+    (
+        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
+        udevadm info /dev/sda | grep -q SYSTEMD_WANTS=waldo.service
+        systemctl show -p WantedBy foobar.service | grep -q -v sda
+        systemctl show -p WantedBy waldo.service | grep -q sda
+    ) && break
+
+    sleep .5
+done
+
+rm /run/udev/rules.d/50-testsuite.rules
+
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+    (
+        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
+        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
+        systemctl show -p WantedBy foobar.service | grep -q -v sda
+        systemctl show -p WantedBy waldo.service | grep -q -v sda
+    ) && break
+
+    sleep .5
+done
+
+exit 0
diff --git a/test/units/testsuite-17.02.sh b/test/units/testsuite-17.02.sh
new file mode 100755 (executable)
index 0000000..c21fcc7
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION=="remove", GOTO="lo_end"
+
+SUBSYSTEM=="net", KERNEL=="lo", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/net/devices/lo"
+
+ACTION!="change", GOTO="lo_end"
+
+SUBSYSTEM=="net", KERNEL=="lo", ENV{ID_RENAMING}="1"
+
+LABEL="lo_end"
+EOF
+
+udevadm control --log-priority=debug --reload --timeout=600
+udevadm trigger --action=add --settle /sys/devices/virtual/net/lo
+udevadm info /sys/devices/virtual/net/lo
+sleep 1
+STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
+[[ $STATE == "active" ]] || exit 1
+
+udevadm trigger --action=change --settle /sys/devices/virtual/net/lo
+udevadm info /sys/devices/virtual/net/lo
+sleep 1
+STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
+[[ $STATE == "inactive" ]] || exit 1
+
+udevadm trigger --action=move --settle /sys/devices/virtual/net/lo
+udevadm info /sys/devices/virtual/net/lo
+sleep 1
+STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
+[[ $STATE == "active" ]] || exit 1
+
+rm -f /run/udev/rules.d/50-testsuite.rules
+udevadm control --reload --timeout=600
+
+# test for issue #16967
+
+ip link add hoge type dummy
+udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/hoge
+sleep 1
+if ! systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
+if ! systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
+
+ip link set hoge name foobar
+udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/foobar
+sleep 1
+if systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
+if systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
+if ! systemctl status sys-devices-virtual-net-foobar.device; then exit 1; fi
+if ! systemctl status sys-subsystem-net-devices-foobar.device; then exit 1; fi
+
+exit 0
diff --git a/test/units/testsuite-17.03.sh b/test/units/testsuite-17.03.sh
new file mode 100755 (executable)
index 0000000..02ac217
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+set -ex
+
+test_rule="/run/udev/rules.d/49-test.rules"
+
+setup() {
+    mkdir -p "${test_rule%/*}"
+    cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
+    echo 'KERNEL=="lo", SUBSYSTEM=="net", PROGRAM=="/bin/sleep 60"' > "${test_rule}"
+    echo "event_timeout=30" >> /etc/udev/udev.conf
+    echo "timeout_signal=SIGABRT" >> /etc/udev/udev.conf
+
+    systemctl restart systemd-udevd.service
+}
+
+teardown() {
+    set +e
+
+    mv -f /etc/udev/udev.conf.bckp /etc/udev/udev.conf
+    rm -f "$test_rule"
+    systemctl restart systemd-udevd.service
+}
+
+run_test() {
+    since="$(date +%T)"
+
+    echo add > /sys/class/net/lo/uevent
+
+    for n in {1..20}; do
+        sleep 5
+        if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then
+            return 0
+        fi
+    done
+
+    return 1
+}
+
+trap teardown EXIT
+
+setup
+run_test
+
+exit 0
diff --git a/test/units/testsuite-17.04.sh b/test/units/testsuite-17.04.sh
new file mode 100755 (executable)
index 0000000..c799936
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+! test -f /run/udev/tags/added/c1:3 &&
+    ! test -f /run/udev/tags/changed/c1:3 &&
+    udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' &&
+    udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
+    udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
+    udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*'
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", TAG+="added"
+ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
+EOF
+
+udevadm control --reload
+udevadm trigger -c add /dev/null
+
+while : ; do
+    test -f /run/udev/tags/added/c1:3 &&
+        ! test -f /run/udev/tags/changed/c1:3 &&
+        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
+        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
+        udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
+        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+        break
+
+    sleep .5
+done
+
+udevadm control --reload
+udevadm trigger -c change /dev/null
+
+while : ; do
+    test -f /run/udev/tags/added/c1:3 &&
+        test -f /run/udev/tags/changed/c1:3 &&
+        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
+        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
+        udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
+        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' &&
+        break
+
+    sleep .5
+done
+
+udevadm control --reload
+udevadm trigger -c add /dev/null
+
+while : ; do
+    test -f /run/udev/tags/added/c1:3 &&
+        test -f /run/udev/tags/changed/c1:3 &&
+        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
+        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
+        udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
+        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+        break
+
+    sleep .5
+done
+
+exit 0
diff --git a/test/units/testsuite-17.05.sh b/test/units/testsuite-17.05.sh
new file mode 100755 (executable)
index 0000000..0991ec9
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+SUBSYSTEM=="mem", KERNEL=="null", OPTIONS="log_level=debug"
+ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", IMPORT{program}="/bin/echo -e HOGE=aa\\\\x20\\\\x20\\\\x20bb\nFOO=\\\\x20aaa\\\\x20\n\n\n"
+EOF
+
+udevadm control --reload
+udevadm trigger -c add /dev/null
+
+while : ; do
+    test -f /run/udev/data/c1:3 &&
+        udevadm info /dev/null | grep -q 'E: HOGE=aa\\x20\\x20\\x20bb' &&
+        udevadm info /dev/null | grep -q 'E: FOO=\\x20aaa\\x20' &&
+        break
+
+    sleep .5
+done
+
+exit 0
index ed2017a848620a349b3b2dd5ca045af6a2abddbd..bd6221551c34b5cb7e262abcf342407bceca2e2d 100644 (file)
@@ -1,5 +1,5 @@
 [Unit]
-Description=TEST-17-UDEV-WANTS
+Description=TEST-17-UDEV
 
 [Service]
 ExecStartPre=rm -f /failed /testok
index 7f8740ba3506390a769064677c5fd0c4623a6f24..afce85aceb9bcf11cc3f671538ef4fdf93daf3f1 100755 (executable)
@@ -1,74 +1,13 @@
 #!/usr/bin/env bash
-set -ex
-set -o pipefail
 
-mkdir -p /run/udev/rules.d/
+set -x
+set -e
 
-rm -f /run/udev/rules.d/50-testsuite.rules
-udevadm control --reload
-udevadm trigger /dev/sda
+>/failed
 
-while : ; do
-    (
-        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
-        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
-        systemctl show -p WantedBy foobar.service | grep -q -v sda
-        systemctl show -p WantedBy waldo.service | grep -q -v sda
-    ) && break
-
-    sleep .5
-done
-
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="foobar.service"
-EOF
-udevadm control --reload
-udevadm trigger /dev/sda
-
-while : ; do
-    (
-        udevadm info /dev/sda | grep -q SYSTEMD_WANTS=foobar.service
-        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
-        systemctl show -p WantedBy foobar.service | grep -q sda
-        systemctl show -p WantedBy waldo.service | grep -q -v sda
-    ) && break
-
-    sleep .5
+for t in ${0%.sh}.*.sh; do
+    echo "Running $t"; ./$t
 done
 
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="waldo.service"
-EOF
-udevadm control --reload
-udevadm trigger /dev/sda
-
-while : ; do
-    (
-        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
-        udevadm info /dev/sda | grep -q SYSTEMD_WANTS=waldo.service
-        systemctl show -p WantedBy foobar.service | grep -q -v sda
-        systemctl show -p WantedBy waldo.service | grep -q sda
-    ) && break
-
-    sleep .5
-done
-
-rm /run/udev/rules.d/50-testsuite.rules
-
-udevadm control --reload
-udevadm trigger /dev/sda
-
-while : ; do
-    (
-        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
-        udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
-        systemctl show -p WantedBy foobar.service | grep -q -v sda
-        systemctl show -p WantedBy waldo.service | grep -q -v sda
-    ) && break
-
-    sleep .5
-done
-
-echo OK >/testok
-
-exit 0
+touch /testok
+rm /failed
index 90c2187bd79d63c45e23eaf60c68761f59823d42..900b99f77b96db76f55775a1a8cadbbfe83f790a 100644 (file)
@@ -1,5 +1,5 @@
 [Unit]
-Description=TEST-29-UDEV-ID_RENAMING
+Description=TEST-29-PORTABLE
 
 [Service]
 ExecStartPre=rm -f /failed /testok
index 5c625568953bb88b18280d854afa79349772197d..b5b05b42d9bf40c13a64bb6abf438e19c2fa996b 100755 (executable)
@@ -1,58 +1,67 @@
 #!/usr/bin/env bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
 set -ex
 set -o pipefail
 
-mkdir -p /run/udev/rules.d/
+export SYSTEMD_LOG_LEVEL=debug
 
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION=="remove", GOTO="lo_end"
+portablectl attach --now --runtime /usr/share/minimal_0.raw app0
 
-SUBSYSTEM=="net", KERNEL=="lo", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/net/devices/lo"
+systemctl is-active app0.service
+systemctl is-active app0-foo.service
+set +o pipefail
+set +e
+systemctl is-active app0-bar.service && exit 1
+set -e
+set -o pipefail
+
+portablectl reattach --now --runtime /usr/share/minimal_1.raw app0
+
+systemctl is-active app0.service
+systemctl is-active app0-bar.service
+set +o pipefail
+set +e
+systemctl is-active app0-foo.service && exit 1
+set -e
+set -o pipefail
 
-ACTION!="change", GOTO="lo_end"
+portablectl list | grep -q -F "minimal_1"
 
-SUBSYSTEM=="net", KERNEL=="lo", ENV{ID_RENAMING}="1"
+portablectl detach --now --runtime /usr/share/minimal_1.raw app0
 
-LABEL="lo_end"
-EOF
+portablectl list | grep -q -F "No images."
 
-udevadm control --log-priority=debug --reload --timeout=600
-udevadm trigger --action=add --settle /sys/devices/virtual/net/lo
-udevadm info /sys/devices/virtual/net/lo
-sleep 1
-STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
-[[ $STATE == "active" ]] || exit 1
+# portablectl also works with directory paths rather than images
 
-udevadm trigger --action=change --settle /sys/devices/virtual/net/lo
-udevadm info /sys/devices/virtual/net/lo
-sleep 1
-STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
-[[ $STATE == "inactive" ]] || exit 1
+unsquashfs -dest /tmp/minimal_0 /usr/share/minimal_0.raw
+unsquashfs -dest /tmp/minimal_1 /usr/share/minimal_1.raw
 
-udevadm trigger --action=move --settle /sys/devices/virtual/net/lo
-udevadm info /sys/devices/virtual/net/lo
-sleep 1
-STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
-[[ $STATE == "active" ]] || exit 1
+portablectl attach --copy=symlink --now --runtime /tmp/minimal_0 app0
 
-rm -f /run/udev/rules.d/50-testsuite.rules
-udevadm control --reload --timeout=600
+systemctl is-active app0.service
+systemctl is-active app0-foo.service
+set +o pipefail
+set +e
+systemctl is-active app0-bar.service && exit 1
+set -e
+set -o pipefail
+
+portablectl reattach --now --enable --runtime /tmp/minimal_1 app0
+
+systemctl is-active app0.service
+systemctl is-active app0-bar.service
+set +o pipefail
+set +e
+systemctl is-active app0-foo.service && exit 1
+set -e
+set -o pipefail
 
-# test for issue #16967
+portablectl list | grep -q -F "minimal_1"
 
-ip link add hoge type dummy
-udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/hoge
-sleep 1
-if ! systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
-if ! systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
+portablectl detach --now --enable --runtime /tmp/minimal_1 app0
 
-ip link set hoge name foobar
-udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/foobar
-sleep 1
-if systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
-if systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
-if ! systemctl status sys-devices-virtual-net-foobar.device; then exit 1; fi
-if ! systemctl status sys-subsystem-net-devices-foobar.device; then exit 1; fi
+portablectl list | grep -q -F "No images."
 
 echo OK > /testok
 
similarity index 89%
rename from test/units/testsuite-57-namespaced.service
rename to test/units/testsuite-49-namespaced.service
index 0abcc4faf44e6018a493af97be7ef4cf929ce5b2..722dbe246d688283f93179a96b08455ca5411452 100644 (file)
@@ -6,7 +6,7 @@ Type=notify
 RemainAfterExit=yes
 MountAPIVFS=yes
 PrivateTmp=yes
-BindPaths=/run/testservice-57-fixed:/tmp/testfile_fixed
+BindPaths=/run/testservice-49-fixed:/tmp/testfile_fixed
 InaccessiblePaths=/run/inaccessible
 ExecStartPre=grep -q -F MARKER_FIXED /tmp/testfile_fixed
 ExecStart=/bin/sh -c 'systemd-notify --ready; while ! grep -q -F MARKER_RUNTIME /tmp/testfile_runtime; do sleep 0.1; done; test ! -f /run/inaccessible/testfile_fixed'
index f47177106fe5c42dfa2ec12f1a59fb654b412b65..9475109ca2cc5b6c8bc92fb10a1057913a66f888 100644 (file)
@@ -1,6 +1,7 @@
 [Unit]
-Description=TEST-49-UDEV-EVENT-TIMEOUT
+Description=TEST-49-RUNTIME-BIND-PATHS
 
 [Service]
+ExecStartPre=rm -f /failed /testok
 ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
 Type=oneshot
index ffa98016446c1f96ffe3d509f0bd5a281b829f8a..07bb20d99c67f5f39e77f62099bc9216e6ad85df 100755 (executable)
@@ -1,46 +1,42 @@
 #!/usr/bin/env bash
-
 set -ex
 
-test_rule="/run/udev/rules.d/49-test.rules"
+echo "MARKER_FIXED" > /run/testservice-49-fixed
+mkdir -p /run/inaccessible
 
-setup() {
-    mkdir -p "${test_rule%/*}"
-    cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
-    echo 'KERNEL=="lo", SUBSYSTEM=="net", PROGRAM=="/bin/sleep 60"' > "${test_rule}"
-    echo "event_timeout=30" >> /etc/udev/udev.conf
-    echo "timeout_signal=SIGABRT" >> /etc/udev/udev.conf
+systemctl start testsuite-49-namespaced.service
 
-    systemctl restart systemd-udevd.service
-}
+# Ensure that inaccessible paths aren't bypassed by the runtime setup
+set +e
+systemctl bind --mkdir testsuite-49-namespaced.service /run/testservice-49-fixed /run/inaccessible/testfile_fixed && exit 1
+set -e
 
-teardown() {
-    set +e
+echo "MARKER_RUNTIME" > /run/testservice-49-runtime
 
-    mv -f /etc/udev/udev.conf.bckp /etc/udev/udev.conf
-    rm -f "$test_rule"
-    systemctl restart systemd-udevd.service
-}
+systemctl bind --mkdir testsuite-49-namespaced.service /run/testservice-49-runtime /tmp/testfile_runtime
 
-run_test() {
-    since="$(date +%T)"
+while systemctl show -P SubState testsuite-49-namespaced.service | grep -q running
+do
+    sleep 0.1
+done
 
-    echo add > /sys/class/net/lo/uevent
+systemctl is-active testsuite-49-namespaced.service
 
-    for n in {1..20}; do
-        sleep 5
-        if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then
-            return 0
-        fi
-    done
+# Now test that systemctl bind fails when attempted on a non-namespaced unit
+systemctl start testsuite-49-non-namespaced.service
 
-    return 1
-}
+set +e
+systemctl bind --mkdir testsuite-49-non-namespaced.service /run/testservice-49-runtime /tmp/testfile_runtime && exit 1
+set -e
 
-trap teardown EXIT
+while systemctl show -P SubState testsuite-49-non-namespaced.service | grep -q running
+do
+    sleep 0.1
+done
 
-setup
-run_test
+set +e
+systemctl is-active testsuite-49-non-namespaced.service && exit 1
+set -e
 
 echo OK > /testok
 
index f3781e6d15de166bee7ac38d6f0cd079ef4ff22e..b4a5fee842eb0a83efeefd619205660ac4bf6ae9 100755 (executable)
@@ -240,6 +240,8 @@ MountAPIVFS=yes
 TemporaryFileSystem=/run
 RootImage=${image}.raw
 ExtensionImages=/usr/share/app0.raw /usr/share/app1.raw:nosuid
+# Relevant only for sanitizer runs
+UnsetEnvironment=LD_PRELOAD
 ExecStart=/bin/bash -c '/opt/script0.sh | grep ID'
 ExecStart=/bin/bash -c '/opt/script1.sh | grep ID'
 Type=oneshot
similarity index 68%
rename from test/units/testsuite-56-testbloat.service
rename to test/units/testsuite-55-testbloat.service
index 6163aae1dbadfaeb6c67f9816be331eccb602736..7aa794b9f9a241bce19c2c5b5b299e13becba8a8 100644 (file)
@@ -5,5 +5,5 @@ Description=Create a lot of memory pressure
 # A VERY small memory.high will cause the script (trying to use a lot of memory)
 # to throttle and be put under heavy pressure.
 MemoryHigh=1M
-Slice=testsuite-56-workload.slice
-ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh
+Slice=testsuite-55-workload.slice
+ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh
similarity index 68%
rename from test/units/testsuite-56-testchill.service
rename to test/units/testsuite-55-testchill.service
index 6cae3d852a3eed0d8cf1258c9c3e00815f801c6b..aca6bc4ab97690d4376ee6ef0c5b8e2b03d39213 100644 (file)
@@ -2,5 +2,5 @@
 Description=No memory pressure
 
 [Service]
-Slice=testsuite-56-workload.slice
+Slice=testsuite-55-workload.slice
 ExecStart=sleep infinity
diff --git a/test/units/testsuite-55-testmunch.service b/test/units/testsuite-55-testmunch.service
new file mode 100644 (file)
index 0000000..457e4a5
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Create some memory pressure
+
+[Service]
+MemoryHigh=2M
+Slice=testsuite-55-workload.slice
+ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh
index 2127a4db7f7db023cfec46cc69508d7b40336d45..592e9d5becadf3b4b6100c1c8a03e1daf0469417 100644 (file)
@@ -1,7 +1,7 @@
 [Unit]
-Description=TESTSUITE-55-UDEV-TAGS
+Description=TESTSUITE-55-OOMD
 
 [Service]
-ExecStartPre=rm -f /failed /testok
+ExecStartPre=rm -f /failed /skipped /testok
 ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
 Type=oneshot
index ffceefb6a57ae2fe1beb5d0923aef7fc88fad0ca..f7896ada4274c3d53a5138b345acd121db6d66dd 100755 (executable)
@@ -1,66 +1,76 @@
-#!/bin/bash
+#!/usr/bin/env bash
 set -ex
 set -o pipefail
 
-mkdir -p /run/udev/rules.d/
-
-! test -f /run/udev/tags/added/c1:3 &&
-    ! test -f /run/udev/tags/changed/c1:3 &&
-    udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' &&
-    udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
-    udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
-    udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*'
-
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", TAG+="added"
-ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
-EOF
-
-udevadm control --reload
-udevadm trigger -c add /dev/null
-
-while : ; do
-    test -f /run/udev/tags/added/c1:3 &&
-        ! test -f /run/udev/tags/changed/c1:3 &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
-        break
+systemd-analyze log-level debug
+systemd-analyze log-target console
 
-    sleep .5
-done
+# Loose checks to ensure the environment has the necessary features for systemd-oomd
+[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped
+cgroup_type=$(stat -fc %T /sys/fs/cgroup/)
+if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then
+    echo "no cgroup2" >> /skipped
+fi
+if [ ! -f /usr/lib/systemd/systemd-oomd ] && [ ! -f /lib/systemd/systemd-oomd ]; then
+    echo "no oomd" >> /skipped
+fi
+[[ -e /skipped ]] && exit 0 || true
 
-udevadm control --reload
-udevadm trigger -c change /dev/null
+rm -rf /etc/systemd/system/testsuite-55-testbloat.service.d
 
-while : ; do
-    test -f /run/udev/tags/added/c1:3 &&
-        test -f /run/udev/tags/changed/c1:3 &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
-        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' &&
-        break
+echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf
 
-    sleep .5
-done
+systemctl start testsuite-55-testchill.service
+systemctl start testsuite-55-testbloat.service
 
-udevadm control --reload
-udevadm trigger -c add /dev/null
+# Verify systemd-oomd is monitoring the expected units
+oomctl | grep "/testsuite-55-workload.slice"
+oomctl | grep "1.00%"
+oomctl | grep "Default Memory Pressure Duration: 5s"
 
-while : ; do
-    test -f /run/udev/tags/added/c1:3 &&
-        test -f /run/udev/tags/changed/c1:3 &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+# systemd-oomd watches for elevated pressure for 5 seconds before acting.
+# It can take time to build up pressure so either wait 2 minutes or for the service to fail.
+timeout=$(date -ud "2 minutes" +%s)
+while [[ $(date -u +%s) -le $timeout ]]; do
+    if ! systemctl status testsuite-55-testbloat.service; then
         break
-
-    sleep .5
+    fi
+    sleep 5
 done
 
+# testbloat should be killed and testchill should be fine
+if systemctl status testsuite-55-testbloat.service; then exit 42; fi
+if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
+
+# only run this portion of the test if we can set xattrs
+if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then
+    sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down
+
+    mkdir -p /etc/systemd/system/testsuite-55-testbloat.service.d/
+    echo "[Service]" > /etc/systemd/system/testsuite-55-testbloat.service.d/override.conf
+    echo "ManagedOOMPreference=avoid" >> /etc/systemd/system/testsuite-55-testbloat.service.d/override.conf
+
+    systemctl daemon-reload
+    systemctl start testsuite-55-testchill.service
+    systemctl start testsuite-55-testmunch.service
+    systemctl start testsuite-55-testbloat.service
+
+    timeout=$(date -ud "2 minutes" +%s)
+    while [[ $(date -u +%s) -le $timeout ]]; do
+        if ! systemctl status testsuite-55-testmunch.service; then
+            break
+        fi
+        sleep 5
+    done
+
+    # testmunch should be killed since testbloat had the avoid xattr on it
+    if ! systemctl status testsuite-55-testbloat.service; then exit 25; fi
+    if systemctl status testsuite-55-testmunch.service; then exit 43; fi
+    if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
+fi
+
+systemd-analyze log-level info
+
 echo OK > /testok
 
 exit 0
diff --git a/test/units/testsuite-56-testmunch.service b/test/units/testsuite-56-testmunch.service
deleted file mode 100644 (file)
index b4b925a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-[Unit]
-Description=Create some memory pressure
-
-[Service]
-MemoryHigh=2M
-Slice=testsuite-56-workload.slice
-ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh
index b53b0905dbc998a4c17894c838981780bd16f4f4..d8ad589ca05e1da7fa53d24f4e205fee5ca78b5a 100644 (file)
@@ -1,7 +1,6 @@
 [Unit]
-Description=TESTSUITE-56-OOMD
+Description=TEST-56-EXIT-TYPE
 
 [Service]
-ExecStartPre=rm -f /failed /skipped /testok
 ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
 Type=oneshot
index 6835802eb8f5c13bf0832299f15f3b0d20c52213..9de03e1dea4f73e873d77c58e08af663b47eb479 100755 (executable)
@@ -1,73 +1,91 @@
 #!/usr/bin/env bash
 set -ex
-set -o pipefail
 
 systemd-analyze log-level debug
-systemd-analyze log-target console
-
-# Loose checks to ensure the environment has the necessary features for systemd-oomd
-[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped
-cgroup_type=$(stat -fc %T /sys/fs/cgroup/)
-if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then
-    echo "no cgroup2" >> /skipped
-fi
-if [ ! -f /usr/lib/systemd/systemd-oomd ] && [ ! -f /lib/systemd/systemd-oomd ]; then
-    echo "no oomd" >> /skipped
-fi
-[[ -e /skipped ]] && exit 0 || true
-
-rm -rf /etc/systemd/system/testsuite-56-testbloat.service.d
-
-echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf
-
-systemctl start testsuite-56-testchill.service
-systemctl start testsuite-56-testbloat.service
-
-# Verify systemd-oomd is monitoring the expected units
-oomctl | grep "/testsuite-56-workload.slice"
-oomctl | grep "1.00%"
-oomctl | grep "Default Memory Pressure Duration: 5s"
-
-# systemd-oomd watches for elevated pressure for 5 seconds before acting.
-# It can take time to build up pressure so either wait 2 minutes or for the service to fail.
-timeout=$(date -ud "2 minutes" +%s)
-while [[ $(date -u +%s) -le $timeout ]]; do
-    if ! systemctl status testsuite-56-testbloat.service; then
-        break
-    fi
-    sleep 5
-done
-
-# testbloat should be killed and testchill should be fine
-if systemctl status testsuite-56-testbloat.service; then exit 42; fi
-if ! systemctl status testsuite-56-testchill.service; then exit 24; fi
-
-# only run this portion of the test if we can set xattrs
-if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then
-    sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down
-
-    mkdir -p /etc/systemd/system/testsuite-56-testbloat.service.d/
-    echo "[Service]" > /etc/systemd/system/testsuite-56-testbloat.service.d/override.conf
-    echo "ManagedOOMPreference=avoid" >> /etc/systemd/system/testsuite-56-testbloat.service.d/override.conf
-
-    systemctl daemon-reload
-    systemctl start testsuite-56-testchill.service
-    systemctl start testsuite-56-testmunch.service
-    systemctl start testsuite-56-testbloat.service
-
-    timeout=$(date -ud "2 minutes" +%s)
-    while [[ $(date -u +%s) -le $timeout ]]; do
-        if ! systemctl status testsuite-56-testmunch.service; then
-            break
-        fi
-        sleep 5
-    done
-
-    # testmunch should be killed since testbloat had the avoid xattr on it
-    if ! systemctl status testsuite-56-testbloat.service; then exit 25; fi
-    if systemctl status testsuite-56-testmunch.service; then exit 43; fi
-    if ! systemctl status testsuite-56-testchill.service; then exit 24; fi
-fi
+
+# Multiple level process tree, parent process stays up
+cat >/tmp/test56-exit-cgroup.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> sleep
+sleep infinity &
+disown
+
+# process tree: systemd -> bash -> bash -> sleep
+((sleep infinity); true) &
+
+# process tree: systemd -> bash -> sleep
+sleep infinity
+EOF
+chmod +x /tmp/test56-exit-cgroup.sh
+
+# service should be stopped cleanly
+(sleep 1; systemctl stop one) &
+systemd-run --wait --unit=one -p ExitType=cgroup /tmp/test56-exit-cgroup.sh
+
+# same thing with a truthy exec condition
+(sleep 1; systemctl stop two) &
+systemd-run --wait --unit=two -p ExitType=cgroup -p ExecCondition=true /tmp/test56-exit-cgroup.sh
+
+# false exec condition: systemd-run should exit immediately with status code: 1
+! systemd-run --wait --unit=three -p ExitType=cgroup -p ExecCondition=false /tmp/test56-exit-cgroup.sh
+
+# service should exit uncleanly
+(sleep 1; systemctl kill --signal 9 four) &
+! systemd-run --wait --unit=four -p ExitType=cgroup /tmp/test56-exit-cgroup.sh
+
+
+# Multiple level process tree, parent process exits quickly
+cat >/tmp/test56-exit-cgroup-parentless.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> sleep
+sleep infinity &
+
+# process tree: systemd -> bash -> sleep
+((sleep infinity); true) &
+EOF
+chmod +x /tmp/test56-exit-cgroup-parentless.sh
+
+# service should be stopped cleanly
+(sleep 1; systemctl stop five) &
+systemd-run --wait --unit=five -p ExitType=cgroup /tmp/test56-exit-cgroup-parentless.sh
+
+# service should exit uncleanly
+(sleep 1; systemctl kill --signal 9 six) &
+! systemd-run --wait --unit=six -p ExitType=cgroup /tmp/test56-exit-cgroup-parentless.sh
+
+
+# Multiple level process tree, parent process exits uncleanly but last process exits cleanly
+cat >/tmp/test56-exit-cgroup-clean.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> bash -> sleep
+(sleep 1; true) &
+
+exit 255
+EOF
+chmod +x /tmp/test56-exit-cgroup-clean.sh
+
+# service should exit cleanly and be garbage-collected
+systemd-run --wait --unit=seven -p ExitType=cgroup /tmp/test56-exit-cgroup-clean.sh
+
+
+# Multiple level process tree, parent process exits cleanly but last process exits uncleanly
+cat >/tmp/test56-exit-cgroup-unclean.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> bash -> sleep
+(sleep 1; exit 255) &
+EOF
+chmod +x /tmp/test56-exit-cgroup-unclean.sh
+
+# service should exit uncleanly after 1 second
+! systemd-run --wait --unit=eight -p ExitType=cgroup /tmp/test56-exit-cgroup-unclean.sh
 
 systemd-analyze log-level info
 
diff --git a/test/units/testsuite-57.service b/test/units/testsuite-57.service
deleted file mode 100644 (file)
index b6edd86..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-[Unit]
-Description=TEST-57-RUNTIME-BIND-PATHS
-
-[Service]
-ExecStartPre=rm -f /failed /testok
-ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
-Type=oneshot
diff --git a/test/units/testsuite-57.sh b/test/units/testsuite-57.sh
deleted file mode 100755 (executable)
index c24cf32..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env bash
-set -ex
-
-echo "MARKER_FIXED" > /run/testservice-57-fixed
-mkdir -p /run/inaccessible
-
-systemctl start testsuite-57-namespaced.service
-
-# Ensure that inaccessible paths aren't bypassed by the runtime setup
-set +e
-systemctl bind --mkdir testsuite-57-namespaced.service /run/testservice-57-fixed /run/inaccessible/testfile_fixed && exit 1
-set -e
-
-echo "MARKER_RUNTIME" > /run/testservice-57-runtime
-
-systemctl bind --mkdir testsuite-57-namespaced.service /run/testservice-57-runtime /tmp/testfile_runtime
-
-while systemctl show -P SubState testsuite-57-namespaced.service | grep -q running
-do
-    sleep 0.1
-done
-
-systemctl is-active testsuite-57-namespaced.service
-
-# Now test that systemctl bind fails when attempted on a non-namespaced unit
-systemctl start testsuite-57-non-namespaced.service
-
-set +e
-systemctl bind --mkdir testsuite-57-non-namespaced.service /run/testservice-57-runtime /tmp/testfile_runtime && exit 1
-set -e
-
-while systemctl show -P SubState testsuite-57-non-namespaced.service | grep -q running
-do
-    sleep 0.1
-done
-
-set +e
-systemctl is-active testsuite-57-non-namespaced.service && exit 1
-set -e
-
-echo OK > /testok
-
-exit 0
diff --git a/test/units/testsuite-58.service b/test/units/testsuite-58.service
deleted file mode 100644 (file)
index 47deba7..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-[Unit]
-Description=TEST-58-PORTABLE
-
-[Service]
-ExecStartPre=rm -f /failed /testok
-ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
-Type=oneshot
diff --git a/test/units/testsuite-58.sh b/test/units/testsuite-58.sh
deleted file mode 100755 (executable)
index b5b05b4..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env bash
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
-set -ex
-set -o pipefail
-
-export SYSTEMD_LOG_LEVEL=debug
-
-portablectl attach --now --runtime /usr/share/minimal_0.raw app0
-
-systemctl is-active app0.service
-systemctl is-active app0-foo.service
-set +o pipefail
-set +e
-systemctl is-active app0-bar.service && exit 1
-set -e
-set -o pipefail
-
-portablectl reattach --now --runtime /usr/share/minimal_1.raw app0
-
-systemctl is-active app0.service
-systemctl is-active app0-bar.service
-set +o pipefail
-set +e
-systemctl is-active app0-foo.service && exit 1
-set -e
-set -o pipefail
-
-portablectl list | grep -q -F "minimal_1"
-
-portablectl detach --now --runtime /usr/share/minimal_1.raw app0
-
-portablectl list | grep -q -F "No images."
-
-# portablectl also works with directory paths rather than images
-
-unsquashfs -dest /tmp/minimal_0 /usr/share/minimal_0.raw
-unsquashfs -dest /tmp/minimal_1 /usr/share/minimal_1.raw
-
-portablectl attach --copy=symlink --now --runtime /tmp/minimal_0 app0
-
-systemctl is-active app0.service
-systemctl is-active app0-foo.service
-set +o pipefail
-set +e
-systemctl is-active app0-bar.service && exit 1
-set -e
-set -o pipefail
-
-portablectl reattach --now --enable --runtime /tmp/minimal_1 app0
-
-systemctl is-active app0.service
-systemctl is-active app0-bar.service
-set +o pipefail
-set +e
-systemctl is-active app0-foo.service && exit 1
-set -e
-set -o pipefail
-
-portablectl list | grep -q -F "minimal_1"
-
-portablectl detach --now --enable --runtime /tmp/minimal_1 app0
-
-portablectl list | grep -q -F "No images."
-
-echo OK > /testok
-
-exit 0
diff --git a/tmpfiles.d/README b/tmpfiles.d/README
new file mode 100644 (file)
index 0000000..b42cec2
--- /dev/null
@@ -0,0 +1,8 @@
+Files in this directory contain configuration for systemd-tmpfiles, a program
+to create, delete, and clean up volatile and temporary files and directories.
+
+See man:tmpfiles.d(5) for explanation of the configuration file format, and
+man:systemd-tmpfiles(8) for a description of when and how this configuration is
+applied.
+
+Use 'systemd-analyze cat-config tmpfiles.d' to display the effective config.
index 7322460dbaeea529885fd73edd186049e11b8df3..d5d4bbc9ea4e59471c58861a2f397603d7e3f44e 100644 (file)
@@ -2,19 +2,20 @@
 
 enable_tmpfiles = conf.get('ENABLE_TMPFILES') == 1
 
-tmpfiles = [['home.conf',            ''],
-            ['journal-nocow.conf',   ''],
-            ['systemd-nologin.conf', 'HAVE_PAM'],
-            ['systemd-nspawn.conf',  'ENABLE_MACHINED'],
-            ['systemd-tmp.conf',     ''],
-            ['portables.conf',       'ENABLE_PORTABLED'],
-            ['systemd-pstore.conf',  'ENABLE_PSTORE'],
-            ['tmp.conf',             ''],
-            ['x11.conf',             ''],
-            ['legacy.conf',          'HAVE_SYSV_COMPAT'],
-           ]
-
-foreach pair : tmpfiles
+files = [['README',               ''],
+         ['home.conf',            ''],
+         ['journal-nocow.conf',   ''],
+         ['systemd-nologin.conf', 'HAVE_PAM'],
+         ['systemd-nspawn.conf',  'ENABLE_MACHINED'],
+         ['systemd-tmp.conf',     ''],
+         ['portables.conf',       'ENABLE_PORTABLED'],
+         ['systemd-pstore.conf',  'ENABLE_PSTORE'],
+         ['tmp.conf',             ''],
+         ['x11.conf',             ''],
+         ['legacy.conf',          'HAVE_SYSV_COMPAT'],
+        ]
+
+foreach pair : files
         if not enable_tmpfiles
                 # do nothing
         elif pair[1] == '' or conf.get(pair[1]) == 1
index 8bb25a1ccfc839dadf70333fbf91f7bb031b2d79..6e167f60f095b52cd49988e3032def8f19e0bba0 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
 # Copyright 2017 The Chromium OS Authors. All rights reserved.
@@ -12,8 +12,6 @@ resulting rules file is installed on the device, the script itself
 is not.
 """
 
-from __future__ import print_function
-
 # List of USB devices (vendorid:productid) for which it is safe to enable
 # autosuspend.
 USB_IDS = []
index fdae898551b3ca2298a1f9950db9f38b8a4090b6..4b680d28025837cee36ccdc6bc786017eba0a75d 100755 (executable)
@@ -2,6 +2,7 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 set -eu
 
-git shortlog -s `git describe --abbrev=0 --match 'v[0-9][0-9][0-9]'`.. | \
-    awk '{ $1=""; print $0 "," }' | \
+tag="$(git describe --abbrev=0 --match 'v[0-9][0-9][0-9]')"
+git log --pretty=tformat:%aN --author=noreply@weblate.org --invert-grep -s "${tag}.." | \
+    sed 's/ / /g; s/--/-/g; s/.*/        \0,/' |
     sort -u
index 652b956a34095647a5c1b7a206bb9b40c7fe98a9..e60a1735911186b840b9f46e87cb8590c76e950f 100644 (file)
@@ -33,7 +33,7 @@ ProtectKernelLogs=yes
 ProtectKernelModules=yes
 ProtectKernelTunables=yes
 ProtectSystem=strict
-ReadWritePaths=/etc
+ReadWritePaths=/etc@SERVICE_LOCALEGEN_WRITABLE@
 RestrictAddressFamilies=AF_UNIX
 RestrictNamespaces=yes
 RestrictRealtime=yes