summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--CODING_STYLE21
-rw-r--r--Makefile.am186
-rw-r--r--NEWS244
-rw-r--r--README15
-rw-r--r--TODO37
-rw-r--r--configure.ac34
-rw-r--r--hwdb/20-OUI.hwdb836
-rw-r--r--hwdb/20-pci-vendor-model.hwdb1411
-rw-r--r--hwdb/20-usb-vendor-model.hwdb670
-rw-r--r--hwdb/70-mouse.hwdb8
-rw-r--r--m4/ax_normalize_path.m4115
-rw-r--r--man/binfmt.d.xml5
-rw-r--r--man/bootchart.conf.xml17
-rw-r--r--man/bootctl.xml5
-rw-r--r--man/bootup.xml5
-rw-r--r--man/busctl.xml5
-rw-r--r--man/coredump.conf.xml11
-rw-r--r--man/coredumpctl.xml5
-rw-r--r--man/crypttab.xml5
-rw-r--r--man/daemon.xml5
-rw-r--r--man/file-hierarchy.xml5
-rw-r--r--man/halt.xml5
-rw-r--r--man/hostname.xml16
-rw-r--r--man/hostnamectl.xml5
-rw-r--r--man/hwdb.xml13
-rw-r--r--man/journal-remote.conf.xml13
-rw-r--r--man/journalctl.xml5
-rw-r--r--man/journald.conf.xml11
-rw-r--r--man/kernel-command-line.xml5
-rw-r--r--man/kernel-install.xml5
-rw-r--r--man/less-variables.xml5
-rw-r--r--man/libsystemd-pkgconfig.xml5
-rw-r--r--man/locale.conf.xml5
-rw-r--r--man/localectl.xml5
-rw-r--r--man/localtime.xml5
-rw-r--r--man/loginctl.xml5
-rw-r--r--man/logind.conf.xml11
-rw-r--r--man/machine-id.xml5
-rw-r--r--man/machine-info.xml5
-rw-r--r--man/machinectl.xml9
-rw-r--r--man/modules-load.d.xml5
-rw-r--r--man/networkctl.xml5
-rw-r--r--man/nss-myhostname.xml5
-rw-r--r--man/nss-mymachines.xml5
-rw-r--r--man/os-release.xml5
-rw-r--r--man/pam_systemd.xml5
-rw-r--r--man/resolved.conf.xml11
-rw-r--r--man/runlevel.xml5
-rw-r--r--man/sd-daemon.xml5
-rw-r--r--man/sd-id128.xml5
-rw-r--r--man/sd-journal.xml5
-rw-r--r--man/sd-login.xml5
-rw-r--r--man/sd_booted.xml5
-rw-r--r--man/sd_bus_creds_get_pid.xml5
-rw-r--r--man/sd_bus_creds_new_from_pid.xml5
-rw-r--r--man/sd_bus_default.xml5
-rw-r--r--man/sd_bus_error.xml5
-rw-r--r--man/sd_bus_message_append.xml5
-rw-r--r--man/sd_bus_message_append_array.xml5
-rw-r--r--man/sd_bus_message_append_basic.xml5
-rw-r--r--man/sd_bus_message_append_string_memfd.xml5
-rw-r--r--man/sd_bus_message_append_strv.xml5
-rw-r--r--man/sd_bus_message_get_cookie.xml5
-rw-r--r--man/sd_bus_message_get_monotonic_usec.xml5
-rw-r--r--man/sd_bus_negotiate_fds.xml5
-rw-r--r--man/sd_bus_new.xml5
-rw-r--r--man/sd_bus_path_encode.xml5
-rw-r--r--man/sd_bus_request_name.xml5
-rw-r--r--man/sd_event_add_child.xml5
-rw-r--r--man/sd_event_add_defer.xml5
-rw-r--r--man/sd_event_add_signal.xml5
-rw-r--r--man/sd_event_add_time.xml5
-rw-r--r--man/sd_event_get_fd.xml5
-rw-r--r--man/sd_event_new.xml5
-rw-r--r--man/sd_event_run.xml5
-rw-r--r--man/sd_event_set_name.xml5
-rw-r--r--man/sd_event_wait.xml5
-rw-r--r--man/sd_get_seats.xml5
-rw-r--r--man/sd_id128_get_machine.xml5
-rw-r--r--man/sd_id128_randomize.xml5
-rw-r--r--man/sd_id128_to_string.xml5
-rw-r--r--man/sd_is_fifo.xml5
-rw-r--r--man/sd_journal_add_match.xml5
-rw-r--r--man/sd_journal_get_catalog.xml5
-rw-r--r--man/sd_journal_get_cursor.xml5
-rw-r--r--man/sd_journal_get_cutoff_realtime_usec.xml5
-rw-r--r--man/sd_journal_get_data.xml5
-rw-r--r--man/sd_journal_get_fd.xml5
-rw-r--r--man/sd_journal_get_realtime_usec.xml5
-rw-r--r--man/sd_journal_get_usage.xml5
-rw-r--r--man/sd_journal_next.xml5
-rw-r--r--man/sd_journal_open.xml5
-rw-r--r--man/sd_journal_print.xml5
-rw-r--r--man/sd_journal_query_unique.xml5
-rw-r--r--man/sd_journal_seek_head.xml5
-rw-r--r--man/sd_journal_stream_fd.xml5
-rw-r--r--man/sd_listen_fds.xml5
-rw-r--r--man/sd_login_monitor_new.xml5
-rw-r--r--man/sd_machine_get_class.xml5
-rw-r--r--man/sd_notify.xml5
-rw-r--r--man/sd_pid_get_session.xml5
-rw-r--r--man/sd_seat_get_active.xml5
-rw-r--r--man/sd_session_is_active.xml5
-rw-r--r--man/sd_uid_get_state.xml5
-rw-r--r--man/sd_watchdog_enabled.xml5
-rw-r--r--man/shutdown.xml5
-rw-r--r--man/standard-conf.xml9
-rw-r--r--man/standard-options.xml5
-rw-r--r--man/sysctl.d.xml7
-rw-r--r--man/systemctl.xml9
-rw-r--r--man/systemd-activate.xml11
-rw-r--r--man/systemd-analyze.xml5
-rw-r--r--man/systemd-ask-password-console.service.xml5
-rw-r--r--man/systemd-ask-password.xml5
-rw-r--r--man/systemd-backlight@.service.xml7
-rw-r--r--man/systemd-binfmt.service.xml7
-rw-r--r--man/systemd-bootchart.xml13
-rw-r--r--man/systemd-bus-proxyd.xml7
-rw-r--r--man/systemd-bus-proxyd@.service.xml5
-rw-r--r--man/systemd-cat.xml5
-rw-r--r--man/systemd-cgls.xml5
-rw-r--r--man/systemd-cgtop.xml5
-rw-r--r--man/systemd-coredump.xml7
-rw-r--r--man/systemd-cryptsetup-generator.xml7
-rw-r--r--man/systemd-cryptsetup@.service.xml7
-rw-r--r--man/systemd-debug-generator.xml7
-rw-r--r--man/systemd-delta.xml5
-rw-r--r--man/systemd-detect-virt.xml5
-rw-r--r--man/systemd-efi-boot-generator.xml7
-rw-r--r--man/systemd-escape.xml5
-rw-r--r--man/systemd-firstboot.xml5
-rw-r--r--man/systemd-fsck@.service.xml7
-rw-r--r--man/systemd-fstab-generator.xml7
-rw-r--r--man/systemd-getty-generator.xml7
-rw-r--r--man/systemd-gpt-auto-generator.xml7
-rw-r--r--man/systemd-halt.service.xml11
-rw-r--r--man/systemd-hibernate-resume-generator.xml7
-rw-r--r--man/systemd-hibernate-resume@.service.xml7
-rw-r--r--man/systemd-hostnamed.service.xml7
-rw-r--r--man/systemd-hwdb.xml7
-rw-r--r--man/systemd-inhibit.xml5
-rw-r--r--man/systemd-initctl.service.xml7
-rw-r--r--man/systemd-journal-gatewayd.service.xml7
-rw-r--r--man/systemd-journal-remote.xml5
-rw-r--r--man/systemd-journal-upload.xml9
-rw-r--r--man/systemd-journald.service.xml9
-rw-r--r--man/systemd-localed.service.xml7
-rw-r--r--man/systemd-logind.service.xml7
-rw-r--r--man/systemd-machine-id-commit.service.xml7
-rw-r--r--man/systemd-machine-id-commit.xml5
-rw-r--r--man/systemd-machine-id-setup.xml5
-rw-r--r--man/systemd-machined.service.xml7
-rw-r--r--man/systemd-modules-load.service.xml7
-rw-r--r--man/systemd-networkd-wait-online.service.xml7
-rw-r--r--man/systemd-networkd.service.xml11
-rw-r--r--man/systemd-notify.xml5
-rw-r--r--man/systemd-nspawn.xml43
-rw-r--r--man/systemd-path.xml5
-rw-r--r--man/systemd-quotacheck.service.xml7
-rw-r--r--man/systemd-random-seed.service.xml7
-rw-r--r--man/systemd-remount-fs.service.xml7
-rw-r--r--man/systemd-resolved.service.xml7
-rw-r--r--man/systemd-rfkill@.service.xml7
-rw-r--r--man/systemd-run.xml5
-rw-r--r--man/systemd-sleep.conf.xml13
-rw-r--r--man/systemd-socket-proxyd.xml9
-rw-r--r--man/systemd-suspend.service.xml13
-rw-r--r--man/systemd-sysctl.service.xml7
-rw-r--r--man/systemd-system-update-generator.xml7
-rw-r--r--man/systemd-system.conf.xml17
-rw-r--r--man/systemd-sysusers.xml5
-rw-r--r--man/systemd-sysv-generator.xml7
-rw-r--r--man/systemd-timedated.service.xml7
-rw-r--r--man/systemd-timesyncd.service.xml7
-rw-r--r--man/systemd-tmpfiles.xml5
-rw-r--r--man/systemd-tty-ask-password-agent.xml5
-rw-r--r--man/systemd-udevd.service.xml7
-rw-r--r--man/systemd-update-done.service.xml7
-rw-r--r--man/systemd-update-utmp.service.xml7
-rw-r--r--man/systemd-user-sessions.service.xml7
-rw-r--r--man/systemd-vconsole-setup.service.xml7
-rw-r--r--man/systemd.automount.xml5
-rw-r--r--man/systemd.device.xml5
-rw-r--r--man/systemd.exec.xml5
-rw-r--r--man/systemd.generator.xml4
-rw-r--r--man/systemd.journal-fields.xml5
-rw-r--r--man/systemd.kill.xml5
-rw-r--r--man/systemd.link.xml15
-rw-r--r--man/systemd.mount.xml5
-rw-r--r--man/systemd.netdev.xml31
-rw-r--r--man/systemd.network.xml44
-rw-r--r--man/systemd.path.xml5
-rw-r--r--man/systemd.preset.xml21
-rw-r--r--man/systemd.resource-control.xml5
-rw-r--r--man/systemd.scope.xml5
-rw-r--r--man/systemd.service.xml5
-rw-r--r--man/systemd.slice.xml7
-rw-r--r--man/systemd.snapshot.xml5
-rw-r--r--man/systemd.socket.xml5
-rw-r--r--man/systemd.special.xml5
-rw-r--r--man/systemd.swap.xml8
-rw-r--r--man/systemd.target.xml5
-rw-r--r--man/systemd.time.xml5
-rw-r--r--man/systemd.timer.xml5
-rw-r--r--man/systemd.unit.xml30
-rw-r--r--man/systemd.xml7
-rw-r--r--man/sysusers.d.xml5
-rw-r--r--man/telinit.xml5
-rw-r--r--man/timedatectl.xml9
-rw-r--r--man/timesyncd.conf.xml11
-rw-r--r--man/tmpfiles.d.xml5
-rw-r--r--man/udev.conf.xml5
-rw-r--r--man/udev.xml13
-rw-r--r--man/udevadm.xml5
-rw-r--r--man/user-system-options.xml5
-rw-r--r--man/vconsole.conf.xml5
-rw-r--r--po/es.po4
-rw-r--r--rules/60-block.rules2
-rw-r--r--rules/60-persistent-storage.rules2
-rw-r--r--shell-completion/zsh/_bootctl7
-rw-r--r--src/boot/bootctl.c928
-rw-r--r--src/bus-proxyd/driver.c11
-rw-r--r--src/console/consoled-manager.c11
-rw-r--r--src/console/consoled.c5
-rw-r--r--src/core/automount.c2
-rw-r--r--src/core/busname.c5
-rw-r--r--src/core/dbus-kill.c4
-rw-r--r--src/core/dbus-unit.c6
-rw-r--r--src/core/device.c54
-rw-r--r--src/core/execute.c12
-rw-r--r--src/core/hostname-setup.c24
-rw-r--r--src/core/job.c85
-rw-r--r--src/core/job.h2
-rw-r--r--src/core/kill.c4
-rw-r--r--src/core/load-fragment.c5
-rw-r--r--src/core/machine-id-setup.c2
-rw-r--r--src/core/main.c9
-rw-r--r--src/core/manager.c24
-rw-r--r--src/core/mount-setup.c4
-rw-r--r--src/core/mount.c39
-rw-r--r--src/core/namespace.c20
-rw-r--r--src/core/service.c1
-rw-r--r--src/core/socket.c3
-rw-r--r--src/core/swap.c43
-rw-r--r--src/core/transaction.c98
-rw-r--r--src/core/unit.c92
-rw-r--r--src/core/unit.h11
-rw-r--r--src/efi-boot-generator/efi-boot-generator.c2
-rw-r--r--src/fsck/fsck.c1
-rw-r--r--src/fstab-generator/fstab-generator.c28
-rw-r--r--src/gpt-auto-generator/gpt-auto-generator.c2
-rw-r--r--src/hostname/hostnamed.c2
-rw-r--r--src/import/export.c1
-rw-r--r--src/import/import-common.c1
-rw-r--r--src/import/import.c1
-rw-r--r--src/import/importd.c1
-rw-r--r--src/import/pull-common.c1
-rw-r--r--src/import/pull-dkr.c542
-rw-r--r--src/import/pull-dkr.h3
-rw-r--r--src/import/pull.c29
-rw-r--r--src/journal-remote/journal-remote.c1
-rw-r--r--src/journal-remote/journal-upload.c3
-rw-r--r--src/journal/coredumpctl.c1
-rw-r--r--src/journal/journald-audit.c11
-rw-r--r--src/journal/journald-server.c9
-rw-r--r--src/kernel-install/90-loaderentry.install6
-rw-r--r--src/libsystemd-network/dhcp-identifier.c9
-rw-r--r--src/libsystemd-network/dhcp-identifier.h3
-rw-r--r--src/libsystemd-network/sd-dhcp-lease.c2
-rw-r--r--src/libsystemd-terminal/evcat.c11
-rw-r--r--src/libsystemd-terminal/grdev-drm.c10
-rw-r--r--src/libsystemd-terminal/grdev-internal.h6
-rw-r--r--src/libsystemd-terminal/grdev.c8
-rw-r--r--src/libsystemd-terminal/grdev.h4
-rw-r--r--src/libsystemd-terminal/idev-evdev.c8
-rw-r--r--src/libsystemd-terminal/idev-internal.h6
-rw-r--r--src/libsystemd-terminal/idev-keyboard.c10
-rw-r--r--src/libsystemd-terminal/idev.c8
-rw-r--r--src/libsystemd-terminal/idev.h4
-rw-r--r--src/libsystemd-terminal/modeset.c14
-rw-r--r--src/libsystemd-terminal/subterm.c7
-rw-r--r--src/libsystemd-terminal/sysview-internal.h6
-rw-r--r--src/libsystemd-terminal/sysview.c12
-rw-r--r--src/libsystemd-terminal/sysview.h4
-rw-r--r--src/libsystemd/libsystemd.sym.m453
-rw-r--r--src/libsystemd/sd-bus/bus-control.c2
-rw-r--r--src/libsystemd/sd-bus/bus-creds.c6
-rw-r--r--src/libsystemd/sd-bus/bus-socket.c23
-rw-r--r--src/libsystemd/sd-bus/bus-util.c1
-rw-r--r--src/libsystemd/sd-bus/sd-bus.c12
-rw-r--r--src/libsystemd/sd-device/device-enumerator.c12
-rw-r--r--src/libsystemd/sd-device/device-private.c29
-rw-r--r--src/libsystemd/sd-device/sd-device.c6
-rw-r--r--src/libsystemd/sd-event/sd-event.c1
-rw-r--r--src/libsystemd/sd-event/test-event.c1
-rw-r--r--src/login/loginctl.c1
-rw-r--r--src/login/logind-dbus.c5
-rw-r--r--src/login/logind-user.c2
-rw-r--r--src/login/logind.c5
-rw-r--r--src/machine/machinectl.c1
-rw-r--r--src/machine/machined.c3
-rw-r--r--src/network/networkctl.c2
-rw-r--r--src/network/networkd-link.c31
-rw-r--r--src/network/networkd-wait-online.c5
-rw-r--r--src/network/networkd.c4
-rw-r--r--src/nspawn/nspawn.c1559
-rw-r--r--src/remount-fs/remount-fs.c1
-rw-r--r--src/resolve/resolved.c1
-rw-r--r--src/run/run.c1
-rw-r--r--src/shared/architecture.c2
-rw-r--r--src/shared/architecture.h2
-rw-r--r--src/shared/ask-password-api.c2
-rw-r--r--src/shared/base-filesystem.c16
-rw-r--r--src/shared/base-filesystem.h4
-rw-r--r--src/shared/capability.h2
-rw-r--r--src/shared/cgroup-util.c2
-rw-r--r--src/shared/condition.c2
-rw-r--r--src/shared/conf-parser.c2
-rw-r--r--src/shared/dev-setup.c29
-rw-r--r--src/shared/dev-setup.h4
-rw-r--r--src/shared/fdset.c2
-rw-r--r--src/shared/generator.c2
-rw-r--r--src/shared/hostname-util.c33
-rw-r--r--src/shared/hostname-util.h2
-rw-r--r--src/shared/import-util.c21
-rw-r--r--src/shared/import-util.h2
-rw-r--r--src/shared/json.c441
-rw-r--r--src/shared/json.h39
-rw-r--r--src/shared/log.c1
-rw-r--r--src/shared/machine-pool.c3
-rw-r--r--src/shared/missing.h11
-rw-r--r--src/shared/path-util.c34
-rw-r--r--src/shared/path-util.h4
-rw-r--r--src/shared/process-util.c3
-rw-r--r--src/shared/pty.c3
-rw-r--r--src/shared/random-util.c2
-rw-r--r--src/shared/rm-rf.c2
-rw-r--r--src/shared/signal-util.c228
-rw-r--r--src/shared/signal-util.h41
-rw-r--r--src/shared/switch-root.c2
-rw-r--r--src/shared/unit-name.c2
-rw-r--r--src/shared/unit-name.h6
-rw-r--r--src/shared/util.c278
-rw-r--r--src/shared/util.h30
-rw-r--r--src/systemctl/systemctl.c23
-rwxr-xr-xsrc/systemctl/systemd-sysv-install.SKELETON47
-rw-r--r--src/systemd/sd-bus.h6
-rw-r--r--src/test/test-conf-parser.c234
-rw-r--r--src/test/test-fdset.c53
-rw-r--r--src/test/test-hashmap-plain.c2
-rw-r--r--src/test/test-json.c96
-rw-r--r--src/test/test-path-util.c76
-rw-r--r--src/test/test-pty.c1
-rw-r--r--src/test/test-udev.c7
-rw-r--r--src/test/test-unit-file.c19
-rw-r--r--src/test/test-util.c55
-rw-r--r--src/timesync/timesyncd.c1
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c1
-rw-r--r--src/udev/net/link-config.c11
-rw-r--r--src/udev/net/link-config.h4
-rw-r--r--src/udev/udev-builtin-net_id.c9
-rw-r--r--src/udev/udev-event.c193
-rw-r--r--src/udev/udev.h2
-rw-r--r--src/udev/udevadm-test.c8
-rw-r--r--src/udev/udevd.c561
-rw-r--r--tmpfiles.d/etc.conf.m42
-rw-r--r--tmpfiles.d/legacy.conf2
-rw-r--r--units/systemd-journald-audit.socket1
-rw-r--r--units/systemd-nspawn@.service.in1
-rw-r--r--units/systemd-udevd.service.in1
371 files changed, 8346 insertions, 3394 deletions
diff --git a/.gitignore b/.gitignore
index d2f1a1f9d6..e26931b1b8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -175,6 +175,7 @@
/test-compress-benchmark
/test-condition
/test-conf-files
+/test-conf-parser
/test-copy
/test-coredump-vacuum
/test-daemon
diff --git a/CODING_STYLE b/CODING_STYLE
index 91f09e80a8..bdec988ce6 100644
--- a/CODING_STYLE
+++ b/CODING_STYLE
@@ -292,3 +292,24 @@
- When returning a return code from main(), please preferably use
EXIT_FAILURE and EXIT_SUCCESS as defined by libc.
+
+- The order in which header files are included doesn't matter too
+ much. However, please try to include the headers of external
+ libraries first (these are all headers enclosed in <>), followed by
+ the headers of our own public headers (these are all headers
+ starting with "sd-"), internal utility libraries from src/shared/,
+ followed by the headers of the specific component. Or in other
+ words:
+
+ #include <stdio.h>
+ #include "sd-daemon.h"
+ #include "util.h"
+ #include "frobnicator.h"
+
+ Where stdio.h is a public glibc API, sd-daemon.h is a public API of
+ our own, util.h is a utility library header from src/shared, and
+ frobnicator.h is an placeholder name for any systemd component. The
+ benefit of following this ordering is that more local definitions
+ are always defined after more global ones. Thus, our local
+ definitions will never "leak" into the global header files, possibly
+ altering their effect due to #ifdeffery.
diff --git a/Makefile.am b/Makefile.am
index 5f58a1c0fa..43b819bf9b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -39,16 +39,16 @@ SUBDIRS = . po
.PRECIOUS: $(TEST_SUITE_LOG) Makefile
LIBUDEV_CURRENT=7
-LIBUDEV_REVISION=2
+LIBUDEV_REVISION=3
LIBUDEV_AGE=6
LIBGUDEV_CURRENT=2
LIBGUDEV_REVISION=0
LIBGUDEV_AGE=2
-LIBSYSTEMD_CURRENT=6
+LIBSYSTEMD_CURRENT=7
LIBSYSTEMD_REVISION=0
-LIBSYSTEMD_AGE=6
+LIBSYSTEMD_AGE=7
# The following four libraries only exist for compatibility reasons,
# their version info should not be bumped anymore
@@ -188,6 +188,7 @@ AM_CPPFLAGS = \
-DCATALOG_DATABASE=\"$(catalogstatedir)/database\" \
-DSYSTEMD_CGROUP_AGENT_PATH=\"$(rootlibexecdir)/systemd-cgroups-agent\" \
-DSYSTEMD_BINARY_PATH=\"$(rootlibexecdir)/systemd\" \
+ -DSYSTEMD_FSCK_PATH=\"$(rootlibexecdir)/systemd-fsck\" \
-DSYSTEMD_SHUTDOWN_BINARY_PATH=\"$(rootlibexecdir)/systemd-shutdown\" \
-DSYSTEMD_SLEEP_BINARY_PATH=\"$(rootlibexecdir)/systemd-sleep\" \
-DSYSTEMCTL_BINARY_PATH=\"$(rootbindir)/systemctl\" \
@@ -626,6 +627,7 @@ systemgenerator_PROGRAMS += \
endif
EXTRA_DIST += \
+ src/systemctl/systemd-sysv-install.SKELETON \
units/rc-local.service.in \
units/halt-local.service.in
@@ -720,12 +722,6 @@ man/systemd.directives.xml: $(top_srcdir)/tools/make-directive-index.py $(SOURCE
$(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(PYTHON) $< $@ $(filter-out $<,$^)
-EXTRA_DIST += \
- man/systemd.index.xml \
- man/index.html \
- man/systemd.directives.xml \
- man/glib-event-glue.c
-
CLEANFILES += \
man/systemd.index.xml \
man/systemd.directives.xml
@@ -741,7 +737,12 @@ EXTRA_DIST += \
$(man_MANS) \
tools/make-man-index.py \
tools/make-directive-index.py \
- tools/xml_helper.py
+ tools/xml_helper.py \
+ man/systemd.index.xml \
+ man/index.html \
+ man/systemd.directives.xml \
+ man/glib-event-glue.c \
+ $(NULL)
# ------------------------------------------------------------------------------
noinst_LTLIBRARIES += \
@@ -784,6 +785,8 @@ libsystemd_shared_la_SOURCES = \
src/shared/time-util.h \
src/shared/locale-util.c \
src/shared/locale-util.h \
+ src/shared/signal-util.c \
+ src/shared/signal-util.h \
src/shared/mempool.c \
src/shared/mempool.h \
src/shared/hashmap.c \
@@ -1258,16 +1261,17 @@ DISTCLEANFILES = \
EXTRA_DIST += \
$(gperf_gperf_m4_sources) \
- $(gperf_gperf_sources) \
- $(gperf_txt_sources:-list.txt=-from-name.gperf)
+ $(gperf_gperf_sources)
CLEANFILES += \
$(gperf_txt_sources)
%-from-name.gperf: %-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "struct $(notdir $*)_name { const char* name; int id; };"; print "%null-strings"; print "%%";} { printf "%s, %s\n", $$1, $$1 }' <$< >$@
%-from-name.h: %-from-name.gperf
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GPERF)$(GPERF) -L ANSI-C -t --ignore-case -N lookup_$(notdir $*) -H hash_$(notdir $*)_name -p -C <$< >$@
@@ -1276,6 +1280,7 @@ src/shared/errno-list.txt:
$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include errno.h - </dev/null | $(AWK) '/^#define[ \t]+E[^ _]+[ \t]+/ { print $$2; }' >$@
src/shared/errno-to-name.h: src/shared/errno-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "static const char* const errno_names[] = { "} !/EDEADLOCK/ && !/EWOULDBLOCK/ && !/ENOTSUP/ { printf "[%s] = \"%s\",\n", $$1, $$1 } END{print "};"}' <$< >$@
@@ -1284,6 +1289,7 @@ src/shared/af-list.txt:
$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include sys/socket.h - </dev/null | grep -v AF_UNSPEC | grep -v AF_MAX | $(AWK) '/^#define[ \t]+AF_[^ \t]+[ \t]+PF_[^ \t]/ { print $$2; }' >$@
src/shared/af-to-name.h: src/shared/af-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "static const char* const af_names[] = { "} !/AF_FILE/ && !/AF_ROUTE/ && !/AF_LOCAL/ { printf "[%s] = \"%s\",\n", $$1, $$1 } END{print "};"}' <$< >$@
@@ -1292,9 +1298,11 @@ src/shared/arphrd-list.txt:
$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include net/if_arp.h - </dev/null | $(AWK) '/^#define[ \t]+ARPHRD_[^ \t]+[ \t]+[^ \t]/ { print $$2; }' | sed -e 's/ARPHRD_//' >$@
src/shared/arphrd-to-name.h: src/shared/arphrd-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "static const char* const arphrd_names[] = { "} !/CISCO/ { printf "[ARPHRD_%s] = \"%s\",\n", $$1, $$1 } END{print "};"}' <$< >$@
src/shared/arphrd-from-name.gperf: src/shared/arphrd-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "struct arphrd_name { const char* name; int id; };"; print "%null-strings"; print "%%";} { printf "%s, ARPHRD_%s\n", $$1, $$1 }' <$< >$@
@@ -1303,12 +1311,15 @@ src/shared/cap-list.txt:
$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include linux/capability.h -include missing.h - </dev/null | $(AWK) '/^#define[ \t]+CAP_[A-Z_]+[ \t]+/ { print $$2; }' | grep -v CAP_LAST_CAP >$@
src/shared/cap-to-name.h: src/shared/cap-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "static const char* const capability_names[] = { "} { printf "[%s] = \"%s\",\n", $$1, tolower($$1) } END{print "};"}' <$< >$@
src/shared/cap-from-name.gperf: src/shared/cap-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "struct capability_name { const char* name; int id; };"; print "%null-strings"; print "%%";} { printf "%s, %s\n", $$1, $$1 }' <$< >$@
src/shared/cap-from-name.h: src/shared/cap-from-name.gperf
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GPERF)$(GPERF) -L ANSI-C -t --ignore-case -N lookup_capability -H hash_capability_name -p -C <$< >$@
audit_list_includes = -include linux/audit.h missing.h
@@ -1321,6 +1332,7 @@ src/journal/audit_type-list.txt:
$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include linux/audit.h -include missing.h - </dev/null | grep -vE 'AUDIT_.*(FIRST|LAST)_' | $(SED) -r -n 's/^#define\s+AUDIT_(\w+)\s+([0-9]{4})\s*$$/\1\t\2/p' | sort -k2 >$@
src/journal/audit_type-to-name.h: src/journal/audit_type-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "const char *audit_type_to_string(int type) {\n\tswitch(type) {" } {printf " case AUDIT_%s: return \"%s\";\n", $$1, $$1 } END{ print " default: return NULL;\n\t}\n}\n" }' <$< >$@
@@ -1329,9 +1341,11 @@ src/resolve/dns_type-list.txt: src/resolve/dns-type.h
$(AM_V_GEN)$(SED) -n -r 's/.* DNS_TYPE_(\w+).*/\1/p' <$< >$@
src/resolve/dns_type-to-name.h: src/resolve/dns_type-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "const char *dns_type_to_string(int type) {\n\tswitch(type) {" } {printf " case DNS_TYPE_%s: return ", $$1; sub(/_/, "-"); printf "\"%s\";\n", $$1 } END{ print " default: return NULL;\n\t}\n}\n" }' <$< >$@
src/resolve/dns_type-from-name.gperf: src/resolve/dns_type-list.txt
+ $(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(AWK) 'BEGIN{ print "struct dns_type_name { const char* name; int id; };"; print "%null-strings"; print "%%";} { s=$$1; sub(/_/, "-", s); printf "%s, ", $$s; printf "DNS_TYPE_%s\n", $$1 }' <$< >$@
# ------------------------------------------------------------------------------
@@ -1439,6 +1453,7 @@ tests += \
test-socket-util \
test-fdset \
test-conf-files \
+ test-conf-parser \
test-capability \
test-async \
test-ratelimit \
@@ -2066,6 +2081,12 @@ test_conf_files_LDADD = \
libsystemd-label.la \
libsystemd-shared.la
+test_conf_parser_SOURCES = \
+ src/test/test-conf-parser.c
+
+test_conf_parser_LDADD = \
+ libsystemd-shared.la
+
test_bus_policy_SOURCES = \
src/bus-proxyd/test-bus-xml-policy.c
@@ -2119,7 +2140,7 @@ systemd_analyze_SOURCES = \
src/analyze/analyze-verify.c \
src/analyze/analyze-verify.h
-systemd_verify_CFLAGS = \
+systemd_analyze_CFLAGS = \
$(AM_CFLAGS) \
$(SECCOMP_CFLAGS)
@@ -2299,15 +2320,15 @@ nodist_sysusers_DATA = \
sysusers.d/systemd.conf \
sysusers.d/basic.conf
+INSTALL_DIRS += \
+ $(sysusersdir)
+endif
+
EXTRA_DIST += \
units/systemd-sysusers.service.in \
sysusers.d/systemd.conf.m4 \
sysusers.d/basic.conf.in
-INSTALL_DIRS += \
- $(sysusersdir)
-endif
-
# ------------------------------------------------------------------------------
dist_factory_etc_DATA = \
factory/etc/nsswitch.conf
@@ -2336,13 +2357,13 @@ rootbin_PROGRAMS += \
nodist_systemunit_DATA += \
units/systemd-firstboot.service
-EXTRA_DIST += \
- units/systemd-firstboot.service.in
-
SYSINIT_TARGET_WANTS += \
systemd-firstboot.service
endif
+EXTRA_DIST += \
+ units/systemd-firstboot.service.in
+
# ------------------------------------------------------------------------------
systemd_machine_id_setup_SOURCES = \
src/machine-id-setup/machine-id-setup-main.c \
@@ -2473,11 +2494,6 @@ systemd_hibernate_resume_generator_LDADD = \
libsystemd-label.la \
libsystemd-shared.la
-EXTRA_DIST += \
- units/systemd-hibernate.service.in \
- units/systemd-hibernate-resume@.service.in \
- units/systemd-hybrid-sleep.service.in
-
dist_systemunit_DATA += \
units/hibernate.target \
units/hybrid-sleep.target
@@ -2488,6 +2504,11 @@ nodist_systemunit_DATA += \
units/systemd-hybrid-sleep.service
endif
+EXTRA_DIST += \
+ units/systemd-hibernate.service.in \
+ units/systemd-hibernate-resume@.service.in \
+ units/systemd-hybrid-sleep.service.in
+
# ------------------------------------------------------------------------------
if ENABLE_EFI
systemgenerator_PROGRAMS += \
@@ -2588,6 +2609,8 @@ EFI_FORMAT = -O binary
else
EFI_FORMAT = --target=efi-app-$(EFI_ARCH)
endif
+endif
+endif
# ------------------------------------------------------------------------------
systemd_boot_headers = \
@@ -2603,13 +2626,16 @@ systemd_boot_sources = \
src/boot/efi/pefile.c \
src/boot/efi/boot.c
+EXTRA_DIST += $(systemd_boot_sources) $(systemd_boot_headers)
+
+if ENABLE_EFI
+if HAVE_GNUEFI
systemd_boot_objects = $(addprefix $(top_builddir)/,$(systemd_boot_sources:.c=.o))
systemd_boot_solib = $(top_builddir)/src/boot/efi/systemd_boot.so
systemd_boot = systemd-boot$(EFI_MACHINE_TYPE_NAME).efi
bootlib_DATA = $(systemd_boot)
CLEANFILES += $(systemd_boot_objects) $(systemd_boot_solib) $(systemd_boot)
-EXTRA_DIST += $(systemd_boot_sources) $(systemd_boot_headers)
$(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(top_srcdir)/,$(systemd_boot_headers))
@$(MKDIR_P) $(top_builddir)/src/boot/efi/
@@ -2623,6 +2649,8 @@ $(systemd_boot_solib): $(systemd_boot_objects)
$(systemd_boot): $(systemd_boot_solib)
$(AM_V_GEN)$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic \
-j .dynsym -j .rel -j .rela -j .reloc $(EFI_FORMAT) $< $@
+endif
+endif
# ------------------------------------------------------------------------------
stub_headers = \
@@ -2640,13 +2668,16 @@ stub_sources = \
src/boot/efi/linux.c \
src/boot/efi/stub.c
+EXTRA_DIST += $(stub_sources) $(stub_headers)
+
+if ENABLE_EFI
+if HAVE_GNUEFI
stub_objects = $(addprefix $(top_builddir)/,$(stub_sources:.c=.o))
stub_solib = $(top_builddir)/src/boot/efi/stub.so
stub = linux$(EFI_MACHINE_TYPE_NAME).efi.stub
bootlib_DATA += $(stub)
CLEANFILES += $(stub_objects) $(stub_solib) $(stub)
-EXTRA_DIST += $(stub_sources) $(stub_headers)
$(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(top_srcdir)/,$(stub_headers))
@$(MKDIR_P) $(top_builddir)/src/boot/efi/
@@ -2663,7 +2694,6 @@ $(stub): $(stub_solib)
# ------------------------------------------------------------------------------
CLEANFILES += test-efi-disk.img
-EXTRA_DIST += test/test-efi-create-disk.sh
test-efi-disk.img: $(systemd_boot) $(stub) test/test-efi-create-disk.sh
$(AM_V_GEN)test/test-efi-create-disk.sh
@@ -2673,6 +2703,8 @@ test-efi: test-efi-disk.img
endif
endif
+EXTRA_DIST += test/test-efi-create-disk.sh
+
# ------------------------------------------------------------------------------
if HAVE_BLKID
systemgenerator_PROGRAMS += \
@@ -3103,17 +3135,17 @@ pkgconfiglib_DATA += \
src/libsystemd/libsystemd.pc
pkginclude_HEADERS += \
+ src/systemd/sd-bus.h \
+ src/systemd/sd-bus-protocol.h \
+ src/systemd/sd-bus-vtable.h \
+ src/systemd/sd-event.h \
src/systemd/sd-login.h \
src/systemd/sd-id128.h \
src/systemd/sd-daemon.h
if ENABLE_KDBUS
pkginclude_HEADERS += \
- src/systemd/sd-bus.h \
- src/systemd/sd-bus-protocol.h \
- src/systemd/sd-bus-vtable.h \
src/systemd/sd-utf8.h \
- src/systemd/sd-event.h \
src/systemd/sd-rtnl.h \
src/systemd/sd-resolve.h \
src/systemd/sd-path.h
@@ -3918,11 +3950,6 @@ dist_udevhwdb_DATA = \
hwdb/70-pointingstick.hwdb \
hwdb/70-touchpad.hwdb
-EXTRA_DIST += \
- units/systemd-hwdb-update.service.in \
- hwdb/ids-update.pl \
- hwdb/sdio.ids
-
SYSINIT_TARGET_WANTS += \
systemd-hwdb-update.service
@@ -3938,6 +3965,11 @@ hwdb-remove-hook:
-test -n "$(DESTDIR)" || rm -f /etc/udev/hwdb.bin
endif
+EXTRA_DIST += \
+ units/systemd-hwdb-update.service.in \
+ hwdb/ids-update.pl \
+ hwdb/sdio.ids
+
# ------------------------------------------------------------------------------
TESTS += \
test/udev-test.pl \
@@ -3999,6 +4031,7 @@ EXTRA_DIST += \
test/udev-test.pl \
test/rule-syntax-check.py \
test/sysv-generator-test.py \
+ test/mocks/fsck \
$(NULL)
@@ -4334,9 +4367,6 @@ dist_systemunit_DATA += \
nodist_systemunit_DATA += \
units/systemd-journal-remote.service
-EXTRA_DIST += \
- units/systemd-journal-remote.service.in
-
journal-remote-install-hook: journal-install-hook
-$(MKDIR_P) $(DESTDIR)/var/log/journal/remote
-chown 0:0 $(DESTDIR)/var/log/journal/remote
@@ -4350,6 +4380,7 @@ nodist_pkgsysconf_DATA += \
src/journal-remote/journal-remote.conf
EXTRA_DIST += \
+ units/systemd-journal-remote.service.in \
src/journal-remote/journal-remote.conf.in
endif
@@ -4376,15 +4407,14 @@ systemd_journal_upload_LDADD = \
nodist_systemunit_DATA += \
units/systemd-journal-upload.service
-EXTRA_DIST += \
- units/systemd-journal-upload.service.in
-
nodist_pkgsysconf_DATA += \
src/journal-remote/journal-upload.conf
+endif
+
EXTRA_DIST += \
+ units/systemd-journal-upload.service.in \
src/journal-remote/journal-upload.conf.in
-endif
# using _CFLAGS = in the conditional below would suppress AM_CFLAGS
journalctl_CFLAGS = \
@@ -4629,7 +4659,9 @@ libsystemd_journal_internal_la_SOURCES = \
src/journal/mmap-cache.h \
src/journal/compress.c \
src/journal/audit-type.h \
- src/journal/audit-type.c \
+ src/journal/audit-type.c
+
+nodist_libsystemd_journal_internal_la_SOURCES = \
src/journal/audit_type-to-name.h
gperf_txt_sources += \
@@ -4930,10 +4962,10 @@ dist_pkgsysconf_DATA += \
nodist_systemunit_DATA += \
units/systemd-bootchart.service
+endif
EXTRA_DIST += \
units/systemd-bootchart.service.in
-endif
# ------------------------------------------------------------------------------
if ENABLE_QUOTACHECK
@@ -5402,9 +5434,6 @@ SYSTEM_UNIT_ALIASES += \
BUSNAMES_TARGET_WANTS += \
org.freedesktop.machine1.busname
-EXTRA_DIST += \
- units/systemd-machined.service.in
-
libnss_mymachines_la_SOURCES = \
src/nss-mymachines/nss-mymachines.sym \
src/nss-mymachines/nss-mymachines.c
@@ -5427,6 +5456,9 @@ lib_LTLIBRARIES += \
endif
+EXTRA_DIST += \
+ units/systemd-machined.service.in
+
# ------------------------------------------------------------------------------
if ENABLE_IMPORTD
@@ -5554,9 +5586,6 @@ dist_rootlibexec_DATA = \
nodist_systemunit_DATA += \
units/systemd-importd.service
-EXTRA_DIST += \
- units/systemd-importd.service.in
-
dist_systemunit_DATA_busnames += \
units/org.freedesktop.import1.busname
@@ -5604,6 +5633,11 @@ endif
endif
+EXTRA_DIST += \
+ units/systemd-importd.service.in \
+ src/resolve/resolved.conf.in
+
+
# ------------------------------------------------------------------------------
if ENABLE_RESOLVED
systemd_resolved_SOURCES = \
@@ -5642,11 +5676,11 @@ systemd_resolved_SOURCES = \
src/resolve/resolved-dns-stream.h \
src/resolve/resolved-dns-stream.c \
src/resolve/dns-type.c \
- src/resolve/dns-type.h \
- src/resolve/dns_type-from-name.h \
- src/resolve/dns_type-to-name.h
+ src/resolve/dns-type.h
nodist_systemd_resolved_SOURCES = \
+ src/resolve/dns_type-from-name.h \
+ src/resolve/dns_type-to-name.h \
src/resolve/resolved-gperf.c
gperf_gperf_sources += \
@@ -5677,9 +5711,6 @@ dist_dbuspolicy_DATA += \
dist_dbussystemservice_DATA += \
src/resolve/org.freedesktop.resolve1.service
-EXTRA_DIST += \
- units/systemd-resolved.service.m4.in
-
SYSTEM_UNIT_ALIASES += \
systemd-resolved.service dbus-org.freedesktop.resolve1.service
@@ -5692,9 +5723,6 @@ GENERAL_ALIASES += \
nodist_pkgsysconf_DATA += \
src/resolve/resolved.conf
-EXTRA_DIST += \
- src/resolve/resolved.conf.in
-
tests += \
test-dns-domain
@@ -5743,7 +5771,9 @@ systemd_resolve_host_SOURCES = \
src/resolve/resolved-dns-domain.c \
src/resolve/resolved-dns-domain.h \
src/resolve/dns-type.c \
- src/resolve/dns-type.h \
+ src/resolve/dns-type.h
+
+nodist_systemd_resolve_host_SOURCES = \
src/resolve/dns_type-from-name.h \
src/resolve/dns_type-to-name.h
@@ -5757,6 +5787,9 @@ rootlibexec_PROGRAMS += \
endif
+EXTRA_DIST += \
+ units/systemd-resolved.service.m4.in
+
# ------------------------------------------------------------------------------
if ENABLE_NETWORKD
rootlibexec_PROGRAMS += \
@@ -5920,13 +5953,12 @@ BUSNAMES_TARGET_WANTS += \
gperf_gperf_sources += \
src/network/networkd-network-gperf.gperf \
src/network/networkd-netdev-gperf.gperf
+endif
EXTRA_DIST += \
units/systemd-networkd.service.m4.in \
units/systemd-networkd-wait-online.service.in
-endif
-
# ------------------------------------------------------------------------------
if ENABLE_LOGIND
systemd_logind_SOURCES = \
@@ -6151,14 +6183,14 @@ rootlibexec_PROGRAMS += \
nodist_systemunit_DATA += \
units/systemd-user-sessions.service
-EXTRA_DIST += \
- units/systemd-user-sessions.service.in
-
MULTI_USER_TARGET_WANTS += \
systemd-user-sessions.service
endif
+EXTRA_DIST += \
+ units/systemd-user-sessions.service.in
+
# ------------------------------------------------------------------------------
if HAVE_PYTHON_DEVEL
@@ -6320,9 +6352,6 @@ clean-python:
# ------------------------------------------------------------------------------
if ENABLE_COMPAT_LIBS
-EXTRA_DIST += \
- src/compat-libs/linkwarning.h
-
libsystemd-%.c: src/compat-libs/libsystemd-%.sym
$(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)sed -r -n 's/^ +(sd_.*);/obsolete_lib(\1,$(notdir $(basename $<)));/p' <$< >$@
@@ -6432,6 +6461,7 @@ UNINSTALL_EXEC_HOOKS += compat-lib-uninstall-hook
endif
EXTRA_DIST += \
+ src/compat-libs/linkwarning.h \
src/compat-libs/libsystemd-journal.pc.in \
src/compat-libs/libsystemd-login.pc.in \
src/compat-libs/libsystemd-id128.pc.in \
@@ -6478,6 +6508,8 @@ substitutions = \
'|DEBUGTTY=$(DEBUGTTY)|' \
'|KILL=$(KILL)|' \
'|KMOD=$(KMOD)|' \
+ '|MOUNT_PATH=$(MOUNT_PATH)|' \
+ '|UMOUNT_PATH=$(UMOUNT_PATH)|' \
'|MKDIR_P=$(MKDIR_P)|' \
'|QUOTAON=$(QUOTAON)|' \
'|QUOTACHECK=$(QUOTACHECK)|' \
@@ -6578,7 +6610,7 @@ man/custom-entities.ent: configure.ac
printf '$(subst '|,<!ENTITY ,$(subst =, ",$(subst |',">\n,$(substitutions))))') \
> $@ # '
-DISTCLEANFILES += \
+CLEANFILES += \
man/custom-entities.ent
XSLTPROC_FLAGS = \
@@ -6776,7 +6808,6 @@ DISTCHECK_CONFIGURE_FLAGS = \
--with-pamlibdir=$$dc_install_base/$(pamlibdir) \
--with-pamconfdir=$$dc_install_base/$(pamconfdir) \
--with-rootprefix=$$dc_install_base \
- --disable-split-usr \
--enable-kdbus \
--enable-compat-libs
@@ -6800,6 +6831,14 @@ DISTCHECK_CONFIGURE_FLAGS += \
--enable-gtk-doc
endif
+if ENABLE_SPLIT_USR
+DISTCHECK_CONFIGURE_FLAGS += \
+ --enable-split-usr
+else
+DISTCHECK_CONFIGURE_FLAGS += \
+ --disable-split-usr
+endif
+
#
# Require python when making dist
#
@@ -6949,7 +6988,8 @@ test-libsystemd-sym.c: \
src/systemd/sd-bus.h \
src/systemd/sd-utf8.h \
src/systemd/sd-resolve.h \
- src/systemd/sd-path.h
+ src/systemd/sd-path.h \
+ src/systemd/sd-event.h
$(generate-sym-test)
test-libudev-sym.c: \
diff --git a/NEWS b/NEWS
index d788749240..2e2d1cefeb 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,245 @@
systemd System and Service Manager
+CHANGES WITH 221:
+
+ * Support for chkconfig (--enable-chkconfig) was removed in favour of
+ calling an abstraction /lib/systemd/systemd-sysv-install. This needs
+ to be implemented for your distribution. See "SYSV INIT.D SCRIPTS" in
+ README for details.
+
+ Contributions from: ...
+
+ -- Berlin, UNRELEASED
+
+CHANGES WITH 220:
+
+ * The gudev library has been extracted into a separate repository
+ available at: https://git.gnome.org/browse/libgudev/
+ It is now managed as part of the Gnome project. Distributions
+ are recommended to pass --disable-gudev to systemd and use
+ gudev from the Gnome project instead. gudev is still included
+ in systemd, for now. It will be removed soon, though. Please
+ also see the announcement-thread on systemd-devel:
+ http://lists.freedesktop.org/archives/systemd-devel/2015-May/032070.html
+
+ * systemd now exposes a CPUUsageNSec= property for each
+ service unit on the bus, that contains the overall consumed
+ CPU time of a service (the sum of what each process of the
+ service consumed). This value is only available if
+ CPUAccounting= is turned on for a service, and is then shown
+ in the "systemctl status" output.
+
+ * Support for configuring alternative mappings of the old SysV
+ runlevels to systemd targets has been removed. They are now
+ hardcoded in a way that runlevels 2, 3, 4 all map to
+ multi-user.target and 5 to graphical.target (which
+ previously was already the default behaviour).
+
+ * The auto-mounter logic gained support for mount point
+ expiry, using a new TimeoutIdleSec= setting in .automount
+ units. (Also available as x-systemd.idle-timeout= in /etc/fstab).
+
+ * The EFI System Partition (ESP) as mounted to /boot by
+ systemd-efi-boot-generator will now be unmounted
+ automatically after 2 minutes of not being used. This should
+ minimize the risk of ESP corruptions.
+
+ * New /etc/fstab options x-systemd.requires= and
+ x-systemd.requires-mounts-for= are now supported to express
+ additional dependencies for mounts. This is useful for
+ journalling file systems that support external journal
+ devices or overlay file systems that require underlying file
+ systems to be mounted.
+
+ * systemd does not support direct live-upgrades (via systemctl
+ daemon-reexec) from versions older than v44 anymore. As no
+ distribution we are aware of shipped such old versions in a
+ stable release this should not be problematic.
+
+ * When systemd forks off a new per-connection service instance
+ it will now set the $REMOTE_ADDR environment variable to the
+ remote IP address, and $REMOTE_PORT environment variable to
+ the remote IP port. This behaviour is similar to the
+ corresponding environment variables defined by CGI.
+
+ * systemd-networkd gained support for uplink failure
+ detection. The BindCarrier= option allows binding interface
+ configuration dynamically to the link sense of other
+ interfaces. This is useful to achieve behaviour like in
+ network switches.
+
+ * systemd-networkd gained support for configuring the DHCP
+ client identifier to use when requesting leases.
+
+ * systemd-networkd now has a per-network UseNTP= option to
+ configure whether NTP server information acquired via DHCP
+ is passed on to services like systemd-timesyncd.
+
+ * systemd-networkd gained support for vti6 tunnels.
+
+ * Note that systemd-networkd manages the sysctl variable
+ /proc/sys/net/ipv[46]/conf/*/forwarding for each interface
+ it is configured for since v219. The variable controls IP
+ forwarding, and is a per-interface alternative to the global
+ /proc/sys/net/ipv[46]/ip_forward. This setting is
+ configurable in the IPForward= option, which defaults to
+ "no". This means if networkd is used for an interface it is
+ no longer sufficient to set the global sysctl option to turn
+ on IP forwarding! Instead, the .network file option
+ IPForward= needs to be turned on! Note that the
+ implementation of this behaviour was broken in v219 and has
+ been fixed in v220.
+
+ * Many bonding and vxlan options are now configurable in
+ systemd-networkd.
+
+ * systemd-nspawn gained a new --property= setting to set unit
+ properties for the container scope. This is useful for
+ setting resource parameters (e.g "CPUShares=500") on
+ containers started from the command line.
+
+ * systemd-nspawn gained a new --private-users= switch to make
+ use of user namespacing available on recent Linux kernels.
+
+ * systemd-nspawn may now be called as part of a shell pipeline
+ in which case the pipes used for stdin and stdout are passed
+ directly to the process invoked in the container, without
+ indirection via a pseudo tty.
+
+ * systemd-nspawn gained a new switch to control the UNIX
+ signal to use when killing the init process of the container
+ when shutting down.
+
+ * systemd-nspawn gained a new --overlay= switch for mounting
+ overlay file systems into the container using the new kernel
+ overlayfs support.
+
+ * When a container image is imported via systemd-importd and
+ the host file system is not btrfs, a loopback block device
+ file is created in /var/lib/machines.raw with a btrfs file
+ system inside. It is then mounted to /var/lib/machines to
+ enable btrfs features for container management. The loopback
+ file and btrfs file system is grown as needed when container
+ images are imported via systemd-importd.
+
+ * systemd-machined/systemd-importd gained support for btrfs
+ quota, to enforce container disk space limits on disk. This
+ is exposed in "machinectl set-limit".
+
+ * systemd-importd now can import containers from local .tar,
+ .raw and .qcow2 images, and export them to .tar and .raw. It
+ can also import dkr v2 images now from the network (on top
+ of v1 as before).
+
+ * systemd-importd gained support for verifying downloaded
+ images with gpg2 (previously only gpg1 was supported).
+
+ * systemd-machined, systemd-logind, systemd: most bus calls
+ are now accessible to unprivileged processes via
+ PolicyKit. Also, systemd-logind will now allow users to kill
+ their own sessions without further privileges or
+ authorization.
+
+ * systemd-shutdownd has been removed. This service was
+ previously responsible for implementing scheduled shutdowns
+ as exposed in /usr/bin/shutdown's time parameter. This
+ functionality has now been moved into systemd-logind and is
+ accessible via a bus interface.
+
+ * "systemctl reboot" gained a new switch --firmware-setup that
+ can be used to reboot into the EFI firmware setup, if that
+ is available. systemd-logind now exposes an API on the bus
+ to trigger such reboots, in case graphical desktop UIs want
+ to cover this functionality.
+
+ * "systemctl enable", "systemctl disable" and "systemctl mask"
+ now support a new "--now" switch. If specified the units
+ that are enabled will also be started, and the ones
+ disabled/masked also stopped.
+
+ * The Gummiboot EFI boot loader tool has been merged into
+ systemd, and renamed to "systemd-boot". The bootctl tool has been
+ updated to support systemd-boot.
+
+ * An EFI kernel stub has been added that may be used to create
+ kernel EFI binaries that contain not only the actual kernel,
+ but also an initrd, boot splash, command line and OS release
+ information. This combined binary can then be signed as a
+ single image, so that the firmware can verify it all in one
+ step. systemd-boot has special support for EFI binaries created
+ like this and can extract OS release information from them
+ and show them in the boot menu. This functionality is useful
+ to implement cryptographically verified boot schemes.
+
+ * Optional support has been added to systemd-fsck to pass
+ fsck's progress report to an AF_UNIX socket in the file
+ system.
+
+ * udev will no longer create device symlinks for all block
+ devices by default. A blacklist for excluding special block
+ devices from this logic has been turned into a whitelist
+ that requires picking block devices explicitly that require
+ device symlinks.
+
+ * A new (currently still internal) API sd-device.h has been
+ added to libsystemd. This modernized API is supposed to
+ replace libudev eventually. In fact, already much of libudev
+ is now just a wrapper around sd-device.h.
+
+ * A new hwdb database for storing metadata about pointing
+ stick devices has been added.
+
+ * systemd-tmpfiles gained support for setting file attributes
+ similar to the "chattr" tool with new 'h' and 'H' lines.
+
+ * systemd-journald will no longer unconditionally set the
+ btrfs NOCOW flag on new journal files. This is instead done
+ with tmpfiles snippet using the new 'h' line type. This
+ allows easy disabling of this logic, by masking the
+ journal-nocow.conf tmpfiles file.
+
+ * systemd-journald will now translate audit message types to
+ human readable identifiers when writing them to the
+ journal. This should improve readability of audit messages.
+
+ * The LUKS logic gained support for the offset= and skip=
+ options in /etc/crypttab, as previously implemented by
+ Debian.
+
+ * /usr/lib/os-release gained a new optional field VARIANT= for
+ distributions that support multiple variants (such as a
+ desktop edition, a server edition, ...)
+
+ Contributions from: Aaro Koskinen, Adam Goode, Alban Crequy,
+ Alberto Fanjul Alonso, Alexander Sverdlin, Alex Puchades, Alin
+ Rauta, Alison Chaiken, Andrew Jones, Arend van Spriel,
+ Benedikt Morbach, Benjamin Franzke, Benjamin Tissoires, Blaž
+ Tomažič, Chris Morgan, Chris Morin, Colin Walters, Cristian
+ Rodríguez, Daniel Buch, Daniel Drake, Daniele Medri, Daniel
+ Mack, Daniel Mustieles, daurnimator, Davide Bettio, David
+ Herrmann, David Strauss, Didier Roche, Dimitri John Ledkov,
+ Eric Cook, Gavin Li, Goffredo Baroncelli, Hannes Reinecke,
+ Hans de Goede, Hans-Peter Deifel, Harald Hoyer, Iago López
+ Galeiras, Ivan Shapovalov, Jan Engelhardt, Jan Janssen, Jan
+ Pazdziora, Jan Synacek, Jasper St. Pierre, Jay Faulkner, John
+ Paul Adrian Glaubitz, Jonathon Gilbert, Karel Zak, Kay
+ Sievers, Koen Kooi, Lennart Poettering, Lubomir Rintel, Lucas
+ De Marchi, Lukas Nykryn, Lukas Rusak, Lukasz Skalski, Łukasz
+ Stelmach, Mantas Mikulėnas, Marc-Antoine Perennou, Marcel
+ Holtmann, Martin Pitt, Mathieu Chevrier, Matthew Garrett,
+ Michael Biebl, Michael Marineau, Michael Olbrich, Michal
+ Schmidt, Michal Sekletar, Mirco Tischler, Nir Soffer, Patrik
+ Flykt, Pavel Odvody, Peter Hutterer, Peter Lemenkov, Peter
+ Waller, Piotr Drąg, Raul Gutierrez S, Richard Maw, Ronny
+ Chevalier, Ross Burton, Sebastian Rasmussen, Sergey Ptashnick,
+ Seth Jennings, Shawn Landden, Simon Farnsworth, Stefan Junker,
+ Stephen Gallagher, Susant Sahani, Sylvain Plantefève, Thomas
+ Haller, Thomas Hindoe Paaboel Andersen, Tobias Hunger, Tom
+ Gundersen, Torstein Husebø, Umut Tezduyar Lindskog, Will
+ Woods, Zachary Cook, Zbigniew Jędrzejewski-Szmek
+
+ -- Berlin, 2015-05-22
+
CHANGES WITH 219:
* Introduce a new API "sd-hwdb.h" for querying the hardware
@@ -3768,7 +4008,7 @@ CHANGES WITH 191:
* HandleSleepKey= in logind.conf has been split up into
HandleSuspendKey= and HandleHibernateKey=. The old setting
is not available anymore. X11 and the kernel are
- distuingishing between these keys and we should too. This
+ distinguishing between these keys and we should too. This
also means the inhibition lock for these keys has been split
into two.
@@ -4514,7 +4754,7 @@ CHANGES WITH 43:
* Various functionality updates to libsystemd-login.so
- * Track class of PAM logins to distuingish greeters from
+ * Track class of PAM logins to distinguish greeters from
normal user logins.
Contributions from: Kay Sievers, Lennart Poettering, Michael
diff --git a/README b/README
index 039110e880..8abd862fe1 100644
--- a/README
+++ b/README
@@ -136,7 +136,7 @@ REQUIREMENTS:
During runtime, you need the following additional
dependencies:
- util-linux >= v2.25 required
+ util-linux >= v2.26 required
dbus >= 1.4.0 (strictly speaking optional, but recommended)
dracut (optional)
PolicyKit (optional)
@@ -222,6 +222,17 @@ NSS:
hosts: files mymachines resolve myhostname
+SYSV INIT.D SCRIPTS:
+ When calling "systemctl enable/disable/is-enabled" on a unit which is a
+ SysV init.d script, it calls /usr/lib/systemd/systemd-sysv-install;
+ this needs to translate the action into the distribution specific
+ mechanism such as chkconfig or update-rc.d. Packagers need to provide
+ this script if you need this functionality (you don't if you disabled
+ SysV init support).
+
+ Please see src/systemctl/systemd-sysv-install.SKELETON for how this
+ needs to look like, and provide an implementation at the marked places.
+
WARNINGS:
systemd will warn you during boot if /etc/mtab is not a
symlink to /proc/mounts. Please ensure that /etc/mtab is a
@@ -239,7 +250,7 @@ WARNINGS:
supported anymore by the basic set of Linux OS components.
systemd requires that the /run mount point exists. systemd also
- requires that /var/run is a a symlink to /run.
+ requires that /var/run is a symlink to /run.
For more information on this issue consult
http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken
diff --git a/TODO b/TODO
index dd85f57473..43b69681a8 100644
--- a/TODO
+++ b/TODO
@@ -19,47 +19,32 @@ External:
* Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
-* Fedora: move kernel image to /usr/lib/modules/, kernel-install will take care of populating /boot
-
-* Fedora: remove /etc/resolv.conf tmpfiles hack
-
* wiki: update journal format documentation for lz4 additions
* When lz4 gets an API for lz4 command output, make use of it to
compress coredumps in a way compatible with /usr/bin/lz4.
-Before 220:
-
-* fix userns support in nspawn, or remove it entirely
+Features:
-* bus-proxy: GetConnectionSELinuxSecurityContext() is completely broken
+* introduce an NSS module that uses machined info to give container UIDs pretty names when user namespacing is used.
-* timer units triggering services with failing conditions run busy:
- http://lists.freedesktop.org/archives/systemd-devel/2015-April/030095.html
+* stop using off_t, it's a crazy type. Use uint64_t instead.
* logind: follow PropertiesChanged state more closely, to deal with quick logouts and relogins
-* networkd: fix ip forwarding boolean
-
-* whe should apply a stop limit (similar to the existing start limit),
- so that we don't enter unbounded umount loops:
- http://lists.freedesktop.org/archives/systemd-devel/2015-April/030224.html
-
* change to KillMode=mixed by default
-* introduce argv0array=
-
-Features:
+* introduce argv0contains=
* invent a better systemd-run scheme for naming scopes, that works with remoting
* add journalctl -H that talks via ssh to a remote peer and passes through binary logs data
-* change journalctl -M to acquire fd to journal directory via machined, and then operate on that via openat() insteat of absolute paths
+* change journalctl -M to acquire fd to journal directory via machined, and then operate on that via openat() instead of absolute paths
-* log accumulated resource usage after each service invocation
+* add a version of --merge which also merges /var/log/journal/remote
-* export unit name escaping calls
+* log accumulated resource usage after each service invocation
* networkd: dhcp server: try to assign stable IP addresses based on client's MAC address
@@ -100,9 +85,6 @@ Features:
should not follow symlinks. None of the other adjustment or creation
calls follow symlinks.
-* bus-proxy: fix return code when releasing name that we don't have:
- http://lists.freedesktop.org/archives/systemd-devel/2015-April/030494.html
-
* fstab-generator: default to tmpfs-as-root if only usr= is specified on the kernel cmdline
* docs: bring http://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime up to date
@@ -124,9 +106,6 @@ Features:
* create a btrfs qgroup for /var/lib/machines, and add all container
subvolumes we create to it.
-* nspawn: add --overlay= to support overlay file systems, similar to
- --tmpfs= and --bind=.
-
* When logging about multiple units (stopping BoundTo units, conflicts, etc.),
log both units as UNIT=, so that journalctl -u triggers on both.
@@ -183,7 +162,7 @@ Features:
* logind: maybe allow configuration of the StopTimeout for session scopes
-* Set NoNewPriviliges= on all of our own services, where that makes sense
+* Set NoNewPrivileges= on all of our own services, where that makes sense
* Rework systemctl's GetAll property parsing to use the generic bus_map_all_properties() API
diff --git a/configure.ac b/configure.ac
index 70e594d3ae..78d52e401c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@
AC_PREREQ([2.64])
AC_INIT([systemd],
- [219],
+ [220],
[http://bugs.freedesktop.org/enter_bug.cgi?product=systemd],
[systemd],
[http://www.freedesktop.org/wiki/Software/systemd])
@@ -334,7 +334,7 @@ AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
IFLA_PHYS_PORT_ID,
IFLA_BOND_AD_INFO,
IFLA_VLAN_PROTOCOL,
- IFLA_VXLAN_LOCAL6,
+ IFLA_VXLAN_REMCSUM_NOPARTIAL,
IFLA_IPTUN_6RD_RELAY_PREFIXLEN,
IFLA_BRIDGE_VLAN_INFO,
IFLA_BRPORT_UNICAST_FLOOD,
@@ -491,25 +491,6 @@ if test "x${have_ima}" != xno ; then
fi
# ------------------------------------------------------------------------------
-have_chkconfig=yes
-AC_ARG_ENABLE([chkconfig], AS_HELP_STRING([--disable-chkconfig],[Disable optional chkconfig support]),
- [case "${enableval}" in
- yes) have_chkconfig=yes ;;
- no) have_chkconfig=no ;;
- *) AC_MSG_ERROR(bad value ${enableval} for --disable-chkconfig) ;;
- esac],
- [AC_PATH_PROG(CHKCONFIG, chkconfig)
- if test -z "$CHKCONFIG"; then
- have_chkconfig=no
- else
- have_chkconfig=yes
- fi])
-
-if test "x${have_chkconfig}" != xno ; then
- AC_DEFINE(HAVE_CHKCONFIG, 1, [Define if CHKCONFIG is available])
-fi
-
-# ------------------------------------------------------------------------------
have_selinux=no
AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [Disable optional SELINUX support]))
if test "x$enable_selinux" != "xno"; then
@@ -1389,16 +1370,19 @@ AC_ARG_WITH([dbuspolicydir],
AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]),
[],
[with_dbuspolicydir=${sysconfdir}/dbus-1/system.d])
+AX_NORMALIZE_PATH([with_dbuspolicydir])
AC_ARG_WITH([dbussessionservicedir],
AS_HELP_STRING([--with-dbussessionservicedir=DIR], [D-Bus session service directory]),
[],
[with_dbussessionservicedir=${datadir}/dbus-1/services])
+AX_NORMALIZE_PATH([with_dbussessionservicedir])
AC_ARG_WITH([dbussystemservicedir],
AS_HELP_STRING([--with-dbussystemservicedir=DIR], [D-Bus system service directory]),
[],
[with_dbussystemservicedir=${datadir}/dbus-1/system-services])
+AX_NORMALIZE_PATH([with_dbussystemservicedir])
AC_ARG_WITH([bashcompletiondir],
AS_HELP_STRING([--with-bashcompletiondir=DIR], [Bash completions directory]),
@@ -1408,29 +1392,35 @@ AC_ARG_WITH([bashcompletiondir],
] , [
with_bashcompletiondir=${datadir}/bash-completion/completions
])])
+AX_NORMALIZE_PATH([with_bashcompletiondir])
AC_ARG_WITH([zshcompletiondir],
AS_HELP_STRING([--with-zshcompletiondir=DIR], [Zsh completions directory]),
[], [with_zshcompletiondir=${datadir}/zsh/site-functions])
+AX_NORMALIZE_PATH([with_zshcompletiondir])
AC_ARG_WITH([rootprefix],
AS_HELP_STRING([--with-rootprefix=DIR], [rootfs directory prefix for config files and kernel modules]),
[], [with_rootprefix=${ac_default_prefix}])
+AX_NORMALIZE_PATH([with_rootprefix])
AC_ARG_WITH([rootlibdir],
AS_HELP_STRING([--with-rootlibdir=DIR], [Root directory for libraries necessary for boot]),
[],
[with_rootlibdir=${libdir}])
+AX_NORMALIZE_PATH([with_rootlibdir])
AC_ARG_WITH([pamlibdir],
AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]),
[],
[with_pamlibdir=${with_rootlibdir}/security])
+AX_NORMALIZE_PATH([with_pamlibdir])
AC_ARG_WITH([pamconfdir],
AS_HELP_STRING([--with-pamconfdir=DIR], [Directory for PAM configuration]),
[],
[with_pamconfdir=${sysconfdir}/pam.d])
+AX_NORMALIZE_PATH([with_pamconfdir])
AC_ARG_ENABLE([split-usr],
AS_HELP_STRING([--enable-split-usr], [Assume that /bin, /sbin aren\'t symlinks into /usr]),
@@ -1452,6 +1442,7 @@ AC_SUBST(DEFAULT_DKR_INDEX_URL)
AS_IF([test "x${enable_split_usr}" = "xyes"], [
AC_DEFINE(HAVE_SPLIT_USR, 1, [Define if /bin, /sbin aren't symlinks into /usr])
])
+AM_CONDITIONAL(ENABLE_SPLIT_USR, [test "x${enable_split_usr}" = "xyes"])
# Work around intltoolize and gtk-doc problems in VPATH builds
AM_CONDITIONAL([ENABLE_GTK_DOC_TESTS], [test "x$0" = "x./configure"],
@@ -1541,7 +1532,6 @@ AC_MSG_RESULT([
GCRYPT: ${have_gcrypt}
QRENCODE: ${have_qrencode}
MICROHTTPD: ${have_microhttpd}
- CHKCONFIG: ${have_chkconfig}
GNUTLS: ${have_gnutls}
libcurl: ${have_libcurl}
libidn: ${have_libidn}
diff --git a/hwdb/20-OUI.hwdb b/hwdb/20-OUI.hwdb
index deb323d34c..b7823d884f 100644
--- a/hwdb/20-OUI.hwdb
+++ b/hwdb/20-OUI.hwdb
@@ -2267,7 +2267,7 @@ OUI:0050C22FC*
ID_OUI_FROM_DATABASE=Blackline Systems Corporation
OUI:0050C22FD*
- ID_OUI_FROM_DATABASE=American Microsystems LTD
+ ID_OUI_FROM_DATABASE=American Microsystems, Ltd.
OUI:0050C22FE*
ID_OUI_FROM_DATABASE=Saab AB
@@ -2942,7 +2942,7 @@ OUI:0050C23DD*
ID_OUI_FROM_DATABASE=ELMIC GmbH
OUI:0050C23DE*
- ID_OUI_FROM_DATABASE=ABB Power Technologies
+ ID_OUI_FROM_DATABASE=ABB Power Technologies S.p.A. Unità Operativa SACE (PTMV)
OUI:0050C23DF*
ID_OUI_FROM_DATABASE=BiODE Inc.
@@ -3146,7 +3146,7 @@ OUI:0050C2421*
ID_OUI_FROM_DATABASE=EFSYS
OUI:0050C2422*
- ID_OUI_FROM_DATABASE=Gekeler Martina
+ ID_OUI_FROM_DATABASE=ads-tec GmbH
OUI:0050C2423*
ID_OUI_FROM_DATABASE=Power-One Inc.
@@ -3299,7 +3299,7 @@ OUI:0050C2454*
ID_OUI_FROM_DATABASE=Brivo Systems, LLC
OUI:0050C2455*
- ID_OUI_FROM_DATABASE=AirCell, Inc.
+ ID_OUI_FROM_DATABASE=Aircell
OUI:0050C2456*
ID_OUI_FROM_DATABASE=DRDC Valcartier
@@ -3461,7 +3461,7 @@ OUI:0050C248A*
ID_OUI_FROM_DATABASE=Mobile Matrix, Inc.
OUI:0050C248B*
- ID_OUI_FROM_DATABASE=ADS-TEC GmbH
+ ID_OUI_FROM_DATABASE=ads-tec GmbH
OUI:0050C248C*
ID_OUI_FROM_DATABASE=UNITON AG
@@ -3704,7 +3704,7 @@ OUI:0050C24DB*
ID_OUI_FROM_DATABASE=Alfing Montagetechnik GmbH
OUI:0050C24DC*
- ID_OUI_FROM_DATABASE=Ace Electronics Inc.
+ ID_OUI_FROM_DATABASE=Ace Electronics, Inc.
OUI:0050C24DD*
ID_OUI_FROM_DATABASE=Truteq Wireless (PTY) Ltd.
@@ -4898,7 +4898,7 @@ OUI:0050C2669*
ID_OUI_FROM_DATABASE=DSP DESIGN
OUI:0050C266A*
- ID_OUI_FROM_DATABASE=ABB Xiamen Transmission and Distribution Automation Equipmen
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C266B*
ID_OUI_FROM_DATABASE=flsystem
@@ -4952,7 +4952,7 @@ OUI:0050C267B*
ID_OUI_FROM_DATABASE=Sparton Electronics
OUI:0050C267C*
- ID_OUI_FROM_DATABASE=AirCell, Inc.
+ ID_OUI_FROM_DATABASE=Aircell
OUI:0050C267D*
ID_OUI_FROM_DATABASE=ESA Messtechnik GmbH
@@ -5648,7 +5648,7 @@ OUI:0050C2763*
ID_OUI_FROM_DATABASE=XtendWave
OUI:0050C2764*
- ID_OUI_FROM_DATABASE=Argus-Spectrum
+ ID_OUI_FROM_DATABASE=ARGUS-SPECTRUM
OUI:0050C2765*
ID_OUI_FROM_DATABASE=Phytec Messtechnik GmbH
@@ -5837,7 +5837,7 @@ OUI:0050C27A2*
ID_OUI_FROM_DATABASE=RaySat Israel LTD
OUI:0050C27A3*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiam
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C27A4*
ID_OUI_FROM_DATABASE=Calibre UK LTD
@@ -5966,7 +5966,7 @@ OUI:0050C27CD*
ID_OUI_FROM_DATABASE=Precision MicroControl Corporation
OUI:0050C27CE*
- ID_OUI_FROM_DATABASE=AirCell Inc.
+ ID_OUI_FROM_DATABASE=Aircell
OUI:0050C27CF*
ID_OUI_FROM_DATABASE=Emitech Corporation
@@ -6380,7 +6380,7 @@ OUI:0050C2859*
ID_OUI_FROM_DATABASE=Nuvation
OUI:0050C285A*
- ID_OUI_FROM_DATABASE=ART s.r.l.
+ ID_OUI_FROM_DATABASE=ART Spa
OUI:0050C285B*
ID_OUI_FROM_DATABASE=Boreste
@@ -6521,7 +6521,7 @@ OUI:0050C2888*
ID_OUI_FROM_DATABASE=IADEA CORPORATION
OUI:0050C2889*
- ID_OUI_FROM_DATABASE=ACS MOTION CONTROL
+ ID_OUI_FROM_DATABASE=ACS Motion Control Ltd.
OUI:0050C288A*
ID_OUI_FROM_DATABASE=Continental Electronics Corp.
@@ -7625,7 +7625,7 @@ OUI:0050C29F8*
ID_OUI_FROM_DATABASE=Austco Communication Systems Pty Ltd
OUI:0050C29F9*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Auto Eqip(Xiamen.China)
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C29FA*
ID_OUI_FROM_DATABASE=Teranex A Division of Silicon Optix
@@ -7676,7 +7676,7 @@ OUI:0050C2A09*
ID_OUI_FROM_DATABASE=Innovative American Technology
OUI:0050C2A0A*
- ID_OUI_FROM_DATABASE=ACD Elektronik Gmbh
+ ID_OUI_FROM_DATABASE=ACD Elektronik GmbH
OUI:0050C2A0B*
ID_OUI_FROM_DATABASE=I.D.S. Ingegneria Dei Sistemi S.p.A.
@@ -8372,7 +8372,7 @@ OUI:0050C2AF1*
ID_OUI_FROM_DATABASE=Green Goose
OUI:0050C2AF2*
- ID_OUI_FROM_DATABASE=ACD Elektronik Gmbh
+ ID_OUI_FROM_DATABASE=ACD Elektronik GmbH
OUI:0050C2AF3*
ID_OUI_FROM_DATABASE=Palomar Products, Inc.
@@ -8666,7 +8666,7 @@ OUI:0050C2B53*
ID_OUI_FROM_DATABASE=Prodco
OUI:0050C2B54*
- ID_OUI_FROM_DATABASE=APG Cash Drawer, LLC
+ ID_OUI_FROM_DATABASE=APG CASH DRAWER
OUI:0050C2B55*
ID_OUI_FROM_DATABASE=SANYO ELECTRONIC INDUSTRIES CO.,LTD
@@ -8849,7 +8849,7 @@ OUI:0050C2B91*
ID_OUI_FROM_DATABASE=Finnet-Service Ltd.
OUI:0050C2B92*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Auto Eqip(Xiamen.China)
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C2B93*
ID_OUI_FROM_DATABASE=EMC PARTNER AG
@@ -9203,7 +9203,7 @@ OUI:0050C2C09*
ID_OUI_FROM_DATABASE=Globe Wireless
OUI:0050C2C0A*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Auto Eqip(Xiamen.China)
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C2C0B*
ID_OUI_FROM_DATABASE=ProSourcing GmbH
@@ -9818,7 +9818,7 @@ OUI:0050C2CDB*
ID_OUI_FROM_DATABASE=RUTTER INC
OUI:0050C2CDC*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Auto Eqip(Xiamen.China)
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C2CDD*
ID_OUI_FROM_DATABASE=K.C.C. SHOKAI LIMITED
@@ -9890,7 +9890,7 @@ OUI:0050C2CF4*
ID_OUI_FROM_DATABASE=Baudisch Electronic GmbH
OUI:0050C2CF5*
- ID_OUI_FROM_DATABASE=AirCell Inc.
+ ID_OUI_FROM_DATABASE=Aircell
OUI:0050C2CF6*
ID_OUI_FROM_DATABASE=Epec Oy
@@ -10316,7 +10316,7 @@ OUI:0050C2D83*
ID_OUI_FROM_DATABASE=Blankom
OUI:0050C2D84*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Auto Eqip(Xiamen.China)
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C2D85*
ID_OUI_FROM_DATABASE=VITEC
@@ -10595,7 +10595,7 @@ OUI:0050C2DE0*
ID_OUI_FROM_DATABASE=INTERNET PROTOCOLO LOGICA SL
OUI:0050C2DE1*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Auto Eqip(Xiamen.China)
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C2DE2*
ID_OUI_FROM_DATABASE=SEQUTEC INC
@@ -11516,7 +11516,7 @@ OUI:0050C2F16*
ID_OUI_FROM_DATABASE=Peter Huber Kältemaschinenbau GmbH
OUI:0050C2F17*
- ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd
+ ID_OUI_FROM_DATABASE=ABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.
OUI:0050C2F18*
ID_OUI_FROM_DATABASE=Vitec Multimedia
@@ -12599,7 +12599,7 @@ OUI:40D855081*
ID_OUI_FROM_DATABASE=Sicon srl
OUI:40D855082*
- ID_OUI_FROM_DATABASE=ard sa
+ ID_OUI_FROM_DATABASE=ARD SA
OUI:40D855083*
ID_OUI_FROM_DATABASE=DELOPT
@@ -13061,7 +13061,7 @@ OUI:40D85511C*
ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
OUI:40D85511D*
- ID_OUI_FROM_DATABASE=ACD Elektronik GmBH
+ ID_OUI_FROM_DATABASE=ACD Elektronik GmbH
OUI:40D85511E*
ID_OUI_FROM_DATABASE=CEMSI, Inc.
@@ -17150,7 +17150,7 @@ OUI:00048C*
ID_OUI_FROM_DATABASE=Nayna Networks, Inc.
OUI:00048D*
- ID_OUI_FROM_DATABASE=Tone Commander Systems, Inc.
+ ID_OUI_FROM_DATABASE=Teo Technologies, Inc
OUI:00048E*
ID_OUI_FROM_DATABASE=Ohm Tech Labs, Inc.
@@ -24935,7 +24935,7 @@ OUI:000ED7*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
OUI:000ED8*
- ID_OUI_FROM_DATABASE=Aktino, Inc.
+ ID_OUI_FROM_DATABASE=Positron Access Solutions Corp
OUI:000ED9*
ID_OUI_FROM_DATABASE=Aksys, Ltd.
@@ -26846,7 +26846,7 @@ OUI:001156*
ID_OUI_FROM_DATABASE=Pharos Systems NZ
OUI:001157*
- ID_OUI_FROM_DATABASE=OF Networks Co., Ltd.
+ ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
OUI:001158*
ID_OUI_FROM_DATABASE=Nortel Networks
@@ -32654,7 +32654,7 @@ OUI:0018EA*
ID_OUI_FROM_DATABASE=Alltec GmbH
OUI:0018EB*
- ID_OUI_FROM_DATABASE=BroVis Wireless Networks
+ ID_OUI_FROM_DATABASE=Blue Zen Enterprises Private Limited
OUI:0018EC*
ID_OUI_FROM_DATABASE=Welding Technology Corporation
@@ -37544,7 +37544,7 @@ OUI:001F48*
ID_OUI_FROM_DATABASE=Mojix Inc.
OUI:001F49*
- ID_OUI_FROM_DATABASE=Eurosat Distribution Ltd
+ ID_OUI_FROM_DATABASE=Manhattan Technology Limited
OUI:001F4A*
ID_OUI_FROM_DATABASE=Albentia Systems S.A.
@@ -40382,7 +40382,7 @@ OUI:0022FD*
ID_OUI_FROM_DATABASE=Nokia Danmark A/S
OUI:0022FE*
- ID_OUI_FROM_DATABASE=Microprocessor Designs Inc
+ ID_OUI_FROM_DATABASE=Advanced Illumination
OUI:0022FF*
ID_OUI_FROM_DATABASE=iWDL Technologies
@@ -40838,7 +40838,7 @@ OUI:002397*
ID_OUI_FROM_DATABASE=Westell Technologies Inc.
OUI:002398*
- ID_OUI_FROM_DATABASE=Sky Control
+ ID_OUI_FROM_DATABASE=Vutlan sro
OUI:002399*
ID_OUI_FROM_DATABASE=VD Division, Samsung Electronics Co.
@@ -45221,7 +45221,7 @@ OUI:00501C*
ID_OUI_FROM_DATABASE=JATOM SYSTEMS, INC.
OUI:00501E*
- ID_OUI_FROM_DATABASE=Miranda Technologies, Inc.
+ ID_OUI_FROM_DATABASE=Grass Valley, A Belden Brand
OUI:00501F*
ID_OUI_FROM_DATABASE=MRG SYSTEMS, LTD.
@@ -48866,7 +48866,7 @@ OUI:00A0C4*
ID_OUI_FROM_DATABASE=CRISTIE ELECTRONICS LTD.
OUI:00A0C5*
- ID_OUI_FROM_DATABASE=ZYXEL COMMUNICATION
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
OUI:00A0C6*
ID_OUI_FROM_DATABASE=QUALCOMM INCORPORATED
@@ -49057,6 +49057,9 @@ OUI:00A2FF*
OUI:00A509*
ID_OUI_FROM_DATABASE=WigWag Inc.
+OUI:00A784*
+ ID_OUI_FROM_DATABASE=ITX security
+
OUI:00AA00*
ID_OUI_FROM_DATABASE=INTEL CORPORATION
@@ -49079,7 +49082,7 @@ OUI:00AEFA*
ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
OUI:00B009*
- ID_OUI_FROM_DATABASE=Grass Valley Group
+ ID_OUI_FROM_DATABASE=Grass Valley, A Belden Brand
OUI:00B017*
ID_OUI_FROM_DATABASE=InfoGear Technology Corp.
@@ -50291,7 +50294,7 @@ OUI:00D05B*
ID_OUI_FROM_DATABASE=ACROLOOP MOTION CONTROL
OUI:00D05C*
- ID_OUI_FROM_DATABASE=TECHNOTREND SYSTEMTECHNIK GMBH
+ ID_OUI_FROM_DATABASE=KATHREIN TechnoTrend GmbH
OUI:00D05D*
ID_OUI_FROM_DATABASE=INTELLIWORXX, INC.
@@ -50441,7 +50444,7 @@ OUI:00D08D*
ID_OUI_FROM_DATABASE=PHOENIX GROUP, INC.
OUI:00D08E*
- ID_OUI_FROM_DATABASE=NVISION INC.
+ ID_OUI_FROM_DATABASE=Grass Valley, A Belden Brand
OUI:00D08F*
ID_OUI_FROM_DATABASE=ARDENT TECHNOLOGIES, INC.
@@ -51679,6 +51682,9 @@ OUI:00FC58*
OUI:00FC70*
ID_OUI_FROM_DATABASE=Intrepid Control Systems, Inc.
+OUI:00FC8D*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+
OUI:00FD4C*
ID_OUI_FROM_DATABASE=NEVATEC
@@ -51838,6 +51844,9 @@ OUI:045D56*
OUI:045FA7*
ID_OUI_FROM_DATABASE=Shenzhen Yichen Technology Development Co.,LTD
+OUI:046169*
+ ID_OUI_FROM_DATABASE=MEDIA GLOBAL LINKS CO., LTD.
+
OUI:0462D7*
ID_OUI_FROM_DATABASE=ALSTOM HYDRO FRANCE
@@ -51952,6 +51961,9 @@ OUI:04C09C*
OUI:04C1B9*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd.
+OUI:04C23E*
+ ID_OUI_FROM_DATABASE=HTC Corporation
+
OUI:04C5A4*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
@@ -52582,6 +52594,9 @@ OUI:08379C*
OUI:0838A5*
ID_OUI_FROM_DATABASE=Funkwerk plettac electronic GmbH
+OUI:083A5C*
+ ID_OUI_FROM_DATABASE=Junilab, Inc.
+
OUI:083AB8*
ID_OUI_FROM_DATABASE=Shinoda Plasma Co., Ltd.
@@ -52654,6 +52669,9 @@ OUI:086DF2*
OUI:087045*
ID_OUI_FROM_DATABASE=Apple
+OUI:087402*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:0874F6*
ID_OUI_FROM_DATABASE=Winterhalter Gastronom GmbH
@@ -52705,6 +52723,9 @@ OUI:088E4F*
OUI:088F2C*
ID_OUI_FROM_DATABASE=Hills Sound Vision & Lighting
+OUI:0894EF*
+ ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
+
OUI:08952A*
ID_OUI_FROM_DATABASE=Technicolor CH USA Inc
@@ -52990,6 +53011,9 @@ OUI:0C74C2*
OUI:0C7523*
ID_OUI_FROM_DATABASE=BEIJING GEHUA CATV NETWORK CO.,LTD
+OUI:0C756C*
+ ID_OUI_FROM_DATABASE=Anaren Microwave, Inc.
+
OUI:0C771A*
ID_OUI_FROM_DATABASE=Apple
@@ -53032,6 +53056,9 @@ OUI:0C8CDC*
OUI:0C8D98*
ID_OUI_FROM_DATABASE=TOP EIGHT IND CORP
+OUI:0C9160*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+
OUI:0C924E*
ID_OUI_FROM_DATABASE=Rice Lake Weighing Systems
@@ -53173,6 +53200,9 @@ OUI:0CE5D3*
OUI:0CE709*
ID_OUI_FROM_DATABASE=Fox Crypto B.V.
+OUI:0CE725*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
OUI:0CE82F*
ID_OUI_FROM_DATABASE=Bonfiglioli Vectron GmbH
@@ -53212,6 +53242,9 @@ OUI:0CF893*
OUI:0CFC83*
ID_OUI_FROM_DATABASE=Airoha Technology Corp.,
+OUI:0CFE45*
+ ID_OUI_FROM_DATABASE=Sony Computer Entertainment Inc.
+
OUI:10005A*
ID_OUI_FROM_DATABASE=IBM Corp
@@ -53224,6 +53257,12 @@ OUI:1000FD*
OUI:1001CA*
ID_OUI_FROM_DATABASE=Ashley Butterworth
+OUI:1002B5*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:1005B1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
OUI:1005CA*
ID_OUI_FROM_DATABASE=Cisco
@@ -53432,11 +53471,14 @@ OUI:107A86*
ID_OUI_FROM_DATABASE=U&U ENGINEERING INC.
OUI:107BEF*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corp
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
OUI:1083D2*
ID_OUI_FROM_DATABASE=Microseven Systems, LLC
+OUI:10868C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
OUI:10880F*
ID_OUI_FROM_DATABASE=Daruma Telecomunicações e Informática S.A.
@@ -53554,6 +53596,9 @@ OUI:10DDF4*
OUI:10DEE4*
ID_OUI_FROM_DATABASE=automationNEXT GmbH
+OUI:10DF8B*
+ ID_OUI_FROM_DATABASE=Shenzhen CareDear Communication Technology Co.,Ltd
+
OUI:10E2D5*
ID_OUI_FROM_DATABASE=Qi Hardware Inc.
@@ -53701,6 +53746,9 @@ OUI:143DF2*
OUI:143E60*
ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:143EBF*
+ ID_OUI_FROM_DATABASE=zte corporation
+
OUI:144146*
ID_OUI_FROM_DATABASE=Honeywell (China) Co., LTD
@@ -53794,6 +53842,9 @@ OUI:148FC6*
OUI:149090*
ID_OUI_FROM_DATABASE=KongTop industrial(shen zhen)CO.,LTD
+OUI:149182*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
+
OUI:149448*
ID_OUI_FROM_DATABASE=BLU CASTLE S.A.
@@ -53830,6 +53881,9 @@ OUI:14B126*
OUI:14B1C8*
ID_OUI_FROM_DATABASE=InfiniWing, Inc.
+OUI:14B370*
+ ID_OUI_FROM_DATABASE=Gigaset Digital Technology (Shenzhen) Co., Ltd.
+
OUI:14B484*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
@@ -53875,6 +53929,9 @@ OUI:14DAE9*
OUI:14DB85*
ID_OUI_FROM_DATABASE=S NET MEDIA
+OUI:14DDA9*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
OUI:14E4EC*
ID_OUI_FROM_DATABASE=mLogic LLC
@@ -54058,6 +54115,9 @@ OUI:184A6F*
OUI:184E94*
ID_OUI_FROM_DATABASE=MESSOA TECHNOLOGIES INC.
+OUI:184F32*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+
OUI:185253*
ID_OUI_FROM_DATABASE=Pixord Corporation
@@ -54079,6 +54139,9 @@ OUI:185AE8*
OUI:185D9A*
ID_OUI_FROM_DATABASE=BobjGear LLC
+OUI:185E0F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:18622C*
ID_OUI_FROM_DATABASE=SAGEMCOM SAS
@@ -54151,12 +54214,21 @@ OUI:188796*
OUI:188857*
ID_OUI_FROM_DATABASE=Beijing Jinhong Xi-Dian Information Technology Corp.
+OUI:18895B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:1889DF*
ID_OUI_FROM_DATABASE=CerebrEX Inc.
+OUI:188B9D*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:188ED5*
ID_OUI_FROM_DATABASE=TP Vision Belgium N.V. - innovation site Brugge
+OUI:188EF9*
+ ID_OUI_FROM_DATABASE=G2C Co. Ltd.
+
OUI:18922C*
ID_OUI_FROM_DATABASE=Virtual Instruments
@@ -54391,6 +54463,9 @@ OUI:1C3DE7*
OUI:1C3E84*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:1C4024*
+ ID_OUI_FROM_DATABASE=Dell Inc
+
OUI:1C4158*
ID_OUI_FROM_DATABASE=Gemalto M2M GmbH
@@ -54424,6 +54499,9 @@ OUI:1C5216*
OUI:1C52D6*
ID_OUI_FROM_DATABASE=FLAT DISPLAY TECHNOLOGY CORPORATION
+OUI:1C56FE*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
OUI:1C5A3E*
ID_OUI_FROM_DATABASE=Samsung Eletronics Co., Ltd (Visual Display Divison)
@@ -54784,6 +54862,9 @@ OUI:2053CA*
OUI:205476*
ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:205531*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:205721*
ID_OUI_FROM_DATABASE=Salix Technology CO., Ltd.
@@ -54802,6 +54883,9 @@ OUI:205CFA*
OUI:206274*
ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:20635F*
+ ID_OUI_FROM_DATABASE=Abeeway
+
OUI:206432*
ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO.,LTD.
@@ -54835,6 +54919,9 @@ OUI:207600*
OUI:207693*
ID_OUI_FROM_DATABASE=Lenovo (Beijing) Limited.
+OUI:2078F0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:207C8F*
ID_OUI_FROM_DATABASE=Quanta Microsystems,Inc.
@@ -54997,6 +55084,12 @@ OUI:20F002*
OUI:20F3A3*
ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
+OUI:20F41B*
+ ID_OUI_FROM_DATABASE=Shenzhen Bilian electronic CO.,LTD
+
+OUI:20F510*
+ ID_OUI_FROM_DATABASE=Codex Digital Limited
+
OUI:20F85E*
ID_OUI_FROM_DATABASE=Delta Electronics
@@ -55105,6 +55198,9 @@ OUI:244B81*
OUI:244F1D*
ID_OUI_FROM_DATABASE=iRule LLC
+OUI:245BF0*
+ ID_OUI_FROM_DATABASE=Liteon, Inc.
+
OUI:245FDF*
ID_OUI_FROM_DATABASE=KYOCERA Corporation
@@ -55129,9 +55225,15 @@ OUI:2469A5*
OUI:246AAB*
ID_OUI_FROM_DATABASE=IT-IS International
+OUI:246E96*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
OUI:247189*
ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:247260*
+ ID_OUI_FROM_DATABASE=IOTTECH Corp
+
OUI:247656*
ID_OUI_FROM_DATABASE=Shanghai Net Miles Fiber Optics Technology Co., LTD.
@@ -55366,6 +55468,9 @@ OUI:282246*
OUI:2826A6*
ID_OUI_FROM_DATABASE=PBR electronics GmbH
+OUI:2827BF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:28285D*
ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
@@ -55390,6 +55495,9 @@ OUI:283410*
OUI:2834A2*
ID_OUI_FROM_DATABASE=Cisco
+OUI:283713*
+ ID_OUI_FROM_DATABASE=Shenzhen 3Nod Digital Technology Co., Ltd.
+
OUI:283737*
ID_OUI_FROM_DATABASE=Apple
@@ -55558,6 +55666,9 @@ OUI:28B2BD*
OUI:28B3AB*
ID_OUI_FROM_DATABASE=Genmark Automation
+OUI:28B9D9*
+ ID_OUI_FROM_DATABASE=Radisys Corporation
+
OUI:28BA18*
ID_OUI_FROM_DATABASE=NextNav, LLC
@@ -55678,6 +55789,9 @@ OUI:28ED58*
OUI:28EE2C*
ID_OUI_FROM_DATABASE=Frontline Test Equipment
+OUI:28F076*
+ ID_OUI_FROM_DATABASE=Apple
+
OUI:28F358*
ID_OUI_FROM_DATABASE=2C - Trifonov & Co
@@ -55936,6 +56050,9 @@ OUI:2CA2B4*
OUI:2CA30E*
ID_OUI_FROM_DATABASE=POWER DRAGON DEVELOPMENT LIMITED
+OUI:2CA539*
+ ID_OUI_FROM_DATABASE=Parallel Wireless, Inc
+
OUI:2CA780*
ID_OUI_FROM_DATABASE=True Technologies Inc.
@@ -55975,6 +56092,12 @@ OUI:2CBE97*
OUI:2CC260*
ID_OUI_FROM_DATABASE=Ravello Systems
+OUI:2CC548*
+ ID_OUI_FROM_DATABASE=IAdea Corporation
+
+OUI:2CC5D3*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
OUI:2CCC15*
ID_OUI_FROM_DATABASE=Nokia Corporation
@@ -56038,15 +56161,24 @@ OUI:2CF7F1*
OUI:2CFAA2*
ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:2CFCE4*
+ ID_OUI_FROM_DATABASE=CTEK Sweden AB
+
OUI:30055C*
ID_OUI_FROM_DATABASE=Brother industries, LTD.
OUI:300B9C*
ID_OUI_FROM_DATABASE=Delta Mobile Systems, Inc.
+OUI:300C23*
+ ID_OUI_FROM_DATABASE=zte corporation
+
OUI:300D2A*
ID_OUI_FROM_DATABASE=Zhejiang Wellcom Technology Co.,Ltd.
+OUI:300D43*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+
OUI:300ED5*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind.Co.Ltd
@@ -56131,6 +56263,9 @@ OUI:304225*
OUI:304449*
ID_OUI_FROM_DATABASE=PLATH GmbH
+OUI:304487*
+ ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
+
OUI:30469A*
ID_OUI_FROM_DATABASE=NETGEAR
@@ -56212,6 +56347,12 @@ OUI:3078C2*
OUI:307C30*
ID_OUI_FROM_DATABASE=RIM
+OUI:307C5E*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
+OUI:307CB2*
+ ID_OUI_FROM_DATABASE=ANOV FRANCE
+
OUI:307ECB*
ID_OUI_FROM_DATABASE=SFR
@@ -56225,11 +56366,14 @@ OUI:308999*
ID_OUI_FROM_DATABASE=Guangdong East Power Co.,
OUI:3089D3*
- ID_OUI_FROM_DATABASE=Shenzhen ucloudlink new technology co.,LTD
+ ID_OUI_FROM_DATABASE=HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED
OUI:308CFB*
ID_OUI_FROM_DATABASE=Dropcam
+OUI:308D99*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
OUI:3090AB*
ID_OUI_FROM_DATABASE=Apple
@@ -56242,6 +56386,9 @@ OUI:3092F6*
OUI:309BAD*
ID_OUI_FROM_DATABASE=BBK Electronics Corp., Ltd.,
+OUI:30A243*
+ ID_OUI_FROM_DATABASE=Shenzhen Prifox Innovation Technology Co., Ltd.
+
OUI:30A8DB*
ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
@@ -56281,6 +56428,9 @@ OUI:30CDA7*
OUI:30D17E*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:30D32D*
+ ID_OUI_FROM_DATABASE=devolo AG
+
OUI:30D357*
ID_OUI_FROM_DATABASE=Logosol, Inc.
@@ -56338,6 +56488,9 @@ OUI:30FAB7*
OUI:30FD11*
ID_OUI_FROM_DATABASE=MACROTECH (USA) INC.
+OUI:30FFF6*
+ ID_OUI_FROM_DATABASE=HangZhou KuoHeng Technology Co.,ltd
+
OUI:3400A3*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -56362,6 +56515,9 @@ OUI:340AFF*
OUI:340B40*
ID_OUI_FROM_DATABASE=MIOS ELETTRONICA SRL
+OUI:340CED*
+ ID_OUI_FROM_DATABASE=Moduel AB
+
OUI:341298*
ID_OUI_FROM_DATABASE=Apple
@@ -56395,6 +56551,9 @@ OUI:3423BA*
OUI:34255D*
ID_OUI_FROM_DATABASE=Shenzhen Loadcom Technology Co.,Ltd
+OUI:342606*
+ ID_OUI_FROM_DATABASE=CarePredict, Inc.
+
OUI:3428F0*
ID_OUI_FROM_DATABASE=ATN International Limited
@@ -56509,12 +56668,18 @@ OUI:347A60*
OUI:347E39*
ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:3480B3*
+ ID_OUI_FROM_DATABASE=XIAOMI INC
+
OUI:348137*
ID_OUI_FROM_DATABASE=UNICARD SA
OUI:3481C4*
ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:3481F4*
+ ID_OUI_FROM_DATABASE=SST Taiwan Ltd.
+
OUI:3482DE*
ID_OUI_FROM_DATABASE=Kayo Technology, Inc.
@@ -56746,6 +56911,9 @@ OUI:34FC6F*
OUI:34FCEF*
ID_OUI_FROM_DATABASE=LG Electronics
+OUI:380195*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:380197*
ID_OUI_FROM_DATABASE=Toshiba Samsung Storage Technolgoy Korea Corporation
@@ -56809,12 +56977,18 @@ OUI:3826CD*
OUI:3828EA*
ID_OUI_FROM_DATABASE=Fujian Netcom Technology Co., LTD
+OUI:382B78*
+ ID_OUI_FROM_DATABASE=ECO PLUGS ENTERPRISE CO., LTD
+
OUI:382C4A*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
OUI:382DD1*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:382DE8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:3831AC*
ID_OUI_FROM_DATABASE=WEG
@@ -56947,6 +57121,9 @@ OUI:38B1DB*
OUI:38B5BD*
ID_OUI_FROM_DATABASE=E.G.O. Elektro-Ger
+OUI:38B725*
+ ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
+
OUI:38B74D*
ID_OUI_FROM_DATABASE=Fijowave Limited
@@ -56977,6 +57154,9 @@ OUI:38C7BA*
OUI:38C85C*
ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:38C986*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:38C9A9*
ID_OUI_FROM_DATABASE=SMART High Reliability Solutions, Inc.
@@ -57019,6 +57199,9 @@ OUI:38EC11*
OUI:38ECE4*
ID_OUI_FROM_DATABASE=Samsung Electronics
+OUI:38ED18*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:38EE9D*
ID_OUI_FROM_DATABASE=Anedo Ltd.
@@ -57142,6 +57325,9 @@ OUI:3C2F3A*
OUI:3C300C*
ID_OUI_FROM_DATABASE=Dewar Electronics Pty Ltd
+OUI:3C3178*
+ ID_OUI_FROM_DATABASE=Qolsys Inc.
+
OUI:3C363D*
ID_OUI_FROM_DATABASE=Nokia Corporation
@@ -57196,6 +57382,9 @@ OUI:3C5A37*
OUI:3C5AB4*
ID_OUI_FROM_DATABASE=Google
+OUI:3C5CC3*
+ ID_OUI_FROM_DATABASE=Shenzhen First Blue Chip Technology Ltd
+
OUI:3C5EC3*
ID_OUI_FROM_DATABASE=Cisco
@@ -57517,6 +57706,9 @@ OUI:403004*
OUI:403067*
ID_OUI_FROM_DATABASE=Conlog (Pty) Ltd
+OUI:40331A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:40336C*
ID_OUI_FROM_DATABASE=Godrej & Boyce Mfg. co. ltd
@@ -57565,6 +57757,9 @@ OUI:40560C*
OUI:405A9B*
ID_OUI_FROM_DATABASE=ANOVO
+OUI:405D82*
+ ID_OUI_FROM_DATABASE=Netgear
+
OUI:405FBE*
ID_OUI_FROM_DATABASE=RIM
@@ -57904,6 +58099,9 @@ OUI:444A65*
OUI:444C0C*
ID_OUI_FROM_DATABASE=Apple
+OUI:444CA8*
+ ID_OUI_FROM_DATABASE=Arista Networks
+
OUI:444E1A*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
@@ -57940,12 +58138,18 @@ OUI:445EF3*
OUI:445F7A*
ID_OUI_FROM_DATABASE=Shihlin Electric & Engineering Corp.
+OUI:445F8C*
+ ID_OUI_FROM_DATABASE=Intercel Group Limited
+
OUI:446132*
ID_OUI_FROM_DATABASE=ecobee inc
OUI:44619C*
ID_OUI_FROM_DATABASE=FONsystem co. ltd.
+OUI:44656A*
+ ID_OUI_FROM_DATABASE=Mega Video Electronic(HK) Industry Co., Ltd
+
OUI:44666E*
ID_OUI_FROM_DATABASE=IP-LINE
@@ -58030,6 +58234,9 @@ OUI:4495FA*
OUI:44962B*
ID_OUI_FROM_DATABASE=Aidon Oy
+OUI:44975A*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+
OUI:449B78*
ID_OUI_FROM_DATABASE=The Now Factory
@@ -58165,6 +58372,9 @@ OUI:44F849*
OUI:44FB42*
ID_OUI_FROM_DATABASE=Apple
+OUI:44FDA3*
+ ID_OUI_FROM_DATABASE=Everysight LTD.
+
OUI:48022A*
ID_OUI_FROM_DATABASE=B-Link Electronic Limited
@@ -58216,6 +58426,9 @@ OUI:4833DD*
OUI:48343D*
ID_OUI_FROM_DATABASE=IEP GmbH
+OUI:483974*
+ ID_OUI_FROM_DATABASE=Proware Technologies Co., Ltd.
+
OUI:483D32*
ID_OUI_FROM_DATABASE=Syscor Controls &amp; Automation
@@ -58228,6 +58441,9 @@ OUI:484487*
OUI:4844F7*
ID_OUI_FROM_DATABASE=Samsung Electronics Co., LTD
+OUI:484520*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:4846F1*
ID_OUI_FROM_DATABASE=Uros Oy
@@ -58264,6 +58480,9 @@ OUI:485AB6*
OUI:485B39*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:485D36*
+ ID_OUI_FROM_DATABASE=Verizon
+
OUI:485D60*
ID_OUI_FROM_DATABASE=Azurewave Technologies, Inc.
@@ -58402,6 +58621,9 @@ OUI:48DF1C*
OUI:48E1AF*
ID_OUI_FROM_DATABASE=Vity
+OUI:48E244*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+
OUI:48E9F1*
ID_OUI_FROM_DATABASE=Apple
@@ -58537,6 +58759,9 @@ OUI:4C322D*
OUI:4C32D9*
ID_OUI_FROM_DATABASE=M Rutty Holdings Pty. Ltd.
+OUI:4C3488*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:4C3909*
ID_OUI_FROM_DATABASE=HPL Electric & Power Private Limited
@@ -58670,7 +58895,7 @@ OUI:4C9EE4*
ID_OUI_FROM_DATABASE=Hanyang Navicom Co.,Ltd.
OUI:4C9EFF*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corp
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
OUI:4CA515*
ID_OUI_FROM_DATABASE=Baikal Electronics JSC
@@ -58693,6 +58918,9 @@ OUI:4CAB33*
OUI:4CAC0A*
ID_OUI_FROM_DATABASE=ZTE Corporation
+OUI:4CAE31*
+ ID_OUI_FROM_DATABASE=ShengHai Electronics (Shenzhen) Ltd
+
OUI:4CB16C*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -58708,6 +58936,9 @@ OUI:4CB76D*
OUI:4CB81C*
ID_OUI_FROM_DATABASE=SAM Electronics GmbH
+OUI:4CB82C*
+ ID_OUI_FROM_DATABASE=Cambridge Mobile Telematics, Inc.
+
OUI:4CB9C8*
ID_OUI_FROM_DATABASE=CONET CO., LTD.
@@ -58729,6 +58960,9 @@ OUI:4CC452*
OUI:4CC602*
ID_OUI_FROM_DATABASE=Radios, Inc.
+OUI:4CC681*
+ ID_OUI_FROM_DATABASE=Shenzhen Aisat Electronic Co., Ltd.
+
OUI:4CC94F*
ID_OUI_FROM_DATABASE=Alcatel-Lucent
@@ -58819,6 +59053,9 @@ OUI:5014B5*
OUI:5017FF*
ID_OUI_FROM_DATABASE=Cisco
+OUI:501AA5*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
+
OUI:501AC5*
ID_OUI_FROM_DATABASE=Microsoft
@@ -58864,6 +59101,9 @@ OUI:502E5C*
OUI:502ECE*
ID_OUI_FROM_DATABASE=Asahi Electronics Co.,Ltd
+OUI:5031AD*
+ ID_OUI_FROM_DATABASE=ABB Global Industries and Services Private Limited
+
OUI:503275*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
@@ -58879,6 +59119,9 @@ OUI:503DE5*
OUI:503F56*
ID_OUI_FROM_DATABASE=Syncmold Enterprise Corp
+OUI:5045F7*
+ ID_OUI_FROM_DATABASE=Liuhe Intelligence Technology Ltd.
+
OUI:50465D*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
@@ -58948,6 +59191,9 @@ OUI:5067AE*
OUI:5067F0*
ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:506A03*
+ ID_OUI_FROM_DATABASE=Netgear
+
OUI:506F9A*
ID_OUI_FROM_DATABASE=Wi-Fi Alliance
@@ -58969,6 +59215,12 @@ OUI:5076A6*
OUI:50795B*
ID_OUI_FROM_DATABASE=Interexport Telecomunicaciones S.A.
+OUI:507A55*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:507B9D*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
+
OUI:507D02*
ID_OUI_FROM_DATABASE=BIODIT
@@ -59201,7 +59453,7 @@ OUI:5435DF*
ID_OUI_FROM_DATABASE=Symeo GmbH
OUI:54369B*
- ID_OUI_FROM_DATABASE=In one network technology (Beijing) Co., Ltd.
+ ID_OUI_FROM_DATABASE=1Verge Internet Technology (Beijing) Co., Ltd.
OUI:543968*
ID_OUI_FROM_DATABASE=Edgewater Networks Inc
@@ -59248,12 +59500,18 @@ OUI:545EBD*
OUI:545FA9*
ID_OUI_FROM_DATABASE=Teracom Limited
+OUI:546009*
+ ID_OUI_FROM_DATABASE=Google Inc
+
OUI:546172*
ID_OUI_FROM_DATABASE=ZODIAC AEROSPACE SAS
OUI:5461EA*
ID_OUI_FROM_DATABASE=Zaplox AB
+OUI:5464D9*
+ ID_OUI_FROM_DATABASE=Sagemcom SAS
+
OUI:5465DE*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
@@ -59311,6 +59569,9 @@ OUI:549359*
OUI:549478*
ID_OUI_FROM_DATABASE=Silvershore Technology Partners
+OUI:549A11*
+ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
+
OUI:549A16*
ID_OUI_FROM_DATABASE=Uzushio Electric Co.,Ltd.
@@ -59332,6 +59593,9 @@ OUI:54A04F*
OUI:54A050*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:54A274*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:54A31B*
ID_OUI_FROM_DATABASE=Shenzhen Linkworld Technology Co,.LTD
@@ -59497,6 +59761,9 @@ OUI:581FAA*
OUI:581FEF*
ID_OUI_FROM_DATABASE=Tuttnaer LTD
+OUI:5820B1*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
OUI:582136*
ID_OUI_FROM_DATABASE=KMB systems, s.r.o.
@@ -59536,6 +59803,9 @@ OUI:5846E1*
OUI:584704*
ID_OUI_FROM_DATABASE=Shenzhen Webridge Technology Co.,Ltd
+OUI:584822*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
OUI:5848C0*
ID_OUI_FROM_DATABASE=COFLEC
@@ -59560,6 +59830,9 @@ OUI:5850AB*
OUI:5850E6*
ID_OUI_FROM_DATABASE=Best Buy Corporation
+OUI:5853C0*
+ ID_OUI_FROM_DATABASE=Beijing Guang Runtong Technology Development Company co.,Ltd
+
OUI:5855CA*
ID_OUI_FROM_DATABASE=Apple
@@ -59569,6 +59842,9 @@ OUI:5856E8*
OUI:58570D*
ID_OUI_FROM_DATABASE=Danfoss Solar Inverters
+OUI:586356*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
+
OUI:58639A*
ID_OUI_FROM_DATABASE=TPL SYSTEMES
@@ -59752,6 +60028,9 @@ OUI:58ECE1*
OUI:58EECE*
ID_OUI_FROM_DATABASE=Icon Time Systems
+OUI:58F102*
+ ID_OUI_FROM_DATABASE=BLU Products Inc.
+
OUI:58F387*
ID_OUI_FROM_DATABASE=HCCP
@@ -59893,6 +60172,9 @@ OUI:5C5015*
OUI:5C514F*
ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:5C5188*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
OUI:5C56ED*
ID_OUI_FROM_DATABASE=3pleplay Electronics Private Limited
@@ -60110,7 +60392,7 @@ OUI:5CF3FC*
ID_OUI_FROM_DATABASE=IBM Corp
OUI:5CF4AB*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corp
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
OUI:5CF50D*
ID_OUI_FROM_DATABASE=Institute of microelectronic applications
@@ -60295,6 +60577,9 @@ OUI:606BBD*
OUI:606C66*
ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:606DC7*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+
OUI:60735C*
ID_OUI_FROM_DATABASE=Cisco
@@ -60514,6 +60799,9 @@ OUI:60FACD*
OUI:60FB42*
ID_OUI_FROM_DATABASE=Apple
+OUI:60FD56*
+ ID_OUI_FROM_DATABASE=WOORISYSTEMS CO., Ltd
+
OUI:60FE1E*
ID_OUI_FROM_DATABASE=China Palms Telecom.Ltd
@@ -60532,6 +60820,9 @@ OUI:60FFDD*
OUI:64002D*
ID_OUI_FROM_DATABASE=Powerlinq Co., LTD
+OUI:64006A*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
OUI:6400F1*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
@@ -60547,6 +60838,9 @@ OUI:640980*
OUI:640B4A*
ID_OUI_FROM_DATABASE=Digital Telecom Technology Limited
+OUI:640DE6*
+ ID_OUI_FROM_DATABASE=Petra Systems
+
OUI:640E36*
ID_OUI_FROM_DATABASE=TAZTAG
@@ -61021,6 +61315,9 @@ OUI:683B1E*
OUI:683C7D*
ID_OUI_FROM_DATABASE=Magic Intelligence Technology Limited
+OUI:683E34*
+ ID_OUI_FROM_DATABASE=Meizu Technology Co., LTD
+
OUI:683EEC*
ID_OUI_FROM_DATABASE=ERECA
@@ -61129,6 +61426,9 @@ OUI:6886E7*
OUI:68876B*
ID_OUI_FROM_DATABASE=INQ Mobile Limited
+OUI:6889C1*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:688AB5*
ID_OUI_FROM_DATABASE=EDP Servicos
@@ -61153,6 +61453,9 @@ OUI:6897E8*
OUI:6899CD*
ID_OUI_FROM_DATABASE=Cisco
+OUI:689AB7*
+ ID_OUI_FROM_DATABASE=Atelier Vision Corporation
+
OUI:689C5E*
ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
@@ -61273,6 +61576,9 @@ OUI:68EC62*
OUI:68ED43*
ID_OUI_FROM_DATABASE=Research In Motion
+OUI:68EDA4*
+ ID_OUI_FROM_DATABASE=Shenzhen Seavo Technology Co.,Ltd
+
OUI:68EE96*
ID_OUI_FROM_DATABASE=Cisco SPVTG
@@ -61456,6 +61762,9 @@ OUI:6C709F*
OUI:6C71D9*
ID_OUI_FROM_DATABASE=AzureWave Technologies, Inc
+OUI:6C7220*
+ ID_OUI_FROM_DATABASE=D-Link International
+
OUI:6C7660*
ID_OUI_FROM_DATABASE=KYOCERA Corporation
@@ -61708,6 +62017,9 @@ OUI:702526*
OUI:702559*
ID_OUI_FROM_DATABASE=CyberTAN Technology, Inc.
+OUI:702A7D*
+ ID_OUI_FROM_DATABASE=EpSpot AB
+
OUI:702B1D*
ID_OUI_FROM_DATABASE=E-Domus International Limited
@@ -61999,6 +62311,9 @@ OUI:70D6B6*
OUI:70D880*
ID_OUI_FROM_DATABASE=Upos System sp. z o.o.
+OUI:70D931*
+ ID_OUI_FROM_DATABASE=Cambridge Industries Group Co Ltd.
+
OUI:70DA9C*
ID_OUI_FROM_DATABASE=TECSEN
@@ -62026,6 +62341,9 @@ OUI:70E72C*
OUI:70E843*
ID_OUI_FROM_DATABASE=Beijing C&W Optical Communication Technology Co.,Ltd.
+OUI:70ECE4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:70EE50*
ID_OUI_FROM_DATABASE=Netatmo
@@ -62083,6 +62401,9 @@ OUI:7419F8*
OUI:741E93*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd.
+OUI:741F4A*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+
OUI:74258A*
ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
@@ -62197,6 +62518,9 @@ OUI:746F3D*
OUI:7472F2*
ID_OUI_FROM_DATABASE=Chipsip Technology Co., Ltd.
+OUI:747336*
+ ID_OUI_FROM_DATABASE=MICRODIGTAL Inc
+
OUI:747548*
ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
@@ -62422,6 +62746,9 @@ OUI:74F726*
OUI:74F85D*
ID_OUI_FROM_DATABASE=Berkeley Nucleonics Corp
+OUI:74F8DB*
+ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
+
OUI:74FDA0*
ID_OUI_FROM_DATABASE=Compupal (Group) Corporation
@@ -62437,6 +62764,9 @@ OUI:78028F*
OUI:780738*
ID_OUI_FROM_DATABASE=Z.U.K. Elzab S.A.
+OUI:780CB8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:781185*
ID_OUI_FROM_DATABASE=NBS Payment Solutions Inc.
@@ -62620,6 +62950,9 @@ OUI:788C54*
OUI:788DF7*
ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:788E33*
+ ID_OUI_FROM_DATABASE=Jiangsu SEUIC Technology Co.,Ltd
+
OUI:78923E*
ID_OUI_FROM_DATABASE=Nokia Corporation
@@ -62737,6 +63070,9 @@ OUI:78BEB6*
OUI:78BEBD*
ID_OUI_FROM_DATABASE=STULZ GmbH
+OUI:78C2C0*
+ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
+
OUI:78C40E*
ID_OUI_FROM_DATABASE=H&D Wireless
@@ -62788,6 +63124,9 @@ OUI:78D6F0*
OUI:78D752*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:78D75F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:78D99F*
ID_OUI_FROM_DATABASE=NuCom HK Ltd.
@@ -62824,6 +63163,9 @@ OUI:78E980*
OUI:78EB14*
ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:78EB39*
+ ID_OUI_FROM_DATABASE=Instituto Nacional de Tecnología Industrial
+
OUI:78EC22*
ID_OUI_FROM_DATABASE=Shanghai Qihui Telecom Technology Co., LTD
@@ -62893,6 +63235,9 @@ OUI:7C092B*
OUI:7C0A50*
ID_OUI_FROM_DATABASE=J-MEX Inc.
+OUI:7C0BC6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:7C0ECE*
ID_OUI_FROM_DATABASE=Cisco
@@ -62932,6 +63277,9 @@ OUI:7C2064*
OUI:7C2587*
ID_OUI_FROM_DATABASE=chaowifi.com
+OUI:7C2BE1*
+ ID_OUI_FROM_DATABASE=Shenzhen Ferex Electrical Co.,Ltd
+
OUI:7C2CF3*
ID_OUI_FROM_DATABASE=Secure Electrans Ltd
@@ -63091,12 +63439,21 @@ OUI:7C9A9B*
OUI:7CA15D*
ID_OUI_FROM_DATABASE=GN ReSound A/S
+OUI:7CA237*
+ ID_OUI_FROM_DATABASE=King Slide Technology CO., LTD.
+
+OUI:7CA23E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:7CA29B*
ID_OUI_FROM_DATABASE=D.SignT GmbH & Co. KG
OUI:7CA61D*
ID_OUI_FROM_DATABASE=MHL, LLC
+OUI:7CAB25*
+ ID_OUI_FROM_DATABASE=MESMO TECHNOLOGY INC.
+
OUI:7CACB2*
ID_OUI_FROM_DATABASE=Bosch Software Innovations GmbH
@@ -63115,6 +63472,9 @@ OUI:7CB21B*
OUI:7CB232*
ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+OUI:7CB25C*
+ ID_OUI_FROM_DATABASE=Acacia Communications
+
OUI:7CB542*
ID_OUI_FROM_DATABASE=ACES Technology
@@ -63157,6 +63517,9 @@ OUI:7CC8D0*
OUI:7CC8D7*
ID_OUI_FROM_DATABASE=Damalisk
+OUI:7CC95A*
+ ID_OUI_FROM_DATABASE=EMC
+
OUI:7CCB0D*
ID_OUI_FROM_DATABASE=Antaira Technologies, LLC
@@ -63256,6 +63619,9 @@ OUI:7CFE28*
OUI:7CFE4E*
ID_OUI_FROM_DATABASE=Shenzhen Safe vision Technology Co.,LTD
+OUI:7CFE90*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+
OUI:7CFF62*
ID_OUI_FROM_DATABASE=Huizhou Super Electron Technology Co.,Ltd.
@@ -63283,6 +63649,9 @@ OUI:800902*
OUI:800A06*
ID_OUI_FROM_DATABASE=COMTEC co.,ltd
+OUI:800B51*
+ ID_OUI_FROM_DATABASE=Chengdu XGimi Technology Co.,Ltd
+
OUI:800E24*
ID_OUI_FROM_DATABASE=ForgetBox
@@ -63436,6 +63805,9 @@ OUI:80711F*
OUI:80717A*
ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
+OUI:80739F*
+ ID_OUI_FROM_DATABASE=KYOCERA Corporation
+
OUI:807459*
ID_OUI_FROM_DATABASE=K's Co.,Ltd.
@@ -63451,6 +63823,9 @@ OUI:807A7F*
OUI:807B1E*
ID_OUI_FROM_DATABASE=Corsair Components
+OUI:807B85*
+ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
+
OUI:807D1B*
ID_OUI_FROM_DATABASE=Neosystem Co. Ltd.
@@ -63502,6 +63877,9 @@ OUI:80971B*
OUI:809B20*
ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:809FAB*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:80A1D7*
ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
@@ -63544,6 +63922,9 @@ OUI:80BE05*
OUI:80C16E*
ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:80C5E6*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
OUI:80C63F*
ID_OUI_FROM_DATABASE=Remec Broadband Wireless , LLC
@@ -63583,18 +63964,27 @@ OUI:80D733*
OUI:80DB31*
ID_OUI_FROM_DATABASE=Power Quotient International Co., Ltd.
+OUI:80E01D*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:80E4DA*
ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
OUI:80E650*
ID_OUI_FROM_DATABASE=Apple
+OUI:80EA23*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corp.
+
OUI:80EA96*
ID_OUI_FROM_DATABASE=Apple
OUI:80EACA*
ID_OUI_FROM_DATABASE=Dialog Semiconductor Hellas SA
+OUI:80EB77*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
+
OUI:80EE73*
ID_OUI_FROM_DATABASE=Shuttle Inc.
@@ -63763,6 +64153,9 @@ OUI:84569C*
OUI:845787*
ID_OUI_FROM_DATABASE=DVR C&C Co., Ltd.
+OUI:845B12*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:845C93*
ID_OUI_FROM_DATABASE=Chabrier Services
@@ -63805,6 +64198,9 @@ OUI:84788B*
OUI:8478AC*
ID_OUI_FROM_DATABASE=Cisco
+OUI:847973*
+ ID_OUI_FROM_DATABASE=Shanghai Baud Data Communication Co.,Ltd.
+
OUI:847A88*
ID_OUI_FROM_DATABASE=HTC Corporation
@@ -63901,6 +64297,9 @@ OUI:84AF1F*
OUI:84B153*
ID_OUI_FROM_DATABASE=Apple
+OUI:84B517*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:84B59C*
ID_OUI_FROM_DATABASE=Juniper networks
@@ -63931,6 +64330,9 @@ OUI:84CFBF*
OUI:84D32A*
ID_OUI_FROM_DATABASE=IEEE 1905.1
+OUI:84D4C8*
+ ID_OUI_FROM_DATABASE=Widex A/S
+
OUI:84D9C8*
ID_OUI_FROM_DATABASE=Unipattern Co.,
@@ -63940,6 +64342,9 @@ OUI:84DB2F*
OUI:84DBAC*
ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
+OUI:84DBFC*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
+
OUI:84DD20*
ID_OUI_FROM_DATABASE=Texas Instruments
@@ -64114,6 +64519,9 @@ OUI:885BDD*
OUI:885C47*
ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:885D90*
+ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
+
OUI:88615A*
ID_OUI_FROM_DATABASE=Siano Mobile Silicon Ltd.
@@ -64258,6 +64666,9 @@ OUI:88C9D0*
OUI:88CB87*
ID_OUI_FROM_DATABASE=Apple
+OUI:88CBA5*
+ ID_OUI_FROM_DATABASE=Suzhou Torchstar Intelligent Technology Co.,Ltd
+
OUI:88CEFA*
ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
@@ -65020,6 +65431,9 @@ OUI:90D7EB*
OUI:90D852*
ID_OUI_FROM_DATABASE=Comtec Co., Ltd.
+OUI:90D8F3*
+ ID_OUI_FROM_DATABASE=zte corporation
+
OUI:90D92C*
ID_OUI_FROM_DATABASE=HUG-WITSCHI AG
@@ -65101,6 +65515,9 @@ OUI:94049C*
OUI:9405B6*
ID_OUI_FROM_DATABASE=Liling FullRiver Electronics & Technology Ltd
+OUI:940937*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+
OUI:940B2D*
ID_OUI_FROM_DATABASE=NetView Technologies(Shenzhen) Co., Ltd
@@ -65203,6 +65620,9 @@ OUI:946269*
OUI:9463D1*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:94659C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:9470D2*
ID_OUI_FROM_DATABASE=WINFIRM TECHNOLOGY
@@ -65257,6 +65677,9 @@ OUI:949BFD*
OUI:949C55*
ID_OUI_FROM_DATABASE=Alta Data Technologies
+OUI:949F3E*
+ ID_OUI_FROM_DATABASE=Sonos, Inc.
+
OUI:949F3F*
ID_OUI_FROM_DATABASE=Optek Digital Technology company limited
@@ -65359,6 +65782,9 @@ OUI:94D723*
OUI:94D771*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:94D859*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
+
OUI:94D93C*
ID_OUI_FROM_DATABASE=ENELPS
@@ -65419,6 +65845,9 @@ OUI:94F665*
OUI:94F692*
ID_OUI_FROM_DATABASE=Geminico co.,Ltd.
+OUI:94F6A3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:94F720*
ID_OUI_FROM_DATABASE=Tianjin Deviser Electronics Instrument Co., Ltd
@@ -65578,6 +66007,9 @@ OUI:986CF5*
OUI:986DC8*
ID_OUI_FROM_DATABASE=TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION
+OUI:9870E8*
+ ID_OUI_FROM_DATABASE=INNATECH SDN BHD
+
OUI:9873C4*
ID_OUI_FROM_DATABASE=Sage Electronic Engineering LLC
@@ -65659,6 +66091,9 @@ OUI:98C0EB*
OUI:98C845*
ID_OUI_FROM_DATABASE=PacketAccess
+OUI:98CB27*
+ ID_OUI_FROM_DATABASE=Galore Networks Pvt. Ltd.
+
OUI:98CDB4*
ID_OUI_FROM_DATABASE=Virident Systems, Inc.
@@ -65947,6 +66382,9 @@ OUI:9C9726*
OUI:9C9811*
ID_OUI_FROM_DATABASE=Guangzhou Sunrise Electronics Development Co., Ltd
+OUI:9C99A0*
+ ID_OUI_FROM_DATABASE=XIAOMI INC
+
OUI:9C9C1D*
ID_OUI_FROM_DATABASE=Starkey Labs Inc.
@@ -65962,6 +66400,9 @@ OUI:9CA3BA*
OUI:9CA577*
ID_OUI_FROM_DATABASE=Osorno Enterprises Inc.
+OUI:9CA69D*
+ ID_OUI_FROM_DATABASE=Whaley Technology Co.Ltd
+
OUI:9CA9E4*
ID_OUI_FROM_DATABASE=zte corporation
@@ -66121,6 +66562,9 @@ OUI:A012DB*
OUI:A0133B*
ID_OUI_FROM_DATABASE=HiTi Digital, Inc.
+OUI:A013CB*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:A0143D*
ID_OUI_FROM_DATABASE=PARROT SA
@@ -66136,6 +66580,9 @@ OUI:A01859*
OUI:A01917*
ID_OUI_FROM_DATABASE=Bertel S.p.a.
+OUI:A01B29*
+ ID_OUI_FROM_DATABASE=SAGEMCOM
+
OUI:A01C05*
ID_OUI_FROM_DATABASE=NIMAX TELECOM CO.,LTD.
@@ -66166,6 +66613,9 @@ OUI:A036F0*
OUI:A036FA*
ID_OUI_FROM_DATABASE=Ettus Research LLC
+OUI:A039F7*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+
OUI:A03A75*
ID_OUI_FROM_DATABASE=PSS Belgium N.V.
@@ -66484,6 +66934,9 @@ OUI:A0F6FD*
OUI:A0F849*
ID_OUI_FROM_DATABASE=Cisco
+OUI:A0F895*
+ ID_OUI_FROM_DATABASE=Tinno Mobile Technology Corp
+
OUI:A0FC6E*
ID_OUI_FROM_DATABASE=Telegrafia a.s.
@@ -66664,6 +67117,9 @@ OUI:A47AA4*
OUI:A47ACF*
ID_OUI_FROM_DATABASE=VIBICOM COMMUNICATIONS INC.
+OUI:A47B2C*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
+
OUI:A47B85*
ID_OUI_FROM_DATABASE=ULTIMEDIA Co Ltd,
@@ -66688,6 +67144,9 @@ OUI:A4895B*
OUI:A48CDB*
ID_OUI_FROM_DATABASE=Lenovo
+OUI:A48D3B*
+ ID_OUI_FROM_DATABASE=Vizio, Inc
+
OUI:A49005*
ID_OUI_FROM_DATABASE=CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD
@@ -66784,6 +67243,9 @@ OUI:A4C0C7*
OUI:A4C0E1*
ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:A4C138*
+ ID_OUI_FROM_DATABASE=Telink Semiconductor (Taipei) Co. Ltd.
+
OUI:A4C2AB*
ID_OUI_FROM_DATABASE=Hangzhou LEAD-IT Information & Technology Co.,Ltd
@@ -66994,6 +67456,9 @@ OUI:A86A6F*
OUI:A870A5*
ID_OUI_FROM_DATABASE=UniComm Inc.
+OUI:A8741D*
+ ID_OUI_FROM_DATABASE=PHOENIX CONTACT Electronics GmbH
+
OUI:A875D6*
ID_OUI_FROM_DATABASE=FreeTek International Co., Ltd.
@@ -67081,6 +67546,9 @@ OUI:A89FBA*
OUI:A8A668*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:A8A795*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+
OUI:A8AD3D*
ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
@@ -67129,6 +67597,9 @@ OUI:A8D3C8*
OUI:A8D409*
ID_OUI_FROM_DATABASE=USA 111 Inc
+OUI:A8D828*
+ ID_OUI_FROM_DATABASE=Bayer HealthCare
+
OUI:A8D88A*
ID_OUI_FROM_DATABASE=Wyconn
@@ -67330,6 +67801,9 @@ OUI:AC620D*
OUI:AC6706*
ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:AC676F*
+ ID_OUI_FROM_DATABASE=Electrocompaniet A.S.
+
OUI:AC6BAC*
ID_OUI_FROM_DATABASE=Jenny Science AG
@@ -67561,6 +68035,9 @@ OUI:ACE9AA*
OUI:ACEA6A*
ID_OUI_FROM_DATABASE=GENIX INFOCOMM CO., LTD.
+OUI:ACEC80*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
OUI:ACEE3B*
ID_OUI_FROM_DATABASE=6harmonics Inc
@@ -67639,6 +68116,9 @@ OUI:B03829*
OUI:B03850*
ID_OUI_FROM_DATABASE=Nanjing CAS-ZDC IOT SYSTEM CO.,LTD
+OUI:B0411D*
+ ID_OUI_FROM_DATABASE=ITTIM Technologies
+
OUI:B0435D*
ID_OUI_FROM_DATABASE=NuLEDs, Inc.
@@ -67654,6 +68134,9 @@ OUI:B04545*
OUI:B046FC*
ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+OUI:B047BF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:B0487A*
ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO., LTD.
@@ -67723,6 +68206,9 @@ OUI:B0793C*
OUI:B07994*
ID_OUI_FROM_DATABASE=Motorola Mobility LLC
+OUI:B07D47*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:B07D62*
ID_OUI_FROM_DATABASE=Dipl.-Ing. H. Horstmann GmbH
@@ -67805,7 +68291,7 @@ OUI:B0ADAA*
ID_OUI_FROM_DATABASE=Avaya, Inc
OUI:B0B2DC*
- ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
OUI:B0B32B*
ID_OUI_FROM_DATABASE=Slican Sp. z o.o.
@@ -68002,6 +68488,9 @@ OUI:B435F7*
OUI:B43741*
ID_OUI_FROM_DATABASE=Consert, Inc.
+OUI:B437D1*
+ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
+
OUI:B43934*
ID_OUI_FROM_DATABASE=Pen Generations, Inc.
@@ -68158,6 +68647,9 @@ OUI:B4AA4D*
OUI:B4AB2C*
ID_OUI_FROM_DATABASE=MtM Technology Corporation
+OUI:B4AE2B*
+ ID_OUI_FROM_DATABASE=Microsoft
+
OUI:B4AE6F*
ID_OUI_FROM_DATABASE=Circle Reliance, Inc DBA Cranberry Networks
@@ -68306,7 +68798,7 @@ OUI:B827EB*
ID_OUI_FROM_DATABASE=Raspberry Pi Foundation
OUI:B8288B*
- ID_OUI_FROM_DATABASE=Parker Hannifin
+ ID_OUI_FROM_DATABASE=Parker Hannifin Manufacturing (UK) Ltd
OUI:B829F7*
ID_OUI_FROM_DATABASE=Blaster Tech
@@ -68392,6 +68884,9 @@ OUI:B86491*
OUI:B8653B*
ID_OUI_FROM_DATABASE=Bolymin, Inc.
+OUI:B869C2*
+ ID_OUI_FROM_DATABASE=Sunitec Enterprise Co., Ltd.
+
OUI:B86B23*
ID_OUI_FROM_DATABASE=Toshiba
@@ -68440,6 +68935,9 @@ OUI:B887A8*
OUI:B888E3*
ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD
+OUI:B88981*
+ ID_OUI_FROM_DATABASE=Chengdu InnoThings Technology Co., Ltd.
+
OUI:B889CA*
ID_OUI_FROM_DATABASE=ILJIN ELECTRIC Co., Ltd.
@@ -68479,6 +68977,9 @@ OUI:B898F7*
OUI:B89919*
ID_OUI_FROM_DATABASE=7signal Solutions, Inc
+OUI:B899B0*
+ ID_OUI_FROM_DATABASE=Cohere Technologies
+
OUI:B89ACD*
ID_OUI_FROM_DATABASE=ELITE OPTOELECTRONIC(ASIA)CO.,LTD
@@ -68518,6 +69019,9 @@ OUI:B8AF67*
OUI:B8B1C7*
ID_OUI_FROM_DATABASE=BT&COM CO.,LTD
+OUI:B8B3DC*
+ ID_OUI_FROM_DATABASE=DEREK (SHAOGUAN) LIMITED
+
OUI:B8B42E*
ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co,Ltd.ShenZhen
@@ -68806,6 +69310,9 @@ OUI:BC5C4C*
OUI:BC5FF4*
ID_OUI_FROM_DATABASE=ASRock Incorporation
+OUI:BC5FF6*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+
OUI:BC6010*
ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd
@@ -68920,6 +69427,9 @@ OUI:BCA4E1*
OUI:BCA9D6*
ID_OUI_FROM_DATABASE=Cyber-Rain, Inc.
+OUI:BCADAB*
+ ID_OUI_FROM_DATABASE=Avaya, Inc
+
OUI:BCAEC5*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
@@ -69004,6 +69514,9 @@ OUI:BCEA2B*
OUI:BCEAFA*
ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:BCEB5F*
+ ID_OUI_FROM_DATABASE=Fujian Beifeng Telecom Technology Co., Ltd.
+
OUI:BCEC23*
ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
@@ -69202,6 +69715,9 @@ OUI:C0847A*
OUI:C0885B*
ID_OUI_FROM_DATABASE=SnD Tech Co., Ltd.
+OUI:C08997*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:C08ADE*
ID_OUI_FROM_DATABASE=Ruckus Wireless
@@ -69268,6 +69784,9 @@ OUI:C0B339*
OUI:C0B357*
ID_OUI_FROM_DATABASE=Yoshiki Electronics Industry Ltd.
+OUI:C0B713*
+ ID_OUI_FROM_DATABASE=Beijing Xiaoyuer Technology Co. Ltd.
+
OUI:C0B8B1*
ID_OUI_FROM_DATABASE=BitBox Ltd
@@ -69331,6 +69850,9 @@ OUI:C0E54E*
OUI:C0EAE4*
ID_OUI_FROM_DATABASE=Sonicwall
+OUI:C0EE40*
+ ID_OUI_FROM_DATABASE=Laird Technologies
+
OUI:C0EEFB*
ID_OUI_FROM_DATABASE=OnePlus Tech (Shenzhen) Ltd
@@ -69586,6 +70108,9 @@ OUI:C47B2F*
OUI:C47BA3*
ID_OUI_FROM_DATABASE=NAVIS Inc.
+OUI:C47D46*
+ ID_OUI_FROM_DATABASE=Fujitsu Limited
+
OUI:C47D4F*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
@@ -69637,6 +70162,9 @@ OUI:C49805*
OUI:C49A02*
ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communicaitons)
+OUI:C49FF3*
+ ID_OUI_FROM_DATABASE=Mciao Technologies, Inc.
+
OUI:C4A81D*
ID_OUI_FROM_DATABASE=D-Link International
@@ -69754,6 +70282,9 @@ OUI:C808E9*
OUI:C80AA9*
ID_OUI_FROM_DATABASE=Quanta Computer Inc.
+OUI:C80E14*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+
OUI:C80E77*
ID_OUI_FROM_DATABASE=Le Shi Zhi Xin Electronic Technology (Tianjin) Co.,Ltd
@@ -69820,6 +70351,9 @@ OUI:C83B45*
OUI:C83D97*
ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:C83DFC*
+ ID_OUI_FROM_DATABASE=Pioneer DJ Coroporation
+
OUI:C83E99*
ID_OUI_FROM_DATABASE=Texas Instruments
@@ -69860,7 +70394,7 @@ OUI:C86C1E*
ID_OUI_FROM_DATABASE=Display Systems Ltd
OUI:C86C87*
- ID_OUI_FROM_DATABASE=Zyxel Communications Corp
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
OUI:C86CB6*
ID_OUI_FROM_DATABASE=Optcom Co., Ltd.
@@ -70090,6 +70624,9 @@ OUI:C8F733*
OUI:C8F981*
ID_OUI_FROM_DATABASE=Seneca s.r.l.
+OUI:C8F9C8*
+ ID_OUI_FROM_DATABASE=NewSharp Technology(SuZhou)Co,Ltd
+
OUI:C8F9F9*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
@@ -70183,6 +70720,9 @@ OUI:CC34D7*
OUI:CC3540*
ID_OUI_FROM_DATABASE=Technicolor USA Inc.
+OUI:CC37AB*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corportation
+
OUI:CC398C*
ID_OUI_FROM_DATABASE=Shiningtek
@@ -70249,6 +70789,9 @@ OUI:CC5D4E*
OUI:CC5D57*
ID_OUI_FROM_DATABASE=Information System Research Institute,Inc.
+OUI:CC5FBF*
+ ID_OUI_FROM_DATABASE=Topwise 3G Communication Co., Ltd.
+
OUI:CC60BB*
ID_OUI_FROM_DATABASE=Empower RF Systems
@@ -70282,6 +70825,9 @@ OUI:CC7669*
OUI:CC785F*
ID_OUI_FROM_DATABASE=Apple
+OUI:CC794A*
+ ID_OUI_FROM_DATABASE=BLU Products Inc.
+
OUI:CC7A30*
ID_OUI_FROM_DATABASE=CMAX Wireless Co., Ltd.
@@ -70387,6 +70933,9 @@ OUI:CCC50A*
OUI:CCC62B*
ID_OUI_FROM_DATABASE=Tri-Systems Corporation
+OUI:CCC760*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:CCC8D7*
ID_OUI_FROM_DATABASE=CIAS Elettronica srl
@@ -70436,7 +70985,7 @@ OUI:CCEA1C*
ID_OUI_FROM_DATABASE=DCONWORKS Co., Ltd
OUI:CCEED9*
- ID_OUI_FROM_DATABASE=Deto Mechatronic GmbH
+ ID_OUI_FROM_DATABASE=VAHLE DETO GmbH
OUI:CCEF48*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
@@ -70483,6 +71032,9 @@ OUI:CCFE3C*
OUI:D0034B*
ID_OUI_FROM_DATABASE=Apple Inc
+OUI:D00492*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:D00790*
ID_OUI_FROM_DATABASE=Texas Instruments
@@ -70526,7 +71078,7 @@ OUI:D02516*
ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
OUI:D02598*
- ID_OUI_FROM_DATABASE=Apple Inc
+ ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:D02788*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind.Co.Ltd
@@ -70540,6 +71092,12 @@ OUI:D02DB3*
OUI:D03110*
ID_OUI_FROM_DATABASE=Ingenic Semiconductor Co.,Ltd
+OUI:D03311*
+ ID_OUI_FROM_DATABASE=Apple, Inc
+
+OUI:D03742*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific(shenzhen)Co.,Lt
+
OUI:D03761*
ID_OUI_FROM_DATABASE=Texas Instruments
@@ -70561,6 +71119,9 @@ OUI:D048F3*
OUI:D04CC1*
ID_OUI_FROM_DATABASE=SINTRONES Technology Corp.
+OUI:D04D2C*
+ ID_OUI_FROM_DATABASE=Roku, Inc
+
OUI:D04F7E*
ID_OUI_FROM_DATABASE=Apple
@@ -70678,6 +71239,9 @@ OUI:D083D4*
OUI:D084B0*
ID_OUI_FROM_DATABASE=Sagemcom
+OUI:D087E2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:D08999*
ID_OUI_FROM_DATABASE=APCON, Inc.
@@ -70867,6 +71431,9 @@ OUI:D4016D*
OUI:D4024A*
ID_OUI_FROM_DATABASE=Delphian Systems LLC
+OUI:D404CD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
OUI:D40598*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
@@ -70957,6 +71524,9 @@ OUI:D43D7E*
OUI:D443A8*
ID_OUI_FROM_DATABASE=Changzhou Haojie Electric Co., Ltd.
+OUI:D445E8*
+ ID_OUI_FROM_DATABASE=Jiangxi Hongpai Technology Co., Ltd.
+
OUI:D44B5E*
ID_OUI_FROM_DATABASE=TAIYO YUDEN CO., LTD.
@@ -71053,6 +71623,9 @@ OUI:D47B35*
OUI:D47B75*
ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
+OUI:D47BB0*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+
OUI:D481CA*
ID_OUI_FROM_DATABASE=iDevices, LLC
@@ -71344,6 +71917,9 @@ OUI:D842AC*
OUI:D84606*
ID_OUI_FROM_DATABASE=Silicon Valley Global Marketing
+OUI:D84710*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+
OUI:D8490B*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
@@ -71383,6 +71959,9 @@ OUI:D85D84*
OUI:D85DE2*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:D85DEF*
+ ID_OUI_FROM_DATABASE=Busch-Jaeger Elektro GmbH
+
OUI:D86194*
ID_OUI_FROM_DATABASE=Objetivos y Sevicios de Valor Añadido
@@ -71515,6 +72094,9 @@ OUI:D8B04C*
OUI:D8B12A*
ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co., Ltd.
+OUI:D8B190*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:D8B377*
ID_OUI_FROM_DATABASE=HTC Corporation
@@ -71617,6 +72199,9 @@ OUI:D8EB97*
OUI:D8EE78*
ID_OUI_FROM_DATABASE=Moog Protokraft
+OUI:D8EFCD*
+ ID_OUI_FROM_DATABASE=Nokia
+
OUI:D8F0F2*
ID_OUI_FROM_DATABASE=Zeebo Inc
@@ -71749,6 +72334,9 @@ OUI:DC49C9*
OUI:DC4EDE*
ID_OUI_FROM_DATABASE=SHINYEI TECHNOLOGY CO., LTD.
+OUI:DC5360*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:DC537C*
ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
@@ -71782,6 +72370,9 @@ OUI:DC7144*
OUI:DC7B94*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
+OUI:DC7FA4*
+ ID_OUI_FROM_DATABASE=2Wire
+
OUI:DC825B*
ID_OUI_FROM_DATABASE=JANUS, spol. s r.o.
@@ -71806,6 +72397,9 @@ OUI:DC9FA4*
OUI:DC9FDB*
ID_OUI_FROM_DATABASE=Ubiquiti Networks, Inc.
+OUI:DCA3AC*
+ ID_OUI_FROM_DATABASE=RBcloudtech
+
OUI:DCA5F4*
ID_OUI_FROM_DATABASE=Cisco
@@ -71884,6 +72478,9 @@ OUI:DCD87F*
OUI:DCDA4F*
ID_OUI_FROM_DATABASE=GETCK TECHNOLOGY, INC
+OUI:DCDB70*
+ ID_OUI_FROM_DATABASE=Tonfunk Systementwicklung und Service GmbH
+
OUI:DCDECA*
ID_OUI_FROM_DATABASE=Akyllor
@@ -71902,6 +72499,9 @@ OUI:DCE578*
OUI:DCE71C*
ID_OUI_FROM_DATABASE=AUG Elektronik GmbH
+OUI:DCEB94*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:DCEC06*
ID_OUI_FROM_DATABASE=Heimi Network Technology Co., Ltd.
@@ -71923,6 +72523,9 @@ OUI:DCFAD5*
OUI:DCFB02*
ID_OUI_FROM_DATABASE=Buffalo Inc.
+OUI:E00370*
+ ID_OUI_FROM_DATABASE=ShenZhen Continental Wireless Technology Co., Ltd.
+
OUI:E005C5*
ID_OUI_FROM_DATABASE=TP-LINK Technologies Co.,Ltd.
@@ -71947,6 +72550,9 @@ OUI:E01877*
OUI:E0191D*
ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
+OUI:E01AEA*
+ ID_OUI_FROM_DATABASE=Allied Telesis, Inc.
+
OUI:E01C41*
ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
@@ -71983,12 +72589,18 @@ OUI:E0271A*
OUI:E02A82*
ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:E02CB2*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication (Wuhan) Company Limited
+
OUI:E02F6D*
ID_OUI_FROM_DATABASE=Cisco
OUI:E03005*
ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:E0319E*
+ ID_OUI_FROM_DATABASE=Valve Corporation
+
OUI:E031D0*
ID_OUI_FROM_DATABASE=SZ Telstar CO., LTD
@@ -72016,12 +72628,18 @@ OUI:E03E7D*
OUI:E03F49*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:E04136*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+
OUI:E0469A*
ID_OUI_FROM_DATABASE=NETGEAR
OUI:E04B45*
ID_OUI_FROM_DATABASE=Hi-P Electronics Pte Ltd
+OUI:E0553D*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
+
OUI:E05597*
ID_OUI_FROM_DATABASE=Emergent Vision Technologies Inc.
@@ -72145,6 +72763,9 @@ OUI:E0AAB0*
OUI:E0ABFE*
ID_OUI_FROM_DATABASE=Orb Networks, Inc.
+OUI:E0ACCB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:E0ACF1*
ID_OUI_FROM_DATABASE=Cisco
@@ -72502,6 +73123,9 @@ OUI:E497F0*
OUI:E498D6*
ID_OUI_FROM_DATABASE=Apple, Inc
+OUI:E4A32F*
+ ID_OUI_FROM_DATABASE=Shanghai Artimen Technology Co., Ltd.
+
OUI:E4A5EF*
ID_OUI_FROM_DATABASE=TRON LINK ELECTRONICS CO., LTD.
@@ -72676,6 +73300,9 @@ OUI:E82E24*
OUI:E83381*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E8377A*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+
OUI:E83935*
ID_OUI_FROM_DATABASE=Hewlett Packard
@@ -72730,6 +73357,9 @@ OUI:E8519D*
OUI:E85484*
ID_OUI_FROM_DATABASE=NEO INFORMATION SYSTEMS CO., LTD.
+OUI:E855B4*
+ ID_OUI_FROM_DATABASE=SAI Technology Inc.
+
OUI:E856D6*
ID_OUI_FROM_DATABASE=NCTech Ltd
@@ -72760,6 +73390,9 @@ OUI:E86183*
OUI:E861BE*
ID_OUI_FROM_DATABASE=Melec Inc.
+OUI:E86549*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
OUI:E866C4*
ID_OUI_FROM_DATABASE=Datawise Systems
@@ -72859,6 +73492,9 @@ OUI:E8B1FC*
OUI:E8B4AE*
ID_OUI_FROM_DATABASE=Shenzhen C&D Electronics Co.,Ltd
+OUI:E8B4C8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:E8B748*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
@@ -72964,6 +73600,9 @@ OUI:E8F1B0*
OUI:E8F226*
ID_OUI_FROM_DATABASE=MILLSON CUSTOM SOLUTIONS INC.
+OUI:E8F2E2*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
OUI:E8F2E3*
ID_OUI_FROM_DATABASE=Starcor Beijing Co.,Limited
@@ -72976,6 +73615,9 @@ OUI:E8FC60*
OUI:E8FCAF*
ID_OUI_FROM_DATABASE=NETGEAR INC.,
+OUI:EC0133*
+ ID_OUI_FROM_DATABASE=TRINUS SYSTEMS INC.
+
OUI:EC0EC4*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
@@ -73006,9 +73648,15 @@ OUI:EC1A59*
OUI:EC1D7F*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:EC1F72*
+ ID_OUI_FROM_DATABASE=Samsung Electro Mechanics co., LTD.
+
OUI:EC219F*
ID_OUI_FROM_DATABASE=VidaBox LLC
+OUI:EC21E5*
+ ID_OUI_FROM_DATABASE=Toshiba
+
OUI:EC2257*
ID_OUI_FROM_DATABASE=JiangSu NanJing University Electronic Information Technology Co.,Ltd
@@ -73183,6 +73831,9 @@ OUI:ECA29B*
OUI:ECA86B*
ID_OUI_FROM_DATABASE=ELITEGROUP COMPUTER SYSTEMS CO., LTD.
+OUI:ECA9FA*
+ ID_OUI_FROM_DATABASE=GUANGDONG GENIUS TECHNOLOGY CO.,LTD.
+
OUI:ECB106*
ID_OUI_FROM_DATABASE=Acuro Networks, Inc
@@ -73267,6 +73918,9 @@ OUI:ECE9F8*
OUI:ECEA03*
ID_OUI_FROM_DATABASE=DARFON LIGHTING CORP
+OUI:ECEED8*
+ ID_OUI_FROM_DATABASE=ZTLX Network Technology Co.,Ltd
+
OUI:ECF00E*
ID_OUI_FROM_DATABASE=Abocom
@@ -73312,6 +73966,9 @@ OUI:F013C3*
OUI:F015A0*
ID_OUI_FROM_DATABASE=KyungDong One Co., Ltd.
+OUI:F0182B*
+ ID_OUI_FROM_DATABASE=LG Chem
+
OUI:F01C13*
ID_OUI_FROM_DATABASE=LG Electronics
@@ -73327,6 +73984,9 @@ OUI:F01FAF*
OUI:F0219D*
ID_OUI_FROM_DATABASE=Cal-Comp Electronics & Communications Company Ltd.
+OUI:F0224E*
+ ID_OUI_FROM_DATABASE=Esan electronic co.
+
OUI:F02329*
ID_OUI_FROM_DATABASE=SHOWA DENKI CO.,LTD.
@@ -73345,6 +74005,9 @@ OUI:F02572*
OUI:F025B7*
ID_OUI_FROM_DATABASE=Samsung Electro Mechanics co., LTD.
+OUI:F02624*
+ ID_OUI_FROM_DATABASE=WAFA TECHNOLOGIES CO., LTD.
+
OUI:F0264C*
ID_OUI_FROM_DATABASE=Dr. Sigrist AG
@@ -73402,6 +74065,9 @@ OUI:F05849*
OUI:F05A09*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F05B7B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:F05D89*
ID_OUI_FROM_DATABASE=Dycon Limited
@@ -73498,6 +74164,9 @@ OUI:F093C5*
OUI:F099BF*
ID_OUI_FROM_DATABASE=Apple
+OUI:F09A51*
+ ID_OUI_FROM_DATABASE=Shanghai Viroyal Electronic Technology Company Limited
+
OUI:F09CBB*
ID_OUI_FROM_DATABASE=RaonThink Inc.
@@ -73528,6 +74197,12 @@ OUI:F0AE51*
OUI:F0B052*
ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:F0B2E5*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
+OUI:F0B429*
+ ID_OUI_FROM_DATABASE=XIAOMI Electronics,CO.,LTD
+
OUI:F0B479*
ID_OUI_FROM_DATABASE=Apple
@@ -73657,6 +74332,9 @@ OUI:F0FDA0*
OUI:F0FE6B*
ID_OUI_FROM_DATABASE=Shanghai High-Flying Electronics Technology Co., Ltd
+OUI:F40304*
+ ID_OUI_FROM_DATABASE=Google
+
OUI:F40321*
ID_OUI_FROM_DATABASE=BeNeXt B.V.
@@ -73786,6 +74464,9 @@ OUI:F4559C*
OUI:F455E0*
ID_OUI_FROM_DATABASE=Niceway CNC Technology Co.,Ltd.Hunan Province
+OUI:F4573E*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:F45842*
ID_OUI_FROM_DATABASE=Boxx TV Ltd
@@ -73807,6 +74488,9 @@ OUI:F46349*
OUI:F4645D*
ID_OUI_FROM_DATABASE=Toshiba
+OUI:F4672D*
+ ID_OUI_FROM_DATABASE=ShenZhen Topstar Technology Company
+
OUI:F46A92*
ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
@@ -73900,12 +74584,18 @@ OUI:F4B7E2*
OUI:F4B85E*
ID_OUI_FROM_DATABASE=Texas INstruments
+OUI:F4B8A7*
+ ID_OUI_FROM_DATABASE=zte corporation
+
OUI:F4BD7C*
ID_OUI_FROM_DATABASE=Chengdu jinshi communication Co., LTD
OUI:F4C447*
ID_OUI_FROM_DATABASE=Coagent International Enterprise Limited
+OUI:F4C613*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+
OUI:F4C6D7*
ID_OUI_FROM_DATABASE=blackned GmbH
@@ -73957,9 +74647,18 @@ OUI:F4E3FB*
OUI:F4E6D7*
ID_OUI_FROM_DATABASE=Solar Power Technologies, Inc.
+OUI:F4E926*
+ ID_OUI_FROM_DATABASE=Tianjin Zanpu Technology Inc.
+
+OUI:F4E9D4*
+ ID_OUI_FROM_DATABASE=QLogic Corporation
+
OUI:F4EA67*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
+OUI:F4EB38*
+ ID_OUI_FROM_DATABASE=SAGEM
+
OUI:F4EC38*
ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO., LTD.
@@ -74020,6 +74719,9 @@ OUI:F80CF3*
OUI:F80D43*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co., Ltd.
+OUI:F80D60*
+ ID_OUI_FROM_DATABASE=CANON INC.
+
OUI:F80DEA*
ID_OUI_FROM_DATABASE=ZyCast Technology Inc.
@@ -74137,6 +74839,9 @@ OUI:F854AF*
OUI:F8572E*
ID_OUI_FROM_DATABASE=Core Brands, LLC
+OUI:F85B9C*
+ ID_OUI_FROM_DATABASE=SB SYSTEMS Co.,Ltd
+
OUI:F85BC9*
ID_OUI_FROM_DATABASE=M-Cube Spa
@@ -74173,6 +74878,9 @@ OUI:F872EA*
OUI:F87394*
ID_OUI_FROM_DATABASE=NETGEAR INC.,
+OUI:F873A2*
+ ID_OUI_FROM_DATABASE=Avaya, Inc
+
OUI:F8769B*
ID_OUI_FROM_DATABASE=Neopis Co., Ltd.
@@ -74218,6 +74926,9 @@ OUI:F893F3*
OUI:F89550*
ID_OUI_FROM_DATABASE=Proton Products Chengdu Ltd
+OUI:F895C7*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+
OUI:F897CF*
ID_OUI_FROM_DATABASE=DAESHIN-INFORMATION TECHNOLOGY CO., LTD.
@@ -74269,6 +74980,9 @@ OUI:F8BC12*
OUI:F8BC41*
ID_OUI_FROM_DATABASE=Rosslare Enterprises Limited
+OUI:F8BF09*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:F8C001*
ID_OUI_FROM_DATABASE=Juniper Networks
@@ -74374,6 +75088,9 @@ OUI:F8F1B6*
OUI:F8F25A*
ID_OUI_FROM_DATABASE=G-Lab GmbH
+OUI:F8F464*
+ ID_OUI_FROM_DATABASE=Rawe Electonic GmbH
+
OUI:F8F7D3*
ID_OUI_FROM_DATABASE=International Communications Corporation
@@ -74485,9 +75202,15 @@ OUI:FC2E2D*
OUI:FC2F40*
ID_OUI_FROM_DATABASE=Calxeda, Inc.
+OUI:FC2FEF*
+ ID_OUI_FROM_DATABASE=UTT Technologies Co., Ltd.
+
OUI:FC3288*
ID_OUI_FROM_DATABASE=CELOT Wireless Co., Ltd
+OUI:FC335F*
+ ID_OUI_FROM_DATABASE=Polyera
+
OUI:FC3598*
ID_OUI_FROM_DATABASE=Favite Inc.
@@ -74527,6 +75250,9 @@ OUI:FC4DD4*
OUI:FC5090*
ID_OUI_FROM_DATABASE=SIMEX Sp. z o.o.
+OUI:FC528D*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
OUI:FC52CE*
ID_OUI_FROM_DATABASE=Control iD
@@ -74639,7 +75365,7 @@ OUI:FCAF6A*
ID_OUI_FROM_DATABASE=Qulsar Inc
OUI:FCAFAC*
- ID_OUI_FROM_DATABASE=Panasonic System LSI
+ ID_OUI_FROM_DATABASE=Socionext Inc.
OUI:FCB0C4*
ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co., Ltd
@@ -74653,6 +75379,9 @@ OUI:FCB698*
OUI:FCBBA1*
ID_OUI_FROM_DATABASE=Shenzhen Minicreate Technology Co.,Ltd
+OUI:FCC233*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
OUI:FCC23D*
ID_OUI_FROM_DATABASE=Atmel Corporation
@@ -74683,6 +75412,9 @@ OUI:FCD5D9*
OUI:FCD6BD*
ID_OUI_FROM_DATABASE=Robert Bosch GmbH
+OUI:FCD733*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD
+
OUI:FCD817*
ID_OUI_FROM_DATABASE=Beijing Hesun Technologies Co.Ltd.
@@ -74752,8 +75484,14 @@ OUI:FCFAF7*
OUI:FCFBFB*
ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
+OUI:FCFC48*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
OUI:FCFE77*
ID_OUI_FROM_DATABASE=Hitachi Reftechno, Inc.
+OUI:FCFEC2*
+ ID_OUI_FROM_DATABASE=Invensys Controls UK Limited
+
OUI:FCFFAA*
ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAL public listing for more information.
diff --git a/hwdb/20-pci-vendor-model.hwdb b/hwdb/20-pci-vendor-model.hwdb
index 3b35b26e59..b27a5c7902 100644
--- a/hwdb/20-pci-vendor-model.hwdb
+++ b/hwdb/20-pci-vendor-model.hwdb
@@ -941,6 +941,9 @@ pci:v00001000d0000005C*
pci:v00001000d0000005D*
ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader]
+pci:v00001000d0000005Dsv00001000sd00009361*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9361-8i)
+
pci:v00001000d0000005Dsv00001028sd00001F41*
ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (PERC H830 Adapter)
@@ -3114,25 +3117,28 @@ pci:v00001002d00004E4B*
ID_MODEL_FROM_DATABASE=R350 GL [FireGL X2 AGP Pro]
pci:v00001002d00004E50*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo]
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700]
pci:v00001002d00004E50sv00001025sd0000005A*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo] (TravelMate 290)
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (TravelMate 290)
+
+pci:v00001002d00004E50sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (Extensa 3000 series laptop: ATI RV360/M11 [Mobility Radeon 9700])
pci:v00001002d00004E50sv0000103Csd0000088C*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo] (NC8000 laptop)
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (NC8000 laptop)
pci:v00001002d00004E50sv0000103Csd00000890*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo] (NC6000 laptop)
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (NC6000 laptop)
pci:v00001002d00004E50sv0000144Dsd0000C00C*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo] (P35 notebook)
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (P35 notebook)
pci:v00001002d00004E50sv00001462sd00000311*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo] (MSI M510A)
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (MSI M510A)
pci:v00001002d00004E50sv00001734sd00001055*
- ID_MODEL_FROM_DATABASE=RV350/M10 [Mobility Radeon 9600 PRO Turbo] (Amilo M1420W)
+ ID_MODEL_FROM_DATABASE=RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] (Amilo M1420W)
pci:v00001002d00004E51*
ID_MODEL_FROM_DATABASE=RV350 [Radeon 9550/9600/X1050 Series]
@@ -4235,6 +4241,12 @@ pci:v00001002d00006603*
pci:v00001002d00006604*
ID_MODEL_FROM_DATABASE=Opal XT [Radeon R7 M265]
+pci:v00001002d00006604sv0000103Csd00008006*
+ ID_MODEL_FROM_DATABASE=Opal XT [Radeon R7 M265] (FirePro M4170)
+
+pci:v00001002d00006604sv000017AAsd00003643*
+ ID_MODEL_FROM_DATABASE=Opal XT [Radeon R7 M265] (Radeon R7 A360)
+
pci:v00001002d00006605*
ID_MODEL_FROM_DATABASE=Opal PRO [Radeon R7 M260]
@@ -4251,43 +4263,52 @@ pci:v00001002d00006608*
ID_MODEL_FROM_DATABASE=Oland GL [FirePro W2100]
pci:v00001002d00006610*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250]
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X]
pci:v00001002d00006610sv00001019sd00000030*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon HD 8670)
+
+pci:v00001002d00006610sv00001028sd00000081*
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon R7 350X)
+
+pci:v00001002d00006610sv00001028sd00000083*
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon R5 340X)
pci:v00001002d00006610sv00001028sd00002120*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon R7 250)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon R7 250)
pci:v00001002d00006610sv00001028sd00002322*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon R7 250)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon R7 250)
pci:v00001002d00006610sv00001462sd00002910*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon HD 8670)
pci:v00001002d00006610sv00001462sd00002911*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon HD 8670)
pci:v00001002d00006610sv00001642sd00003C81*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon HD 8670)
pci:v00001002d00006610sv00001642sd00003C91*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X / R7 250/350X] (Radeon HD 8670)
pci:v00001002d00006611*
- ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240 OEM]
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240/340 OEM]
pci:v00001002d00006611sv00001028sd0000210B*
- ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240 OEM] (Radeon R5 240 OEM)
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240/340 OEM] (Radeon R5 240 OEM)
pci:v00001002d00006611sv0000174Bsd00004248*
- ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240 OEM] (Radeon R7 240 OEM)
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240/340 OEM] (Radeon R7 240 OEM)
pci:v00001002d00006611sv0000174Bsd0000A240*
- ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240 OEM] (Radeon R7 240 OEM)
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240/340 OEM] (Radeon R7 240 OEM)
+
+pci:v00001002d00006611sv0000174Bsd0000D340*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240/340 OEM] (Radeon R7 340 OEM)
pci:v00001002d00006611sv00001B0Asd000090D3*
- ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240 OEM] (Radeon R7 240 OEM)
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R7 240/340 OEM] (Radeon R7 240 OEM)
pci:v00001002d00006613*
ID_MODEL_FROM_DATABASE=Oland PRO [Radeon R7 240]
@@ -4362,10 +4383,16 @@ pci:v00001002d0000665D*
ID_MODEL_FROM_DATABASE=Bonaire [Radeon R7 200 Series]
pci:v00001002d0000665F*
- ID_MODEL_FROM_DATABASE=Tobago [Radeon R7 300 Series]
+ ID_MODEL_FROM_DATABASE=Tobago PRO [Radeon R9 360]
pci:v00001002d00006660*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M]
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330]
+
+pci:v00001002d00006660sv000017AAsd00003809*
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
+
+pci:v00001002d00006660sv000017AAsd0000390C*
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
pci:v00001002d00006663*
ID_MODEL_FROM_DATABASE=Sun PRO [Radeon HD 8570A/8570M]
@@ -4379,15 +4406,15 @@ pci:v00001002d00006664*
pci:v00001002d00006665*
ID_MODEL_FROM_DATABASE=Jet PRO [Radeon R5 M230]
+pci:v00001002d00006665sv000017AAsd0000368F*
+ ID_MODEL_FROM_DATABASE=Jet PRO [Radeon R5 M230] (Radeon R5 A230)
+
pci:v00001002d00006667*
ID_MODEL_FROM_DATABASE=Jet ULT [Radeon R5 M230]
pci:v00001002d0000666F*
ID_MODEL_FROM_DATABASE=Sun LE [Radeon HD 8550M / R5 M230]
-pci:v00001002d00006670*
- ID_MODEL_FROM_DATABASE=Hainan
-
pci:v00001002d00006704*
ID_MODEL_FROM_DATABASE=Cayman PRO GL [FirePro V7900]
@@ -4442,12 +4469,6 @@ pci:v00001002d00006720sv00001558sd00007201*
pci:v00001002d00006720sv0000174Bsd0000E188*
ID_MODEL_FROM_DATABASE=Blackcomb [Radeon HD 6970M/6990M] (Radeon HD 6970M)
-pci:v00001002d00006724*
- ID_MODEL_FROM_DATABASE=Blackcomb [Mobility Radeon HD 6000 series]
-
-pci:v00001002d00006725*
- ID_MODEL_FROM_DATABASE=Blackcomb [Radeon HD 6900M Series]
-
pci:v00001002d00006738*
ID_MODEL_FROM_DATABASE=Barts XT [Radeon HD 6870]
@@ -5679,37 +5700,49 @@ pci:v00001002d00006772*
ID_MODEL_FROM_DATABASE=Caicos [Radeon HD 7450A]
pci:v00001002d00006778*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM]
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM]
pci:v00001002d00006778sv00001019sd00000024*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 7470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 7470)
pci:v00001002d00006778sv00001019sd00000027*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470)
pci:v00001002d00006778sv00001028sd00002120*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 7470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 7470)
pci:v00001002d00006778sv00001462sd0000B491*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470)
pci:v00001002d00006778sv00001462sd0000B492*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470)
pci:v00001002d00006778sv00001462sd0000B493*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470 OEM)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470 OEM)
+
+pci:v00001002d00006778sv00001462sd0000B499*
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon R5 235 OEM)
pci:v00001002d00006778sv00001642sd00003C65*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470)
pci:v00001002d00006778sv00001642sd00003C75*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470)
pci:v00001002d00006778sv0000174Bsd00008145*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 8470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 8470)
+
+pci:v00001002d00006778sv0000174Bsd0000D145*
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon R5 235 OEM)
+
+pci:v00001002d00006778sv0000174Bsd0000D335*
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon R5 310 OEM)
pci:v00001002d00006778sv0000174Bsd0000E145*
- ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235 OEM] (Radeon HD 7470)
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon HD 7470)
+
+pci:v00001002d00006778sv000017AAsd00003694*
+ ID_MODEL_FROM_DATABASE=Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] (Radeon R5 A220)
pci:v00001002d00006779*
ID_MODEL_FROM_DATABASE=Caicos [Radeon HD 6450/7450/8450 / R5 230 OEM]
@@ -5817,10 +5850,10 @@ pci:v00001002d00006780*
ID_MODEL_FROM_DATABASE=Tahiti XT GL [FirePro W9000]
pci:v00001002d00006784*
- ID_MODEL_FROM_DATABASE=Tahiti [ATI FirePro V (FireGL V) Graphics Adapter]
+ ID_MODEL_FROM_DATABASE=Tahiti [FirePro Series Graphics Adapter]
pci:v00001002d00006788*
- ID_MODEL_FROM_DATABASE=Tahiti [ATI FirePro V (FireGL V) Graphics Adapter]
+ ID_MODEL_FROM_DATABASE=Tahiti [FirePro Series Graphics Adapter]
pci:v00001002d0000678A*
ID_MODEL_FROM_DATABASE=Tahiti PRO GL [FirePro Series]
@@ -5849,14 +5882,8 @@ pci:v00001002d0000678Asv00001002sd00000B2A*
pci:v00001002d0000678Asv00001028sd0000030C*
ID_MODEL_FROM_DATABASE=Tahiti PRO GL [FirePro Series] (FirePro W8000)
-pci:v00001002d00006790*
- ID_MODEL_FROM_DATABASE=Tahiti
-
-pci:v00001002d00006791*
- ID_MODEL_FROM_DATABASE=Tahiti
-
-pci:v00001002d00006792*
- ID_MODEL_FROM_DATABASE=Tahiti
+pci:v00001002d0000678Asv00001028sd00000710*
+ ID_MODEL_FROM_DATABASE=Tahiti PRO GL [FirePro Series] (FirePro S9000)
pci:v00001002d00006798*
ID_MODEL_FROM_DATABASE=Tahiti XT [Radeon HD 7970/8970 OEM / R9 280X]
@@ -5969,9 +5996,24 @@ pci:v00001002d0000679F*
pci:v00001002d000067A0*
ID_MODEL_FROM_DATABASE=Hawaii XT GL [FirePro W9100]
+pci:v00001002d000067A0sv00001002sd00000335*
+ ID_MODEL_FROM_DATABASE=Hawaii XT GL [FirePro W9100] (FirePro S9150)
+
+pci:v00001002d000067A0sv00001028sd0000031F*
+ ID_MODEL_FROM_DATABASE=Hawaii XT GL [FirePro W9100] (FirePro W9100)
+
+pci:v00001002d000067A0sv00001028sd00000335*
+ ID_MODEL_FROM_DATABASE=Hawaii XT GL [FirePro W9100] (FirePro S9150)
+
pci:v00001002d000067A1*
ID_MODEL_FROM_DATABASE=Hawaii PRO GL [FirePro W8100]
+pci:v00001002d000067A1sv00001002sd00000335*
+ ID_MODEL_FROM_DATABASE=Hawaii PRO GL [FirePro W8100] (FirePro S9100)
+
+pci:v00001002d000067A1sv00001028sd00000335*
+ ID_MODEL_FROM_DATABASE=Hawaii PRO GL [FirePro W8100] (FirePro S9100)
+
pci:v00001002d000067A2*
ID_MODEL_FROM_DATABASE=Hawaii GL
@@ -6102,7 +6144,10 @@ pci:v00001002d00006810*
ID_MODEL_FROM_DATABASE=Curacao XT [Radeon R9 270X]
pci:v00001002d00006811*
- ID_MODEL_FROM_DATABASE=Curacao PRO [Radeon R9 270]
+ ID_MODEL_FROM_DATABASE=Curacao PRO [Radeon R9 270/370]
+
+pci:v00001002d00006811sv00001028sd00000B00*
+ ID_MODEL_FROM_DATABASE=Curacao PRO [Radeon R9 270/370] (Trinidad PRO [Radeon R9 370])
pci:v00001002d00006816*
ID_MODEL_FROM_DATABASE=Pitcairn
@@ -6131,6 +6176,9 @@ pci:v00001002d00006820*
pci:v00001002d00006820sv0000103Csd00001851*
ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X] (Radeon HD 7750M)
+pci:v00001002d00006820sv000017AAsd00003643*
+ ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X] (Radeon R9 A375)
+
pci:v00001002d00006820sv000017AAsd00003801*
ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X] (Radeon R9 M275)
@@ -6224,15 +6272,6 @@ pci:v00001002d00006837sv0000148Csd00008730*
pci:v00001002d00006837sv00001787sd00003000*
ID_MODEL_FROM_DATABASE=Cape Verde LE [Radeon HD 7730/8730] (Radeon HD 6570)
-pci:v00001002d00006838*
- ID_MODEL_FROM_DATABASE=Cape Verde
-
-pci:v00001002d00006839*
- ID_MODEL_FROM_DATABASE=Cape Verde
-
-pci:v00001002d0000683B*
- ID_MODEL_FROM_DATABASE=Cape Verde [Radeon HD 7700 Series]
-
pci:v00001002d0000683D*
ID_MODEL_FROM_DATABASE=Cape Verde XT [Radeon HD 7770/8760 / R7 250X]
@@ -6255,7 +6294,16 @@ pci:v00001002d0000683Dsv0000174Bsd00008304*
ID_MODEL_FROM_DATABASE=Cape Verde XT [Radeon HD 7770/8760 / R7 250X] (Radeon HD 8760 OEM)
pci:v00001002d0000683F*
- ID_MODEL_FROM_DATABASE=Cape Verde PRO [Radeon HD 7750 / R7 250E]
+ ID_MODEL_FROM_DATABASE=Cape Verde PRO [Radeon HD 7750/8740 / R7 250E]
+
+pci:v00001002d0000683Fsv00001462sd00002790*
+ ID_MODEL_FROM_DATABASE=Cape Verde PRO [Radeon HD 7750/8740 / R7 250E] (Radeon HD 8740)
+
+pci:v00001002d0000683Fsv00001462sd00002791*
+ ID_MODEL_FROM_DATABASE=Cape Verde PRO [Radeon HD 7750/8740 / R7 250E] (Radeon HD 8740)
+
+pci:v00001002d0000683Fsv00001642sd00003B97*
+ ID_MODEL_FROM_DATABASE=Cape Verde PRO [Radeon HD 7750/8740 / R7 250E] (Radeon HD 8740)
pci:v00001002d00006840*
ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7500M/7600M Series]
@@ -7985,12 +8033,12 @@ pci:v00001002d00006900sv00001179sd0000F934*
pci:v00001002d00006901*
ID_MODEL_FROM_DATABASE=Topaz PRO [Radeon R5 M255]
-pci:v00001002d00006920*
- ID_MODEL_FROM_DATABASE=Tonga
-
pci:v00001002d00006921*
ID_MODEL_FROM_DATABASE=Amethyst XT [Radeon R9 M295X]
+pci:v00001002d00006929*
+ ID_MODEL_FROM_DATABASE=Tonga PRO GL [FirePro Series]
+
pci:v00001002d0000692B*
ID_MODEL_FROM_DATABASE=Tonga PRO GL [FirePro W7100]
@@ -9083,24 +9131,9 @@ pci:v00001002d00009838*
pci:v00001002d00009839*
ID_MODEL_FROM_DATABASE=Kabini [Radeon HD 8180]
-pci:v00001002d0000983A*
- ID_MODEL_FROM_DATABASE=Kabini
-
-pci:v00001002d0000983B*
- ID_MODEL_FROM_DATABASE=Kabini
-
-pci:v00001002d0000983C*
- ID_MODEL_FROM_DATABASE=Kabini
-
pci:v00001002d0000983D*
ID_MODEL_FROM_DATABASE=Temash [Radeon HD 8250/8280G]
-pci:v00001002d0000983E*
- ID_MODEL_FROM_DATABASE=Kabini
-
-pci:v00001002d0000983F*
- ID_MODEL_FROM_DATABASE=Kabini
-
pci:v00001002d00009840*
ID_MODEL_FROM_DATABASE=Kabini HDMI/DP Audio
@@ -13265,6 +13298,9 @@ pci:v00001033d00000194sv00001028sd000004DA*
pci:v00001033d00000194sv00001043sd00008413*
ID_MODEL_FROM_DATABASE=uPD720200 USB 3.0 Host Controller (P8P67 Deluxe Motherboard)
+pci:v00001033d00000194sv0000104Dsd0000907A*
+ ID_MODEL_FROM_DATABASE=uPD720200 USB 3.0 Host Controller (Vaio VPCF1)
+
pci:v00001033d00000194sv00001AF4sd00001100*
ID_MODEL_FROM_DATABASE=uPD720200 USB 3.0 Host Controller (QEMU Virtual Machine)
@@ -13310,6 +13346,9 @@ pci:v00001039d00000003*
pci:v00001039d00000004*
ID_MODEL_FROM_DATABASE=PCI-to-PCI bridge
+pci:v00001039d00000004sv00001039sd00000000*
+ ID_MODEL_FROM_DATABASE=PCI-to-PCI bridge (PCIe x16 port)
+
pci:v00001039d00000006*
ID_MODEL_FROM_DATABASE=85C501/2/3
@@ -13322,6 +13361,9 @@ pci:v00001039d00000009*
pci:v00001039d0000000A*
ID_MODEL_FROM_DATABASE=PCI-to-PCI bridge
+pci:v00001039d0000000Asv00001039sd00000000*
+ ID_MODEL_FROM_DATABASE=PCI-to-PCI bridge (PCIe x1 port)
+
pci:v00001039d00000016*
ID_MODEL_FROM_DATABASE=SiS961/2/3 SMBus controller
@@ -13352,6 +13394,9 @@ pci:v00001039d00000190*
pci:v00001039d00000191*
ID_MODEL_FROM_DATABASE=191 Gigabit Ethernet Adapter
+pci:v00001039d00000191sv00001043sd00008139*
+ ID_MODEL_FROM_DATABASE=191 Gigabit Ethernet Adapter (P5SD2-FM/S mainboard)
+
pci:v00001039d00000200*
ID_MODEL_FROM_DATABASE=5597/5598/6326 VGA
@@ -13491,7 +13536,7 @@ pci:v00001039d00000900sv00001019sd00000A14*
ID_MODEL_FROM_DATABASE=SiS900 PCI Fast Ethernet (K7S5A motherboard)
pci:v00001039d00000900sv00001039sd00000900*
- ID_MODEL_FROM_DATABASE=SiS900 PCI Fast Ethernet (SiS900 10/100 Ethernet Adapter onboard [Asus P4SC-EA])
+ ID_MODEL_FROM_DATABASE=SiS900 PCI Fast Ethernet (SiS900 10/100 Ethernet Adapter onboard)
pci:v00001039d00000900sv00001043sd00008035*
ID_MODEL_FROM_DATABASE=SiS900 PCI Fast Ethernet (CUSI-FX motherboard)
@@ -13529,9 +13574,15 @@ pci:v00001039d00001180*
pci:v00001039d00001182*
ID_MODEL_FROM_DATABASE=SATA Controller / RAID mode
+pci:v00001039d00001182sv00001039sd00000180*
+ ID_MODEL_FROM_DATABASE=SATA Controller / RAID mode (SiS 966 4-port SATA controller)
+
pci:v00001039d00001183*
ID_MODEL_FROM_DATABASE=SATA Controller / IDE mode
+pci:v00001039d00001183sv00001039sd00000180*
+ ID_MODEL_FROM_DATABASE=SATA Controller / IDE mode (SiS 966 4-port SATA controller)
+
pci:v00001039d00001184*
ID_MODEL_FROM_DATABASE=AHCI Controller / RAID mode
@@ -13731,7 +13782,7 @@ pci:v00001039d00007012sv00001043sd0000818F*
ID_MODEL_FROM_DATABASE=SiS7012 AC'97 Sound Controller (A8S-X Motherboard)
pci:v00001039d00007012sv000013F6sd00000300*
- ID_MODEL_FROM_DATABASE=SiS7012 AC'97 Sound Controller (CMI9739(A) on ECS K7SOM+ motherboard)
+ ID_MODEL_FROM_DATABASE=SiS7012 AC'97 Sound Controller (CMI9739(A) on ECS K7S series motherboard)
pci:v00001039d00007012sv00001462sd00005850*
ID_MODEL_FROM_DATABASE=SiS7012 AC'97 Sound Controller (MSI 648 Max (MS-6585))
@@ -13838,6 +13889,9 @@ pci:v00001039d00007019*
pci:v00001039d00007502*
ID_MODEL_FROM_DATABASE=Azalia Audio Controller
+pci:v00001039d00007502sv00001043sd000081A1*
+ ID_MODEL_FROM_DATABASE=Azalia Audio Controller (P5SD2-FM/S mainboard)
+
pci:v0000103A*
ID_VENDOR_FROM_DATABASE=Seiko Epson Corporation
@@ -14951,6 +15005,9 @@ pci:v0000104Cd0000802Esv00001028sd0000018D*
pci:v0000104Cd00008031*
ID_MODEL_FROM_DATABASE=PCIxx21/x515 Cardbus Controller
+pci:v0000104Cd00008031sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=PCIxx21/x515 Cardbus Controller (Extensa 3000 series laptop)
+
pci:v0000104Cd00008031sv00001025sd00000080*
ID_MODEL_FROM_DATABASE=PCIxx21/x515 Cardbus Controller (Aspire 5024WLMi)
@@ -14966,6 +15023,9 @@ pci:v0000104Cd00008031sv0000103Csd0000308B*
pci:v0000104Cd00008032*
ID_MODEL_FROM_DATABASE=OHCI Compliant IEEE 1394 Host Controller
+pci:v0000104Cd00008032sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=OHCI Compliant IEEE 1394 Host Controller (Extensa 3000 series laptop)
+
pci:v0000104Cd00008032sv00001025sd00000080*
ID_MODEL_FROM_DATABASE=OHCI Compliant IEEE 1394 Host Controller (Aspire 5024WLMi)
@@ -14981,6 +15041,9 @@ pci:v0000104Cd00008032sv0000103Csd0000308B*
pci:v0000104Cd00008033*
ID_MODEL_FROM_DATABASE=PCIxx21 Integrated FlashMedia Controller
+pci:v0000104Cd00008033sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=PCIxx21 Integrated FlashMedia Controller (Extensa 3000 series laptop)
+
pci:v0000104Cd00008033sv00001025sd00000080*
ID_MODEL_FROM_DATABASE=PCIxx21 Integrated FlashMedia Controller (Aspire 5024WLMi)
@@ -17024,6 +17087,9 @@ pci:v00001077d00008020sv00001077sd0000020F*
pci:v00001077d00008020sv00001077sd00000210*
ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller (QME8242-k 10GbE Dual Port Mezzanine Card)
+pci:v00001077d00008020sv00001077sd00000233*
+ ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller (QME8262-k 10GbE Dual Port Mezzanine Card)
+
pci:v00001077d00008021*
ID_MODEL_FROM_DATABASE=8200 Series 10GbE Converged Network Adapter (FCoE)
@@ -23342,6 +23408,9 @@ pci:v000010DEd000000CC*
pci:v000010DEd000000CD*
ID_MODEL_FROM_DATABASE=NV42GL [Quadro FX 3450/4000 SDI]
+pci:v000010DEd000000CDsv000010DEsd0000029B*
+ ID_MODEL_FROM_DATABASE=NV42GL [Quadro FX 3450/4000 SDI] (Quadro FX 3450)
+
pci:v000010DEd000000CE*
ID_MODEL_FROM_DATABASE=NV41GL [Quadro FX 1400]
@@ -24155,6 +24224,12 @@ pci:v000010DEd000001D2*
pci:v000010DEd000001D3*
ID_MODEL_FROM_DATABASE=G72 [GeForce 7200 GS / 7300 SE]
+pci:v000010DEd000001D3sv00001043sd00008203*
+ ID_MODEL_FROM_DATABASE=G72 [GeForce 7200 GS / 7300 SE] (EN7300SE)
+
+pci:v000010DEd000001D3sv00001043sd00008250*
+ ID_MODEL_FROM_DATABASE=G72 [GeForce 7200 GS / 7300 SE] (EN7200GS)
+
pci:v000010DEd000001D5*
ID_MODEL_FROM_DATABASE=G72
@@ -26036,12 +26111,18 @@ pci:v000010DEd0000056A*
pci:v000010DEd0000056Asv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 [nForce 630i] USB 2.0 Controller (EHCI) (MCP73PVT-SM)
+pci:v000010DEd0000056Asv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 [nForce 630i] USB 2.0 Controller (EHCI) (I-N73V motherboard)
+
pci:v000010DEd0000056C*
ID_MODEL_FROM_DATABASE=MCP73 IDE
pci:v000010DEd0000056Csv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 IDE (MCP73PVT-SM)
+pci:v000010DEd0000056Csv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 IDE (I-N73V motherboard)
+
pci:v000010DEd0000056Csv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=MCP73 IDE (JW-IN7150-HD)
@@ -26051,6 +26132,9 @@ pci:v000010DEd0000056D*
pci:v000010DEd0000056Dsv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73PVT-SM)
+pci:v000010DEd0000056Dsv000010DEsd0000CB73*
+ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73 PCIe x16 port)
+
pci:v000010DEd0000056E*
ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge
@@ -26870,6 +26954,12 @@ pci:v000010DEd000007C1sv00001019sd0000297A*
pci:v000010DEd000007C2*
ID_MODEL_FROM_DATABASE=MCP73 Host Bridge
+pci:v000010DEd000007C3*
+ ID_MODEL_FROM_DATABASE=MCP73 Host Bridge
+
+pci:v000010DEd000007C3sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 Host Bridge (I-N73V motherboard)
+
pci:v000010DEd000007C5*
ID_MODEL_FROM_DATABASE=MCP73 Host Bridge
@@ -26879,6 +26969,9 @@ pci:v000010DEd000007C8*
pci:v000010DEd000007C8sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (MCP73PVT-SM)
+pci:v000010DEd000007C8sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (I-N73V motherboard)
+
pci:v000010DEd000007C8sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (JW-IN7150-HD)
@@ -26888,6 +26981,9 @@ pci:v000010DEd000007CB*
pci:v000010DEd000007CBsv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007CBsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007CBsv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26897,6 +26993,9 @@ pci:v000010DEd000007CD*
pci:v000010DEd000007CDsv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007CDsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007CDsv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26906,6 +27005,9 @@ pci:v000010DEd000007CE*
pci:v000010DEd000007CEsv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007CEsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007CEsv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26915,6 +27017,9 @@ pci:v000010DEd000007CF*
pci:v000010DEd000007CFsv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007CFsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007CFsv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26924,6 +27029,9 @@ pci:v000010DEd000007D0*
pci:v000010DEd000007D0sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007D0sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007D0sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26933,6 +27041,9 @@ pci:v000010DEd000007D1*
pci:v000010DEd000007D1sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007D1sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007D1sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26942,6 +27053,9 @@ pci:v000010DEd000007D2*
pci:v000010DEd000007D2sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007D2sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007D2sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26951,6 +27065,9 @@ pci:v000010DEd000007D3*
pci:v000010DEd000007D3sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007D3sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007D3sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26960,6 +27077,9 @@ pci:v000010DEd000007D6*
pci:v000010DEd000007D6sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
+pci:v000010DEd000007D6sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
+
pci:v000010DEd000007D6sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
@@ -26969,6 +27089,9 @@ pci:v000010DEd000007D7*
pci:v000010DEd000007D7sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 LPC Bridge (MCP73PVT-SM)
+pci:v000010DEd000007D7sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 LPC Bridge (I-N73V motherboard)
+
pci:v000010DEd000007D7sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=MCP73 LPC Bridge (JW-IN7150-HD)
@@ -26978,6 +27101,9 @@ pci:v000010DEd000007D8*
pci:v000010DEd000007D8sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 SMBus (MCP73PVT-SM)
+pci:v000010DEd000007D8sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 SMBus (I-N73V motherboard)
+
pci:v000010DEd000007D8sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=MCP73 SMBus (JW-IN7150-HD)
@@ -26987,6 +27113,9 @@ pci:v000010DEd000007D9*
pci:v000010DEd000007D9sv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (MCP73PVT-SM)
+pci:v000010DEd000007D9sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (I-N73V motherboard)
+
pci:v000010DEd000007D9sv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (JW-IN7150-HD)
@@ -26999,6 +27128,9 @@ pci:v000010DEd000007DAsv00001AFAsd00007150*
pci:v000010DEd000007DC*
ID_MODEL_FROM_DATABASE=MCP73 Ethernet
+pci:v000010DEd000007DCsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 Ethernet (I-N73V motherboard)
+
pci:v000010DEd000007DD*
ID_MODEL_FROM_DATABASE=MCP73 Ethernet
@@ -27026,12 +27158,18 @@ pci:v000010DEd000007E2*
pci:v000010DEd000007E3*
ID_MODEL_FROM_DATABASE=C73 [GeForce 7050 / nForce 610i]
+pci:v000010DEd000007E3sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=C73 [GeForce 7050 / nForce 610i] (I-N73V motherboard)
+
pci:v000010DEd000007E5*
ID_MODEL_FROM_DATABASE=C73 [GeForce 7100 / nForce 620i]
pci:v000010DEd000007F0*
ID_MODEL_FROM_DATABASE=MCP73 IDE
+pci:v000010DEd000007F0sv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 IDE (I-N73V motherboard)
+
pci:v000010DEd000007F4*
ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i SATA
@@ -27050,12 +27188,18 @@ pci:v000010DEd000007FCsv00001019sd0000297A*
pci:v000010DEd000007FCsv000010DEsd000007FC*
ID_MODEL_FROM_DATABASE=MCP73 High Definition Audio
+pci:v000010DEd000007FCsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 High Definition Audio (I-N73V motherboard)
+
pci:v000010DEd000007FE*
ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB
pci:v000010DEd000007FEsv00001019sd0000297A*
ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB (MCP73PVT-SM)
+pci:v000010DEd000007FEsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB (I-N73V motherboard)
+
pci:v000010DEd000007FEsv00001AFAsd00007150*
ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB (JW-IN7150-HD)
@@ -27305,6 +27449,9 @@ pci:v000010DEd00000A65*
pci:v000010DEd00000A65sv00001043sd00008334*
ID_MODEL_FROM_DATABASE=GT218 [GeForce 210] (EN210 SILENT)
+pci:v000010DEd00000A65sv00001462sd00008094*
+ ID_MODEL_FROM_DATABASE=GT218 [GeForce 210] (N210 [Geforce 210] PCIe graphics adapter)
+
pci:v000010DEd00000A66*
ID_MODEL_FROM_DATABASE=GT218 [GeForce 310]
@@ -27764,6 +27911,9 @@ pci:v000010DEd00000BE3sv00001028sd0000040B*
pci:v000010DEd00000BE3sv000010DEsd0000066D*
ID_MODEL_FROM_DATABASE=High Definition Audio Controller (G98 [GeForce 8400GS])
+pci:v000010DEd00000BE3sv00001462sd00008094*
+ ID_MODEL_FROM_DATABASE=High Definition Audio Controller (N210 [Geforce 210] PCIe graphics adapter)
+
pci:v000010DEd00000BE4*
ID_MODEL_FROM_DATABASE=High Definition Audio Controller
@@ -28160,6 +28310,9 @@ pci:v000010DEd00000FC6sv00001043sd00008428*
pci:v000010DEd00000FC8*
ID_MODEL_FROM_DATABASE=GK107 [GeForce GT 740]
+pci:v000010DEd00000FC9*
+ ID_MODEL_FROM_DATABASE=GK107 [GeForce GT 730]
+
pci:v000010DEd00000FCD*
ID_MODEL_FROM_DATABASE=GK107M [GeForce GT 755M]
@@ -28259,6 +28412,12 @@ pci:v000010DEd00000FE9*
pci:v000010DEd00000FEA*
ID_MODEL_FROM_DATABASE=GK107M [GeForce GT 755M Mac Edition]
+pci:v000010DEd00000FEC*
+ ID_MODEL_FROM_DATABASE=GK107M [GeForce 710A]
+
+pci:v000010DEd00000FED*
+ ID_MODEL_FROM_DATABASE=GK107M [GeForce 820M]
+
pci:v000010DEd00000FEF*
ID_MODEL_FROM_DATABASE=GK107GL [GRID K340]
@@ -28329,28 +28488,28 @@ pci:v000010DEd00001004sv00003842sd00001788*
ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX 780] (GK110B [GeForce GTX 780 Dual Classified w/ ACX Cooler])
pci:v000010DEd00001005*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan]
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN]
pci:v000010DEd00001005sv00001043sd00008451*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GTXTITAN-6GD5)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GTXTITAN-6GD5)
pci:v000010DEd00001005sv000010DEsd00001035*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GeForce GTX Titan)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GeForce GTX Titan)
pci:v000010DEd00001005sv00003842sd00002790*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GeForce GTX Titan)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GeForce GTX Titan)
pci:v000010DEd00001005sv00003842sd00002791*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GeForce GTX Titan SC)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GeForce GTX Titan SC)
pci:v000010DEd00001005sv00003842sd00002793*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GeForce GTX Titan SC Signature)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GeForce GTX Titan SC Signature)
pci:v000010DEd00001005sv00003842sd00002794*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GeForce GTX Titan SC Hydro Copper)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GeForce GTX Titan SC Hydro Copper)
pci:v000010DEd00001005sv00003842sd00002795*
- ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX Titan] (GeForce GTX Titan SC Hydro Copper Signature)
+ ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX TITAN] (GeForce GTX Titan SC Hydro Copper Signature)
pci:v000010DEd00001007*
ID_MODEL_FROM_DATABASE=GK110 [GeForce GTX 780 Rev. 2]
@@ -28362,7 +28521,7 @@ pci:v000010DEd0000100A*
ID_MODEL_FROM_DATABASE=GK110B [GeForce GTX 780 Ti]
pci:v000010DEd0000100C*
- ID_MODEL_FROM_DATABASE=GK110B [GeForce GTX Titan Black]
+ ID_MODEL_FROM_DATABASE=GK110B [GeForce GTX TITAN Black]
pci:v000010DEd0000101E*
ID_MODEL_FROM_DATABASE=GK110GL [Tesla K20X]
@@ -29723,6 +29882,9 @@ pci:v000010DEd000011C3sv000010DEsd00001030*
pci:v000010DEd000011C4*
ID_MODEL_FROM_DATABASE=GK106 [GeForce GTX 645 OEM]
+pci:v000010DEd000011C5*
+ ID_MODEL_FROM_DATABASE=GK106 [GeForce GT 740]
+
pci:v000010DEd000011C6*
ID_MODEL_FROM_DATABASE=GK106 [GeForce GTX 650 Ti]
@@ -29909,6 +30071,9 @@ pci:v000010DEd00001287*
pci:v000010DEd00001288*
ID_MODEL_FROM_DATABASE=GK208 [GeForce GT 720]
+pci:v000010DEd00001289*
+ ID_MODEL_FROM_DATABASE=GK208 [GeForce GT 710]
+
pci:v000010DEd00001290*
ID_MODEL_FROM_DATABASE=GK208M [GeForce GT 730M]
@@ -29933,6 +30098,9 @@ pci:v000010DEd00001292*
pci:v000010DEd00001292sv000017AAsd00003675*
ID_MODEL_FROM_DATABASE=GK208M [GeForce GT 740M] (GeForce GT 740A)
+pci:v000010DEd00001292sv000017AAsd0000367C*
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce GT 740M] (GeForce GT 740A)
+
pci:v000010DEd00001292sv000017AAsd00003684*
ID_MODEL_FROM_DATABASE=GK208M [GeForce GT 740M] (GeForce GT 740A)
@@ -29946,22 +30114,28 @@ pci:v000010DEd00001295*
ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M]
pci:v000010DEd00001295sv0000103Csd00002B0D*
- ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce GT 710A)
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 710A)
pci:v000010DEd00001295sv0000103Csd00002B0F*
- ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce GT 710A)
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 710A)
pci:v000010DEd00001295sv0000103Csd00002B11*
- ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce GT 710A)
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 710A)
pci:v000010DEd00001295sv0000103Csd00002B20*
ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 810A)
pci:v000010DEd00001295sv0000103Csd00002B21*
- ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce GT 810A)
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 810A)
pci:v000010DEd00001295sv0000103Csd00002B22*
- ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce GT 810A)
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 810A)
+
+pci:v000010DEd00001295sv000017AAsd0000367A*
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 805A)
+
+pci:v000010DEd00001295sv000017AAsd0000367C*
+ ID_MODEL_FROM_DATABASE=GK208M [GeForce 710M] (GeForce 710A)
pci:v000010DEd00001296*
ID_MODEL_FROM_DATABASE=GK208M [GeForce 825M]
@@ -29972,6 +30146,9 @@ pci:v000010DEd00001298*
pci:v000010DEd00001299*
ID_MODEL_FROM_DATABASE=GK208M [GeForce 920M]
+pci:v000010DEd0000129A*
+ ID_MODEL_FROM_DATABASE=GK208GL [N16V-GL]
+
pci:v000010DEd000012A0*
ID_MODEL_FROM_DATABASE=GK208
@@ -30005,6 +30182,9 @@ pci:v000010DEd00001346*
pci:v000010DEd00001347*
ID_MODEL_FROM_DATABASE=GM108M [GeForce 940M]
+pci:v000010DEd0000137A*
+ ID_MODEL_FROM_DATABASE=GM108GLM [Quadro K620M]
+
pci:v000010DEd00001380*
ID_MODEL_FROM_DATABASE=GM107 [GeForce GTX 750 Ti]
@@ -30092,6 +30272,9 @@ pci:v000010DEd000013D9*
pci:v000010DEd00001401*
ID_MODEL_FROM_DATABASE=GM206 [GeForce GTX 960]
+pci:v000010DEd000017C2*
+ ID_MODEL_FROM_DATABASE=GM200 [GeForce GTX TITAN X]
+
pci:v000010DEd000017F0*
ID_MODEL_FROM_DATABASE=GM200GL [Quadro M6000]
@@ -30101,6 +30284,21 @@ pci:v000010DF*
pci:v000010DFd00000720*
ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk)
+pci:v000010DFd00000720sv0000103Csd00001934*
+ ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk) (HP FlexFabric 20Gb 2-port 650M Adapter)
+
+pci:v000010DFd00000720sv0000103Csd00001935*
+ ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk) (HP FlexFabric 20Gb 2-port 650FLB Adapter)
+
+pci:v000010DFd00000720sv0000103Csd000021D4*
+ ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk) (HP StoreFabric CN1200E 10Gb Converged Network Adapter)
+
+pci:v000010DFd00000720sv0000103Csd0000220A*
+ ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk) (HP FlexFabric 10Gb 2-port 556FLR-SFP+ Adapter)
+
+pci:v000010DFd00000720sv0000103Csd0000803F*
+ ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk) (HP Ethernet 10Gb 2-port 557SFP+ Adapter)
+
pci:v000010DFd00000720sv000017AAsd00001056*
ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk) (ThinkServer OCm14102-UX-L AnyFabric)
@@ -32058,7 +32256,7 @@ pci:v00001106d00003038*
ID_MODEL_FROM_DATABASE=VT82xxxxx UHCI USB 1.1 Controller
pci:v00001106d00003038sv00000925sd00001234*
- ID_MODEL_FROM_DATABASE=VT82xxxxx UHCI USB 1.1 Controller (VA-502 Mainboard)
+ ID_MODEL_FROM_DATABASE=VT82xxxxx UHCI USB 1.1 Controller (onboard UHCI USB 1.1 Controller)
pci:v00001106d00003038sv00001019sd00000985*
ID_MODEL_FROM_DATABASE=VT82xxxxx UHCI USB 1.1 Controller (P6VXA Motherboard)
@@ -32145,7 +32343,7 @@ pci:v00001106d00003044sv0000103Csd00002A3B*
ID_MODEL_FROM_DATABASE=VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller (Media Center PC m7590n)
pci:v00001106d00003044sv00001043sd0000808A*
- ID_MODEL_FROM_DATABASE=VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller (A8V/A8N/P4P800 series motherboard)
+ ID_MODEL_FROM_DATABASE=VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller (A8V/A8N/P4P800/P5SD2 series motherboard)
pci:v00001106d00003044sv00001043sd000081FE*
ID_MODEL_FROM_DATABASE=VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller (Motherboard)
@@ -32408,6 +32606,9 @@ pci:v00001106d00003103*
pci:v00001106d00003104*
ID_MODEL_FROM_DATABASE=USB 2.0
+pci:v00001106d00003104sv00000925sd00001234*
+ ID_MODEL_FROM_DATABASE=USB 2.0 (onboard EHCI USB 2.0 Controller)
+
pci:v00001106d00003104sv00001019sd00000A81*
ID_MODEL_FROM_DATABASE=USB 2.0 (L7VTA v1.0 Motherboard (KT400-8235))
@@ -32813,6 +33014,9 @@ pci:v00001106d00003456*
pci:v00001106d0000345B*
ID_MODEL_FROM_DATABASE=VX11 Miscellaneous Bus
+pci:v00001106d00003483*
+ ID_MODEL_FROM_DATABASE=VL805 USB 3.0 Host Controller
+
pci:v00001106d00003A01*
ID_MODEL_FROM_DATABASE=VX11 Graphics [Chrome 645/640]
@@ -37382,6 +37586,9 @@ pci:v000011ABd00002A55*
pci:v000011ABd00002B36*
ID_MODEL_FROM_DATABASE=88W8764 [Avastar] 802.11n Wireless
+pci:v000011ABd00002B38*
+ ID_MODEL_FROM_DATABASE=88W8897 [AVASTAR] 802.11ac Wireless
+
pci:v000011ABd00004101*
ID_MODEL_FROM_DATABASE=OLPC Cafe Controller Secure Digital Controller
@@ -40241,6 +40448,9 @@ pci:v0000126Fd00000720*
pci:v0000126Fd00000730*
ID_MODEL_FROM_DATABASE=SM731 Cougar3DR
+pci:v0000126Fd00000750*
+ ID_MODEL_FROM_DATABASE=SM750
+
pci:v0000126Fd00000810*
ID_MODEL_FROM_DATABASE=SM810 LynxE
@@ -48599,6 +48809,9 @@ pci:v000014E4d00004401*
pci:v000014E4d00004401sv00001025sd00000035*
ID_MODEL_FROM_DATABASE=BCM4401 100Base-T (TravelMate 660)
+pci:v000014E4d00004401sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=BCM4401 100Base-T (Extensa 3000 series laptop)
+
pci:v000014E4d00004401sv0000103Csd000008B0*
ID_MODEL_FROM_DATABASE=BCM4401 100Base-T (tc1100 tablet)
@@ -49610,6 +49823,9 @@ pci:v000014F1d00008852sv00004254sd0000980C*
pci:v000014F1d00008880*
ID_MODEL_FROM_DATABASE=CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb
+pci:v000014F1d00008880sv00000070sd00002259*
+ ID_MODEL_FROM_DATABASE=CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb (WinTV HVR-1250)
+
pci:v000014F1d00008880sv00000070sd0000C108*
ID_MODEL_FROM_DATABASE=CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb (WinTV-HVR-4400-HD model 1278)
@@ -50675,6 +50891,9 @@ pci:v000015B3d000001FF*
pci:v000015B3d00000209*
ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4 Flash Recovery]
+pci:v000015B3d0000020B*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx Flash Recovery]
+
pci:v000015B3d00001002*
ID_MODEL_FROM_DATABASE=MT25400 Family [ConnectX-2 Virtual Function]
@@ -50687,6 +50906,12 @@ pci:v000015B3d00001003sv0000103Csd00001777*
pci:v000015B3d00001003sv0000103Csd000017C9*
ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (Infiniband QDR/Ethernet 10Gb 2-port 544i Adapter)
+pci:v000015B3d00001003sv0000103Csd000018CE*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (InfiniBand QDR/EN 10Gb Dual Port 544M Adapter)
+
+pci:v000015B3d00001003sv0000103Csd000018CF*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (InfiniBand FDR/EN 10/40Gb Dual Port 544M Adapter)
+
pci:v000015B3d00001003sv0000103Csd000018D6*
ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (InfiniBand FDR/EN 10/40Gb Dual Port 544QSFP Adapter)
@@ -50702,6 +50927,24 @@ pci:v000015B3d00001006*
pci:v000015B3d00001007*
ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro]
+pci:v000015B3d00001007sv0000103Csd000022F3*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+QSFP Adapter)
+
+pci:v000015B3d00001007sv0000103Csd000022F4*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter)
+
+pci:v000015B3d00001007sv0000117Csd00000090*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (FastFrame NQ41)
+
+pci:v000015B3d00001007sv0000117Csd00000091*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (FastFrame NQ42)
+
+pci:v000015B3d00001007sv0000117Csd00000092*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (FastFrame NQ11)
+
+pci:v000015B3d00001007sv0000117Csd00000093*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (FastFrame NQ12)
+
pci:v000015B3d00001009*
ID_MODEL_FROM_DATABASE=MT27530 Family
@@ -50739,10 +50982,10 @@ pci:v000015B3d00001014*
ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4 Virtual Function]
pci:v000015B3d00001015*
- ID_MODEL_FROM_DATABASE=MT27630 Family
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx]
pci:v000015B3d00001016*
- ID_MODEL_FROM_DATABASE=MT27631 Family
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx Virtual Function]
pci:v000015B3d00001017*
ID_MODEL_FROM_DATABASE=MT27640 Family
@@ -50798,6 +51041,12 @@ pci:v000015B3d00006732*
pci:v000015B3d0000673C*
ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE]
+pci:v000015B3d0000673Csv0000103Csd00001782*
+ ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (4X QDR InfiniBand Mezzanine HCA for c-Class BladeSystem)
+
+pci:v000015B3d0000673Csv000015B3sd00000021*
+ ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (HP InfiniBand 4X QDR CX-2 PCI-e G2 Dual Port HCA)
+
pci:v000015B3d00006746*
ID_MODEL_FROM_DATABASE=MT26438 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE Virtualization+]
@@ -50810,6 +51059,9 @@ pci:v000015B3d00006746sv0000103Csd00003349*
pci:v000015B3d00006750*
ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
+pci:v000015B3d00006750sv000015B3sd00000018*
+ ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] (HP 10 GbE PCI-e G2 Dual-Port NIC (rev C1))
+
pci:v000015B3d0000675A*
ID_MODEL_FROM_DATABASE=MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s]
@@ -51425,6 +51677,207 @@ pci:v0000165Ad0000D300*
pci:v0000165Ad0000EB01*
ID_MODEL_FROM_DATABASE=PIXCI(R) EB1 PCI Camera Link Video Capture Board
+pci:v0000165C*
+ ID_VENDOR_FROM_DATABASE=Gidel Ltd.
+
+pci:v0000165Cd00005361*
+ ID_MODEL_FROM_DATABASE=PROCStarII60-1
+
+pci:v0000165Cd00005362*
+ ID_MODEL_FROM_DATABASE=PROCStarII60-2
+
+pci:v0000165Cd00005364*
+ ID_MODEL_FROM_DATABASE=PROCStarII60-4
+
+pci:v0000165Cd00005435*
+ ID_MODEL_FROM_DATABASE=ProcSparkII
+
+pci:v0000165Cd00005661*
+ ID_MODEL_FROM_DATABASE=ProcE60
+
+pci:v0000165Cd000056E1*
+ ID_MODEL_FROM_DATABASE=ProcE180
+
+pci:v0000165Cd00005911*
+ ID_MODEL_FROM_DATABASE=ProcStarIII110-1
+
+pci:v0000165Cd00005912*
+ ID_MODEL_FROM_DATABASE=ProcStarIII110-2
+
+pci:v0000165Cd00005913*
+ ID_MODEL_FROM_DATABASE=ProcStarIII110-3
+
+pci:v0000165Cd00005914*
+ ID_MODEL_FROM_DATABASE=ProcStarIII110-4
+
+pci:v0000165Cd00005921*
+ ID_MODEL_FROM_DATABASE=ProcStarIII150-1
+
+pci:v0000165Cd00005922*
+ ID_MODEL_FROM_DATABASE=ProcStarIII150-2
+
+pci:v0000165Cd00005923*
+ ID_MODEL_FROM_DATABASE=ProcStarIII150-3
+
+pci:v0000165Cd00005924*
+ ID_MODEL_FROM_DATABASE=ProcStarIII150-4
+
+pci:v0000165Cd00005931*
+ ID_MODEL_FROM_DATABASE=ProcStarIII260-1
+
+pci:v0000165Cd00005932*
+ ID_MODEL_FROM_DATABASE=ProcStarIII260-2
+
+pci:v0000165Cd00005933*
+ ID_MODEL_FROM_DATABASE=ProcStarIII260-3
+
+pci:v0000165Cd00005934*
+ ID_MODEL_FROM_DATABASE=ProcStarIII260-4
+
+pci:v0000165Cd00005941*
+ ID_MODEL_FROM_DATABASE=ProcStarIII340-1
+
+pci:v0000165Cd00005942*
+ ID_MODEL_FROM_DATABASE=ProcStarIII340-2
+
+pci:v0000165Cd00005943*
+ ID_MODEL_FROM_DATABASE=ProcStarIII340-3
+
+pci:v0000165Cd00005944*
+ ID_MODEL_FROM_DATABASE=ProcStarIII340-4
+
+pci:v0000165Cd00005A01*
+ ID_MODEL_FROM_DATABASE=ProceIII80
+
+pci:v0000165Cd00005A11*
+ ID_MODEL_FROM_DATABASE=ProceIII110
+
+pci:v0000165Cd00005A21*
+ ID_MODEL_FROM_DATABASE=ProceIII150
+
+pci:v0000165Cd00005A31*
+ ID_MODEL_FROM_DATABASE=ProceIII260
+
+pci:v0000165Cd00005A41*
+ ID_MODEL_FROM_DATABASE=ProceIII340
+
+pci:v0000165Cd00005B51*
+ ID_MODEL_FROM_DATABASE=ProceIV360
+
+pci:v0000165Cd00005B61*
+ ID_MODEL_FROM_DATABASE=ProceIV530
+
+pci:v0000165Cd00005B71*
+ ID_MODEL_FROM_DATABASE=ProceIV820
+
+pci:v0000165Cd00005C01*
+ ID_MODEL_FROM_DATABASE=ProcStarIV80-1
+
+pci:v0000165Cd00005C02*
+ ID_MODEL_FROM_DATABASE=ProcStarIV80-2
+
+pci:v0000165Cd00005C03*
+ ID_MODEL_FROM_DATABASE=ProcStarIV80-3
+
+pci:v0000165Cd00005C04*
+ ID_MODEL_FROM_DATABASE=ProcStarIV80-4
+
+pci:v0000165Cd00005C11*
+ ID_MODEL_FROM_DATABASE=ProcStarIV110-1
+
+pci:v0000165Cd00005C12*
+ ID_MODEL_FROM_DATABASE=ProcStarIV110-2
+
+pci:v0000165Cd00005C13*
+ ID_MODEL_FROM_DATABASE=ProcStarIV110-3
+
+pci:v0000165Cd00005C14*
+ ID_MODEL_FROM_DATABASE=ProcStarIV110-4
+
+pci:v0000165Cd00005C51*
+ ID_MODEL_FROM_DATABASE=ProcStarIV360-1
+
+pci:v0000165Cd00005C52*
+ ID_MODEL_FROM_DATABASE=ProcStarIV360-2
+
+pci:v0000165Cd00005C53*
+ ID_MODEL_FROM_DATABASE=ProcStarIV360-3
+
+pci:v0000165Cd00005C54*
+ ID_MODEL_FROM_DATABASE=ProcStarIV360-4
+
+pci:v0000165Cd00005C61*
+ ID_MODEL_FROM_DATABASE=ProcStarIV530-1
+
+pci:v0000165Cd00005C62*
+ ID_MODEL_FROM_DATABASE=ProcStarIV530-2
+
+pci:v0000165Cd00005C63*
+ ID_MODEL_FROM_DATABASE=ProcStarIV530-3
+
+pci:v0000165Cd00005C64*
+ ID_MODEL_FROM_DATABASE=ProcStarIV530-4
+
+pci:v0000165Cd00005C71*
+ ID_MODEL_FROM_DATABASE=ProcStarIV820-1
+
+pci:v0000165Cd00005C72*
+ ID_MODEL_FROM_DATABASE=ProcStarIV820-2
+
+pci:v0000165Cd00005C73*
+ ID_MODEL_FROM_DATABASE=ProcStarIV820-3
+
+pci:v0000165Cd00005C74*
+ ID_MODEL_FROM_DATABASE=ProcStarIV820-4
+
+pci:v0000165Cd00005D01*
+ ID_MODEL_FROM_DATABASE=Proc10480
+
+pci:v0000165Cd00005D11*
+ ID_MODEL_FROM_DATABASE=Proc104110
+
+pci:v0000165Cd00005F01*
+ ID_MODEL_FROM_DATABASE=ProceV_A3
+
+pci:v0000165Cd00005F11*
+ ID_MODEL_FROM_DATABASE=ProceV_A7
+
+pci:v0000165Cd00005F21*
+ ID_MODEL_FROM_DATABASE=ProceV_AB
+
+pci:v0000165Cd00005F31*
+ ID_MODEL_FROM_DATABASE=ProceV_D5
+
+pci:v0000165Cd00005F41*
+ ID_MODEL_FROM_DATABASE=ProceV_D8
+
+pci:v0000165Cd00006732*
+ ID_MODEL_FROM_DATABASE=Proc6M
+
+pci:v0000165Cd00006832*
+ ID_MODEL_FROM_DATABASE=Proc12M
+
+pci:v0000165Cd00007101*
+ ID_MODEL_FROM_DATABASE=Proc10a_27
+
+pci:v0000165Cd00007111*
+ ID_MODEL_FROM_DATABASE=Proc10a_48
+
+pci:v0000165Cd00007121*
+ ID_MODEL_FROM_DATABASE=Proc10a_66
+
+pci:v0000165Cd00007141*
+ ID_MODEL_FROM_DATABASE=Proc10a_115
+
+pci:v0000165Cd00007181*
+ ID_MODEL_FROM_DATABASE=Proc10a_27S
+
+pci:v0000165Cd00007191*
+ ID_MODEL_FROM_DATABASE=Proc10a_48S
+
+pci:v0000165Cd000071A1*
+ ID_MODEL_FROM_DATABASE=Proc10a_66S
+
pci:v0000165D*
ID_VENDOR_FROM_DATABASE=Hsing Tech. Enterprise Co., Ltd.
@@ -52161,7 +52614,7 @@ pci:v0000168Cd00000037sv00001A3Bsd00002100*
ID_MODEL_FROM_DATABASE=AR9485 Wireless Network Adapter (AW-NB100H 802.11n Wireless Mini PCIe Card)
pci:v0000168Cd0000003C*
- ID_MODEL_FROM_DATABASE=QCA988x 802.11ac Wireless Network Adapter
+ ID_MODEL_FROM_DATABASE=QCA986x/988x 802.11ac Wireless Network Adapter
pci:v0000168Cd0000003E*
ID_MODEL_FROM_DATABASE=QCA6174 802.11ac Wireless Network Adapter
@@ -52956,7 +53409,10 @@ pci:v00001796d00000015*
ID_MODEL_FROM_DATABASE=SIS8100 [Gigabit link, MicroTCA]
pci:v00001797*
- ID_VENDOR_FROM_DATABASE=Techwell Inc.
+ ID_VENDOR_FROM_DATABASE=Intersil Techwell
+
+pci:v00001797d00005864*
+ ID_MODEL_FROM_DATABASE=TW5864 multimedia video controller
pci:v00001797d00006801*
ID_MODEL_FROM_DATABASE=TW6802 multimedia video card
@@ -53612,6 +54068,9 @@ pci:v00001814d00005360sv00001186sd00003C05*
pci:v00001814d00005360sv000020F4sd0000703A*
ID_MODEL_FROM_DATABASE=RT5360 Wireless 802.11n 1T/1R (TEW-703PI N150 Wireless PCI Adapter)
+pci:v00001814d00005362*
+ ID_MODEL_FROM_DATABASE=RT5362 PCI 802.11n Wireless Network Adapter
+
pci:v00001814d00005390*
ID_MODEL_FROM_DATABASE=RT5390 Wireless 802.11n 1T/1R PCIe
@@ -54167,6 +54626,9 @@ pci:v000018F4d00000145*
pci:v000018F4d00000155*
ID_MODEL_FROM_DATABASE=NT100E3-1-PTP Network Adapter 1x100Gb
+pci:v000018F4d00000175*
+ ID_MODEL_FROM_DATABASE=NT20E3-2-PTP Network Adapter 2x10Gb
+
pci:v000018F6*
ID_VENDOR_FROM_DATABASE=NextIO
@@ -54567,6 +55029,9 @@ pci:v00001924d00000903sv00001924sd0000800B*
ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter)
pci:v00001924d00000903sv00001924sd0000800C*
+ ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter)
+
+pci:v00001924d00000903sv00001924sd0000800D*
ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x02F-R3 Flareon 7000 Series 10G Adapter)
pci:v00001924d00000923*
@@ -54575,6 +55040,9 @@ pci:v00001924d00000923*
pci:v00001924d00000923sv00001924sd0000800B*
ID_MODEL_FROM_DATABASE=SFC9140 (SFN7x42Q-R1 Flareon Ultra 7000 Series 10/40G Adapter)
+pci:v00001924d00000923sv00001924sd0000800E*
+ ID_MODEL_FROM_DATABASE=SFC9140 (SFN7x42Q-R2 Flareon Ultra 7000 Series 10/40G Adapter)
+
pci:v00001924d00001803*
ID_MODEL_FROM_DATABASE=SFC9020 Virtual Function [Solarstorm]
@@ -54962,6 +55430,9 @@ pci:v00001957d0000C006*
pci:v00001957d0000C006sv00001A56sd00001201*
ID_MODEL_FROM_DATABASE=MPC8308 (Killer E2100 Gigabit Ethernet Controller)
+pci:v00001957d0000FC02*
+ ID_MODEL_FROM_DATABASE=RedStone
+
pci:v00001958*
ID_VENDOR_FROM_DATABASE=Faster Technology, LLC.
@@ -55946,6 +56417,9 @@ pci:v00001B21d00001080sv00001849sd00001080*
pci:v00001B21d00001142*
ID_MODEL_FROM_DATABASE=ASM1042A USB 3.0 Host Controller
+pci:v00001B21d00001242*
+ ID_MODEL_FROM_DATABASE=ASM1142 USB 3.1 Host Controller
+
pci:v00001B2C*
ID_VENDOR_FROM_DATABASE=Opal-RT Technologies Inc.
@@ -56261,6 +56735,18 @@ pci:v00001BF4d00000001*
pci:v00001BFD*
ID_VENDOR_FROM_DATABASE=EeeTOP
+pci:v00001C09*
+ ID_VENDOR_FROM_DATABASE=CSP, Inc.
+
+pci:v00001C09d00004254*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8D-2S
+
+pci:v00001C09d00004255*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8D-Q
+
+pci:v00001C09d00004256*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8D-2S
+
pci:v00001C1C*
ID_VENDOR_FROM_DATABASE=Symphony
@@ -56324,6 +56810,12 @@ pci:v00001C44*
pci:v00001C44d00008000*
ID_MODEL_FROM_DATABASE=8000 Storage IO Controller
+pci:v00001C58*
+ ID_VENDOR_FROM_DATABASE=HGST, Inc.
+
+pci:v00001C58d00000003*
+ ID_MODEL_FROM_DATABASE=Ultrastar SN100 Series NVMe SSD
+
pci:v00001C7E*
ID_VENDOR_FROM_DATABASE=TTTech Computertechnik AG
@@ -56381,6 +56873,9 @@ pci:v00001D26d00000040*
pci:v00001D26d0000E004*
ID_MODEL_FROM_DATABASE=AB01/EMB01 Development Board
+pci:v00001D40*
+ ID_VENDOR_FROM_DATABASE=Techman Electronics (Changshu) Co., Ltd.
+
pci:v00001D44*
ID_VENDOR_FROM_DATABASE=DPT
@@ -56495,6 +56990,15 @@ pci:v00001FC9d00003314sv00000000sd00003012*
pci:v00001FC9d00003314sv00000000sd00003014*
ID_MODEL_FROM_DATABASE=10-Giga TOE Dual Port Low Profile SmartNIC (10-Giga TOE Dual Port CX4 Low Profile SmartNIC)
+pci:v00001FCC*
+ ID_VENDOR_FROM_DATABASE=StreamLabs
+
+pci:v00001FCCd0000F416*
+ ID_MODEL_FROM_DATABASE=MS416
+
+pci:v00001FCCd0000FB01*
+ ID_MODEL_FROM_DATABASE=MH4LM
+
pci:v00001FCE*
ID_VENDOR_FROM_DATABASE=Cognio Inc.
@@ -56993,6 +57497,30 @@ pci:v00004254*
pci:v00004321*
ID_VENDOR_FROM_DATABASE=Tata Power Strategic Electronics Division
+pci:v00004348*
+ ID_VENDOR_FROM_DATABASE=WCH.CN
+
+pci:v00004348d00002273*
+ ID_MODEL_FROM_DATABASE=CH351 PCI Dual Serial Port Controller
+
+pci:v00004348d00003253*
+ ID_MODEL_FROM_DATABASE=CH352 PCI Dual Serial Port Controller
+
+pci:v00004348d00003453*
+ ID_MODEL_FROM_DATABASE=CH353 PCI Quad Serial Port Controller
+
+pci:v00004348d00005053*
+ ID_MODEL_FROM_DATABASE=CH352 PCI Serial and Parallel Port Controller
+
+pci:v00004348d00007053*
+ ID_MODEL_FROM_DATABASE=CH353 PCI Dual Serial and Parallel Ports Controller
+
+pci:v00004348d00007073*
+ ID_MODEL_FROM_DATABASE=CH356 PCI Quad Serial and Parallel Ports Controller
+
+pci:v00004348d00007173*
+ ID_MODEL_FROM_DATABASE=CH355 PCI Quad Serial Port Controller
+
pci:v0000434E*
ID_VENDOR_FROM_DATABASE=CAST Navigation LLC
@@ -58055,6 +58583,9 @@ pci:v00005853*
pci:v00005853d00000001*
ID_MODEL_FROM_DATABASE=Xen Platform Device
+pci:v00005853d0000C000*
+ ID_MODEL_FROM_DATABASE=Citrix XenServer PCI Device for Windows Update
+
pci:v00005853d0000C110*
ID_MODEL_FROM_DATABASE=Virtualized HID
@@ -58739,11 +59270,11 @@ pci:v00008086d0000041A*
pci:v00008086d0000041E*
ID_MODEL_FROM_DATABASE=4th Generation Core Processor Family Integrated Graphics Controller
-pci:v00008086d00000433*
- ID_MODEL_FROM_DATABASE=Coleto Creek ACC - ME/CPM interface
+pci:v00008086d00000434*
+ ID_MODEL_FROM_DATABASE=DH89XXCC Series QAT
pci:v00008086d00000435*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCIe Endpoint
+ ID_MODEL_FROM_DATABASE=DH895XCC Series QAT
pci:v00008086d00000436*
ID_MODEL_FROM_DATABASE=DH8900CC Null Device
@@ -58760,6 +59291,12 @@ pci:v00008086d0000043C*
pci:v00008086d00000440*
ID_MODEL_FROM_DATABASE=DH8900CC Series Gigabit SFP Network Connection
+pci:v00008086d00000442*
+ ID_MODEL_FROM_DATABASE=DH89XXCC Series QAT Virtual Function
+
+pci:v00008086d00000443*
+ ID_MODEL_FROM_DATABASE=DH895XCC Series QAT Virtual Function
+
pci:v00008086d00000482*
ID_MODEL_FROM_DATABASE=82375EB/SB PCI to EISA Bridge
@@ -59699,6 +60236,18 @@ pci:v00008086d00000C49*
pci:v00008086d00000C4E*
ID_MODEL_FROM_DATABASE=Atom Processor S1200 NTB Primary
+pci:v00008086d00000C50*
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QuickData Technology Device
+
+pci:v00008086d00000C51*
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QuickData Technology Device
+
+pci:v00008086d00000C52*
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QuickData Technology Device
+
+pci:v00008086d00000C53*
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QuickData Technology Device
+
pci:v00008086d00000C54*
ID_MODEL_FROM_DATABASE=Atom Processor S1200 Internal
@@ -62690,6 +63239,9 @@ pci:v00008086d00001528sv0000103Csd00002004*
pci:v00008086d00001528sv0000103Csd0000211A*
ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (Ethernet 10Gb 2-port 561T Adapter)
+pci:v00008086d00001528sv0000108Esd00004853*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2
+
pci:v00008086d00001528sv0000108Esd00007B14*
ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (Sun Dual Port 10 GbE PCIe 2.0 ExpressModule, Base-T)
@@ -62720,6 +63272,9 @@ pci:v00008086d00001528sv00008086sd00001F61*
pci:v00008086d00001528sv00008086sd00005003*
ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (Ethernet 10G 2P X540-t Adapter)
+pci:v00008086d00001528sv00008086sd00005004*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (Ethernet 10G 2P X540-t Adapter)
+
pci:v00008086d00001529*
ID_MODEL_FROM_DATABASE=82599 10 Gigabit Dual Port Network Connection with FCoE
@@ -62858,6 +63413,12 @@ pci:v00008086d00001572*
pci:v00008086d00001572sv00001028sd00001F99*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 10G 4P X710/I350 rNDC)
+pci:v00008086d00001572sv0000103Csd000022FC*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (HP Ethernet 10Gb 2-port 562FLR-SFP+ Adapter)
+
+pci:v00008086d00001572sv0000103Csd000022FD*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (HP Ethernet 10Gb 2-port 562SFP+ Adapter)
+
pci:v00008086d00001572sv00001137sd00000000*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged NIC X710-4)
@@ -62894,6 +63455,21 @@ pci:v00008086d00001572sv00008086sd00000007*
pci:v00008086d00001572sv00008086sd00000008*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged Network Adapter X710-2)
+pci:v00008086d00001572sv00008086sd00000009*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
+
+pci:v00008086d00001572sv00008086sd0000000A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
+
+pci:v00008086d00001572sv00008086sd0000000D*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
+
+pci:v00008086d00001572sv00008086sd00004005*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Controller XL710 for 10 Gigabit SFP+)
+
+pci:v00008086d00001572sv00008086sd00004006*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
+
pci:v00008086d0000157B*
ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection
@@ -62912,6 +63488,12 @@ pci:v00008086d00001581sv00001028sd00001F98*
pci:v00008086d00001583*
ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+
+pci:v00008086d00001583sv00001028sd00000000*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+ (Ethernet 40G 2P XL710 QSFP+ rNDC)
+
+pci:v00008086d00001583sv00001028sd00001F9F*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+ (Ethernet 40G 2P XL710 QSFP+ rNDC)
+
pci:v00008086d00001583sv0000108Esd00000000*
ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+ (Oracle 10 Gb and 40 Gb Ethernet Adapter)
@@ -62936,6 +63518,9 @@ pci:v00008086d00001583sv00008086sd00000002*
pci:v00008086d00001583sv00008086sd00000003*
ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+ (Ethernet I/O Module XL710-Q2)
+pci:v00008086d00001583sv00008086sd00000006*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+ (Ethernet Converged Network Adapter XL710-Q2)
+
pci:v00008086d00001584*
ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 40GbE QSFP+
@@ -62963,6 +63548,39 @@ pci:v00008086d00001586sv0000108Esd00000000*
pci:v00008086d00001586sv0000108Esd00004857*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T
+pci:v00008086d00001587*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane
+
+pci:v00008086d00001587sv0000103Csd00000000*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (HP Flex-20 20Gb 2-port 660FLB Adapter)
+
+pci:v00008086d00001587sv0000103Csd000022FE*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (HP Flex-20 20Gb 2-port 660FLB Adapter)
+
+pci:v00008086d00001587sv0000103Csd000022FF*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (HP Flex-20 20Gb 2-port 660M Adapter)
+
+pci:v00008086d00001588*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane
+
+pci:v00008086d00001588sv0000103Csd00000000*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (HP Flex-20 20Gb 2-port 660M Adapter)
+
+pci:v00008086d00001588sv0000103Csd000022FF*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (HP Flex-20 20Gb 2-port 660M Adapter)
+
+pci:v00008086d00001589*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T
+
+pci:v00008086d00001589sv00008086sd00000000*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T)
+
+pci:v00008086d00001589sv00008086sd00000001*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T4)
+
+pci:v00008086d00001589sv00008086sd00000002*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T4)
+
pci:v00008086d000015A0*
ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I218-LM
@@ -63056,6 +63674,9 @@ pci:v00008086d00001614*
pci:v00008086d00001616*
ID_MODEL_FROM_DATABASE=Broadwell-U Integrated Graphics
+pci:v00008086d00001616sv0000103Csd00002216*
+ ID_MODEL_FROM_DATABASE=Broadwell-U Integrated Graphics (ZBook 15u G2 Mobile Workstation)
+
pci:v00008086d00001618*
ID_MODEL_FROM_DATABASE=Broadwell-U Host Bridge - DMI
@@ -64269,10 +64890,10 @@ pci:v00008086d00001F16*
ID_MODEL_FROM_DATABASE=Atom processor C2000 RCEC
pci:v00008086d00001F18*
- ID_MODEL_FROM_DATABASE=Atom processor C2000 nCPM
+ ID_MODEL_FROM_DATABASE=Atom processor C2000 QAT
pci:v00008086d00001F19*
- ID_MODEL_FROM_DATABASE=Atom processor C2000 nCPM
+ ID_MODEL_FROM_DATABASE=Atom processor C2000 QAT
pci:v00008086d00001F20*
ID_MODEL_FROM_DATABASE=Atom processor C2000 4-Port IDE SATA2 Controller
@@ -64545,64 +65166,64 @@ pci:v00008086d00002365*
ID_MODEL_FROM_DATABASE=DH89xxCC MEI 1
pci:v00008086d00002390*
- ID_MODEL_FROM_DATABASE=Coleto Creek LPC Controller
+ ID_MODEL_FROM_DATABASE=DH895XCC Series LPC Controller
pci:v00008086d000023A1*
- ID_MODEL_FROM_DATABASE=Coleto Creek 2-Port SATA Controller [IDE Mode]
+ ID_MODEL_FROM_DATABASE=DH895XCC Series 2-Port SATA Controller [IDE Mode]
pci:v00008086d000023A3*
- ID_MODEL_FROM_DATABASE=Coleto Creek 4-Port SATA Controller [AHCI Mode]
+ ID_MODEL_FROM_DATABASE=DH895XCC Series 4-Port SATA Controller [AHCI Mode]
pci:v00008086d000023A6*
- ID_MODEL_FROM_DATABASE=Coleto Creek 2-Port SATA Controller [IDE Mode]
+ ID_MODEL_FROM_DATABASE=DH895XCC Series 2-Port SATA Controller [IDE Mode]
pci:v00008086d000023B0*
- ID_MODEL_FROM_DATABASE=Coleto Creek SMBus Controller
+ ID_MODEL_FROM_DATABASE=DH895XCC Series SMBus Controller
pci:v00008086d000023B1*
- ID_MODEL_FROM_DATABASE=Coleto Creek CHAP Counter
+ ID_MODEL_FROM_DATABASE=DH895XCC Series CHAP Counter
pci:v00008086d000023B2*
- ID_MODEL_FROM_DATABASE=Coleto Creek Thermal Management Controller
+ ID_MODEL_FROM_DATABASE=DH895XCC Series Thermal Management Controller
pci:v00008086d000023B4*
- ID_MODEL_FROM_DATABASE=Coleto Creek USB2 Enhanced Host Controller #1
+ ID_MODEL_FROM_DATABASE=DH895XCC Series USB2 Enhanced Host Controller #1
pci:v00008086d000023B5*
- ID_MODEL_FROM_DATABASE=Coleto Creek USB2 Enhanced Host Controller #1
+ ID_MODEL_FROM_DATABASE=DH895XCC Series USB2 Enhanced Host Controller #1
pci:v00008086d000023C2*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #1
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #1
pci:v00008086d000023C3*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #1
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #1
pci:v00008086d000023C4*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #2
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #2
pci:v00008086d000023C5*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #2
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #2
pci:v00008086d000023C6*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #3
+ ID_MODEL_FROM_DATABASE=CDH895XCC Series PCI Express Root Port #3
pci:v00008086d000023C7*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #3
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #3
pci:v00008086d000023C8*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #4
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #4
pci:v00008086d000023C9*
- ID_MODEL_FROM_DATABASE=Coleto Creek PCI Express Root Port #4
+ ID_MODEL_FROM_DATABASE=DH895XCC Series PCI Express Root Port #4
pci:v00008086d000023E0*
- ID_MODEL_FROM_DATABASE=Coleto Creek Watchdog Timer
+ ID_MODEL_FROM_DATABASE=DH895XCC Series Watchdog Timer
pci:v00008086d000023E4*
- ID_MODEL_FROM_DATABASE=Coleto Creek MEI Controller #1
+ ID_MODEL_FROM_DATABASE=DH895XCC Series MEI Controller #1
pci:v00008086d000023E5*
- ID_MODEL_FROM_DATABASE=Coleto Creek MEI Controller #2
+ ID_MODEL_FROM_DATABASE=DH895XCC Series MEI Controller #2
pci:v00008086d00002410*
ID_MODEL_FROM_DATABASE=82801AA ISA Bridge (LPC)
@@ -65303,6 +65924,9 @@ pci:v00008086d000024C2sv00001014sd0000052D*
pci:v00008086d000024C2sv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (TravelMate 290)
+pci:v00008086d000024C2sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024C2sv00001028sd00000126*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (Optiplex GX260)
@@ -65378,6 +66002,9 @@ pci:v00008086d000024C3sv00001014sd0000052D*
pci:v00008086d000024C3sv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (TravelMate 290)
+pci:v00008086d000024C3sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024C3sv00001028sd00000126*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (Optiplex GX260)
@@ -65441,6 +66068,9 @@ pci:v00008086d000024C4sv00001014sd0000052D*
pci:v00008086d000024C4sv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (TravelMate 290)
+pci:v00008086d000024C4sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024C4sv00001028sd00000126*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (Optiplex GX260)
@@ -65513,6 +66143,9 @@ pci:v00008086d000024C5sv00001014sd0000055F*
pci:v00008086d000024C5sv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (TravelMate 290)
+pci:v00008086d000024C5sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024C5sv00001028sd00000139*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (Latitude D400)
@@ -65591,6 +66224,9 @@ pci:v00008086d000024C6sv00001025sd0000003C*
pci:v00008086d000024C6sv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (TravelMate 290)
+pci:v00008086d000024C6sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024C6sv00001028sd00000196*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (Inspiron 5160)
@@ -65636,6 +66272,9 @@ pci:v00008086d000024C7sv00001014sd0000052D*
pci:v00008086d000024C7sv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (TravelMate 290)
+pci:v00008086d000024C7sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024C7sv00001028sd00000126*
ID_MODEL_FROM_DATABASE=82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (Optiplex GX260)
@@ -65699,6 +66338,9 @@ pci:v00008086d000024CAsv00001014sd0000052D*
pci:v00008086d000024CAsv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DBM (ICH4-M) IDE Controller (TravelMate 290)
+pci:v00008086d000024CAsv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DBM (ICH4-M) IDE Controller (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024CAsv00001028sd0000014F*
ID_MODEL_FROM_DATABASE=82801DBM (ICH4-M) IDE Controller (Latitude X300)
@@ -65789,6 +66431,9 @@ pci:v00008086d000024CDsv00001014sd0000052E*
pci:v00008086d000024CDsv00001025sd0000005A*
ID_MODEL_FROM_DATABASE=82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (TravelMate 290)
+pci:v00008086d000024CDsv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (Extensa 3000 series laptop: Intel 82801DBM (ICH4-M))
+
pci:v00008086d000024CDsv00001028sd0000011D*
ID_MODEL_FROM_DATABASE=82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (Latitude D600)
@@ -68960,6 +69605,9 @@ pci:v00008086d00002822sv00001028sd0000020D*
pci:v00008086d00002822sv0000103Csd00002A6F*
ID_MODEL_FROM_DATABASE=SATA Controller [RAID mode] (Asus IPIBL-LB Motherboard)
+pci:v00008086d00002822sv00001043sd00008277*
+ ID_MODEL_FROM_DATABASE=SATA Controller [RAID mode] (P5K PRO Motherboard)
+
pci:v00008086d00002823*
ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode]
@@ -69647,6 +70295,9 @@ pci:v00008086d00002921sv00001462sd00007360*
pci:v00008086d00002922*
ID_MODEL_FROM_DATABASE=82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode]
+pci:v00008086d00002922sv00001043sd00008277*
+ ID_MODEL_FROM_DATABASE=82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (P5K PRO Motherboard)
+
pci:v00008086d00002922sv00001AF4sd00001100*
ID_MODEL_FROM_DATABASE=82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (QEMU Virtual Machine)
@@ -71055,13 +71706,13 @@ pci:v00008086d00002D10*
ID_MODEL_FROM_DATABASE=Core Processor QPI Link 0
pci:v00008086d00002D11*
- ID_MODEL_FROM_DATABASE=1st Generation Core Processor QPI Physical 0
+ ID_MODEL_FROM_DATABASE=1st Generation Core i3/5/7 Processor QPI Physical 0
pci:v00008086d00002D12*
- ID_MODEL_FROM_DATABASE=1st Generation Core Processor Reserved
+ ID_MODEL_FROM_DATABASE=1st Generation Core i3/5/7 Processor Reserved
pci:v00008086d00002D13*
- ID_MODEL_FROM_DATABASE=1st Generation Core Processor Reserved
+ ID_MODEL_FROM_DATABASE=1st Generation Core i3/5/7 Processor Reserved
pci:v00008086d00002D81*
ID_MODEL_FROM_DATABASE=Xeon 5600 Series QuickPath Architecture System Address Decoder
@@ -72170,6 +72821,9 @@ pci:v00008086d00003580*
pci:v00008086d00003580sv00001014sd0000055C*
ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (ThinkPad R50e)
+pci:v00008086d00003580sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (Extensa 3000 series laptop)
+
pci:v00008086d00003580sv00001028sd00000139*
ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (Latitude D400)
@@ -72266,6 +72920,9 @@ pci:v00008086d00003584*
pci:v00008086d00003584sv00001014sd0000055D*
ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (ThinkPad R50e)
+pci:v00008086d00003584sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (Extensa 3000 series laptop)
+
pci:v00008086d00003584sv00001028sd00000139*
ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (Latitude D400)
@@ -72308,6 +72965,9 @@ pci:v00008086d00003585*
pci:v00008086d00003585sv00001014sd0000055E*
ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (ThinkPad R50e)
+pci:v00008086d00003585sv00001025sd00000064*
+ ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (Extensa 3000 series laptop)
+
pci:v00008086d00003585sv00001028sd00000139*
ID_MODEL_FROM_DATABASE=82852/82855 GM/GME/PM/GMV Processor to I/O Controller (Latitude D400)
@@ -73797,7 +74457,7 @@ pci:v00008086d00004220sv0000103Csd000012F6*
ID_MODEL_FROM_DATABASE=PRO/Wireless 2200BG [Calexico2] Network Connection (nc6120/nx8220/nw8240)
pci:v00008086d00004220sv00008086sd00002701*
- ID_MODEL_FROM_DATABASE=PRO/Wireless 2200BG [Calexico2] Network Connection (WM3B2300BG Mini-PCI Card)
+ ID_MODEL_FROM_DATABASE=PRO/Wireless 2200BG [Calexico2] Network Connection (WM3B2200BG Mini-PCI Card)
pci:v00008086d00004220sv00008086sd00002712*
ID_MODEL_FROM_DATABASE=PRO/Wireless 2200BG [Calexico2] Network Connection (IBM ThinkPad R50e)
@@ -74274,487 +74934,487 @@ pci:v00008086d000065FF*
ID_MODEL_FROM_DATABASE=5100 Chipset DMA Engine
pci:v00008086d00006F00*
- ID_MODEL_FROM_DATABASE=Broadwell DMI2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DMI2
pci:v00008086d00006F01*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 0
pci:v00008086d00006F02*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 1
pci:v00008086d00006F03*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 1
pci:v00008086d00006F04*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 2
pci:v00008086d00006F05*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 2
pci:v00008086d00006F06*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 2
pci:v00008086d00006F07*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 2
pci:v00008086d00006F08*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 3
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 3
pci:v00008086d00006F09*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 3
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 3
pci:v00008086d00006F0A*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 3
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 3
pci:v00008086d00006F0B*
- ID_MODEL_FROM_DATABASE=Broadwell PCI Express Root Port 3
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family PCI Express Root Port 3
pci:v00008086d00006F10*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F11*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F12*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F13*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F14*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F15*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F16*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F17*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F18*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F19*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F1A*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F1B*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F1C*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Debug
pci:v00008086d00006F1D*
- ID_MODEL_FROM_DATABASE=Broadwell R2PCIe Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R2PCIe Agent
pci:v00008086d00006F1E*
- ID_MODEL_FROM_DATABASE=Broadwell Ubox
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Ubox
pci:v00008086d00006F1F*
- ID_MODEL_FROM_DATABASE=Broadwell Ubox
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Ubox
pci:v00008086d00006F20*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 0
pci:v00008086d00006F21*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 1
pci:v00008086d00006F22*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 2
pci:v00008086d00006F23*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 3
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 3
pci:v00008086d00006F24*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 4
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 4
pci:v00008086d00006F25*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 5
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 5
pci:v00008086d00006F26*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 6
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 6
pci:v00008086d00006F27*
- ID_MODEL_FROM_DATABASE=Broadwell-DE Crystal Beach DMA Channel 7
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Crystal Beach DMA Channel 7
pci:v00008086d00006F28*
- ID_MODEL_FROM_DATABASE=Broadwell Adress Map/VTd_Misc/System Management
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Map/VTd_Misc/System Management
pci:v00008086d00006F29*
- ID_MODEL_FROM_DATABASE=Broadwell IIO Hot Plug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO Hot Plug
pci:v00008086d00006F2A*
- ID_MODEL_FROM_DATABASE=Broadwell IIO RAS/Control Status/Global Errors
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IIO RAS/Control Status/Global Errors
pci:v00008086d00006F2C*
- ID_MODEL_FROM_DATABASE=Broadwell I/O APIC
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family I/O APIC
pci:v00008086d00006F30*
- ID_MODEL_FROM_DATABASE=Broadwell Home Agent 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Home Agent 0
pci:v00008086d00006F32*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 0
pci:v00008086d00006F33*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 1
pci:v00008086d00006F34*
- ID_MODEL_FROM_DATABASE=Broadwell R2PCIe Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R2PCIe Agent
pci:v00008086d00006F36*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link 0/1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link 0/1
pci:v00008086d00006F37*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link 0/1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link 0/1
pci:v00008086d00006F38*
- ID_MODEL_FROM_DATABASE=Broadwell Home Agent 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Home Agent 1
pci:v00008086d00006F39*
- ID_MODEL_FROM_DATABASE=Broadwell IO Performance Monitoring
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family IO Performance Monitoring
pci:v00008086d00006F3A*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 2
pci:v00008086d00006F3E*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link 2
pci:v00008086d00006F3F*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link 2
pci:v00008086d00006F40*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 2
pci:v00008086d00006F41*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link 2
pci:v00008086d00006F43*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 2
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 2
pci:v00008086d00006F45*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 2 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 2 Debug
pci:v00008086d00006F46*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 2 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 2 Debug
pci:v00008086d00006F47*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 2 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 2 Debug
pci:v00008086d00006F60*
- ID_MODEL_FROM_DATABASE=Broadwell Home Agent 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Home Agent 1
pci:v00008086d00006F68*
- ID_MODEL_FROM_DATABASE=Broadwell Target Address/Thermal/RAS
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Target Address/Thermal/RAS
pci:v00008086d00006F6A*
- ID_MODEL_FROM_DATABASE=Broadwell Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Channel Target Address Decoder
pci:v00008086d00006F6B*
- ID_MODEL_FROM_DATABASE=Broadwell Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Channel Target Address Decoder
pci:v00008086d00006F6C*
- ID_MODEL_FROM_DATABASE=Broadwell Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Channel Target Address Decoder
pci:v00008086d00006F6D*
- ID_MODEL_FROM_DATABASE=Broadwell Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Channel Target Address Decoder
pci:v00008086d00006F6E*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 2/3 Broadcast
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 2/3 Broadcast
pci:v00008086d00006F6F*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Global Broadcast
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Global Broadcast
pci:v00008086d00006F70*
- ID_MODEL_FROM_DATABASE=Broadwell Home Agent 0 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Home Agent 0 Debug
pci:v00008086d00006F71*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Target Address/Thermal/RAS
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Target Address/Thermal/RAS
pci:v00008086d00006F76*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link Debug
pci:v00008086d00006F78*
- ID_MODEL_FROM_DATABASE=Broadwell Home Agent 1 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Home Agent 1 Debug
pci:v00008086d00006F79*
- ID_MODEL_FROM_DATABASE=Broadwell Target Address/Thermal/RAS
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Target Address/Thermal/RAS
pci:v00008086d00006F7D*
- ID_MODEL_FROM_DATABASE=Broadwell Ubox
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Ubox
pci:v00008086d00006F7E*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link Debug
pci:v00008086d00006F80*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 0
pci:v00008086d00006F81*
- ID_MODEL_FROM_DATABASE=Broadwell R3 QPI Link 0/1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family R3 QPI Link 0/1
pci:v00008086d00006F83*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 0
pci:v00008086d00006F85*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 0 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 0 Debug
pci:v00008086d00006F86*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 0 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 0 Debug
pci:v00008086d00006F87*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 0 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 0 Debug
pci:v00008086d00006F88*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006F8A*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006F90*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 1
pci:v00008086d00006F93*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 1
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 1
pci:v00008086d00006F95*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 1 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 1 Debug
pci:v00008086d00006F96*
- ID_MODEL_FROM_DATABASE=Broadwell QPI Link 1 Debug
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family QPI Link 1 Debug
pci:v00008086d00006F98*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006F99*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006F9A*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006F9C*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FA0*
- ID_MODEL_FROM_DATABASE=Broadwell Home Agent 0
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Home Agent 0
pci:v00008086d00006FA8*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Target Address/Thermal/RAS
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Target Address/Thermal/RAS
pci:v00008086d00006FAA*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel Target Address Decoder
pci:v00008086d00006FAB*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel Target Address Decoder
pci:v00008086d00006FAC*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel Target Address Decoder
pci:v00008086d00006FAD*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel Target Address Decoder
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel Target Address Decoder
pci:v00008086d00006FAE*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 0/1 Broadcast
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 0/1 Broadcast
pci:v00008086d00006FAF*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Global Broadcast
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Global Broadcast
pci:v00008086d00006FB0*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 0 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 0 Thermal Control
pci:v00008086d00006FB1*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 1 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 1 Thermal Control
pci:v00008086d00006FB2*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 0 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 0 Error
pci:v00008086d00006FB3*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 1 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 1 Error
pci:v00008086d00006FB4*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 2 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 2 Thermal Control
pci:v00008086d00006FB5*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 3 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 3 Thermal Control
pci:v00008086d00006FB6*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 2 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 2 Error
pci:v00008086d00006FB7*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 0 - Channel 3 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 0 - Channel 3 Error
pci:v00008086d00006FB8*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 2/3 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 2/3 Interface
pci:v00008086d00006FB9*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 2/3 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 2/3 Interface
pci:v00008086d00006FBA*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 2/3 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 2/3 Interface
pci:v00008086d00006FBB*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 2/3 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 2/3 Interface
pci:v00008086d00006FBC*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 0/1 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 0/1 Interface
pci:v00008086d00006FBD*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 0/1 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 0/1 Interface
pci:v00008086d00006FBE*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 0/1 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 0/1 Interface
pci:v00008086d00006FBF*
- ID_MODEL_FROM_DATABASE=Broadwell DDRIO Channel 0/1 Interface
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family DDRIO Channel 0/1 Interface
pci:v00008086d00006FC0*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC1*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC2*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC3*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC4*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC5*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC6*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC7*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC8*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FC9*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FCA*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FCB*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FCC*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FCD*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FCE*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FCF*
- ID_MODEL_FROM_DATABASE=Broadwell Power Control Unit
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Power Control Unit
pci:v00008086d00006FD0*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 0 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 0 Thermal Control
pci:v00008086d00006FD1*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 1 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 1 Thermal Control
pci:v00008086d00006FD2*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 0 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 0 Error
pci:v00008086d00006FD3*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 1 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 1 Error
pci:v00008086d00006FD4*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 2 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 2 Thermal Control
pci:v00008086d00006FD5*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 3 Thermal Control
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 3 Thermal Control
pci:v00008086d00006FD6*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 2 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 2 Error
pci:v00008086d00006FD7*
- ID_MODEL_FROM_DATABASE=Broadwell Memory Controller 1 - Channel 3 Error
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Memory Controller 1 - Channel 3 Error
pci:v00008086d00006FE0*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE1*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE2*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE3*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE4*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE5*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE6*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE7*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE8*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FE9*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FEA*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FEB*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FEC*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FED*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FEE*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FEF*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FF0*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FF1*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FF8*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FF9*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FFA*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FFB*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FFC*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FFD*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00006FFE*
- ID_MODEL_FROM_DATABASE=Broadwell Caching Agent
+ ID_MODEL_FROM_DATABASE=Xeon Processor D Family Caching Agent
pci:v00008086d00007000*
ID_MODEL_FROM_DATABASE=82371SB PIIX3 ISA [Natoma/Triton II]
@@ -76403,6 +77063,147 @@ pci:v00008086d0000A16A*
pci:v00008086d0000A170*
ID_MODEL_FROM_DATABASE=Sunrise Point-H HD Audio
+pci:v00008086d0000A182*
+ ID_MODEL_FROM_DATABASE=Lewisburg SATA Controller [AHCI mode]
+
+pci:v00008086d0000A190*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #1
+
+pci:v00008086d0000A191*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #2
+
+pci:v00008086d0000A192*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #3
+
+pci:v00008086d0000A193*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #4
+
+pci:v00008086d0000A194*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #5
+
+pci:v00008086d0000A195*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #6
+
+pci:v00008086d0000A196*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #7
+
+pci:v00008086d0000A197*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #8
+
+pci:v00008086d0000A198*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #9
+
+pci:v00008086d0000A199*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #10
+
+pci:v00008086d0000A19A*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #11
+
+pci:v00008086d0000A19B*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #12
+
+pci:v00008086d0000A19C*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #13
+
+pci:v00008086d0000A19D*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #14
+
+pci:v00008086d0000A19E*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #15
+
+pci:v00008086d0000A19F*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #16
+
+pci:v00008086d0000A1A0*
+ ID_MODEL_FROM_DATABASE=Lewisburg P2SB
+
+pci:v00008086d0000A1A1*
+ ID_MODEL_FROM_DATABASE=Lewisburg PMC
+
+pci:v00008086d0000A1A2*
+ ID_MODEL_FROM_DATABASE=Lewisburg cAVS
+
+pci:v00008086d0000A1A3*
+ ID_MODEL_FROM_DATABASE=Lewisburg SMBus
+
+pci:v00008086d0000A1A4*
+ ID_MODEL_FROM_DATABASE=Lewisburg SPI Controller
+
+pci:v00008086d0000A1AF*
+ ID_MODEL_FROM_DATABASE=Lewisburg USB 3.0 xHCI Controller
+
+pci:v00008086d0000A1BA*
+ ID_MODEL_FROM_DATABASE=Lewisburg CSME: HECI #1
+
+pci:v00008086d0000A1BB*
+ ID_MODEL_FROM_DATABASE=Lewisburg CSME: HECI #2
+
+pci:v00008086d0000A1BC*
+ ID_MODEL_FROM_DATABASE=Lewisburg CSME: IDE-r
+
+pci:v00008086d0000A1BD*
+ ID_MODEL_FROM_DATABASE=Lewisburg CSME: KT Controller
+
+pci:v00008086d0000A1BE*
+ ID_MODEL_FROM_DATABASE=Lewisburg CSME: HECI #3
+
+pci:v00008086d0000A1C1*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1C2*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1C3*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1C4*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1C5*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1C6*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1C7*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC Controller
+
+pci:v00008086d0000A1D2*
+ ID_MODEL_FROM_DATABASE=Lewisburg SSATA Controller [AHCI mode]
+
+pci:v00008086d0000A1E7*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #17
+
+pci:v00008086d0000A1E8*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #18
+
+pci:v00008086d0000A1E9*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #19
+
+pci:v00008086d0000A1EA*
+ ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #20
+
+pci:v00008086d0000A1F0*
+ ID_MODEL_FROM_DATABASE=Lewisburg MROM 0
+
+pci:v00008086d0000A1F1*
+ ID_MODEL_FROM_DATABASE=Lewisburg MROM 1
+
+pci:v00008086d0000A1F8*
+ ID_MODEL_FROM_DATABASE=Lewisburg IE: HECI #1
+
+pci:v00008086d0000A1F9*
+ ID_MODEL_FROM_DATABASE=Lewisburg IE: HECI #2
+
+pci:v00008086d0000A1FA*
+ ID_MODEL_FROM_DATABASE=Lewisburg IE: IDE-r
+
+pci:v00008086d0000A1FB*
+ ID_MODEL_FROM_DATABASE=Lewisburg IE: KT Controller
+
+pci:v00008086d0000A1FC*
+ ID_MODEL_FROM_DATABASE=Lewisburg IE: HECI #3
+
pci:v00008086d0000A620*
ID_MODEL_FROM_DATABASE=6400/6402 Advanced Memory Buffer (AMB)
@@ -77993,9 +78794,18 @@ pci:v0000BDBDd0000A130*
pci:v0000BDBDd0000A132*
ID_MODEL_FROM_DATABASE=UltraStudio 4K
+pci:v0000BDBDd0000A136*
+ ID_MODEL_FROM_DATABASE=DeckLink 4K Extreme 12G
+
+pci:v0000BDBDd0000A137*
+ ID_MODEL_FROM_DATABASE=DeckLink Studio 4K
+
pci:v0000BDBDd0000A138*
ID_MODEL_FROM_DATABASE=Decklink SDI 4K
+pci:v0000BDBDd0000A139*
+ ID_MODEL_FROM_DATABASE=Intensity Pro 4K
+
pci:v0000C001*
ID_VENDOR_FROM_DATABASE=TSI Telsys
@@ -78275,6 +79085,15 @@ pci:v0000DD01d00000003sv0000DD01sd00000030*
pci:v0000DD01d00000003sv0000DD01sd0000DB03*
ID_MODEL_FROM_DATABASE=Octopus DVB Adapter (Mystique SaTiX-S2 V3 DVB adapter)
+pci:v0000DD01d00000006*
+ ID_MODEL_FROM_DATABASE=Cine V7
+
+pci:v0000DD01d00000007*
+ ID_MODEL_FROM_DATABASE=Max
+
+pci:v0000DD01d00000007sv0000DD01sd00000023*
+ ID_MODEL_FROM_DATABASE=Max (S8 4/8)
+
pci:v0000DD01d00000011*
ID_MODEL_FROM_DATABASE=Octopus CI DVB Adapter
@@ -78284,6 +79103,12 @@ pci:v0000DD01d00000011sv0000DD01sd00000040*
pci:v0000DD01d00000011sv0000DD01sd00000041*
ID_MODEL_FROM_DATABASE=Octopus CI DVB Adapter (Octopus CI Single)
+pci:v0000DD01d00000201*
+ ID_MODEL_FROM_DATABASE=Resi DVB-C Modulator
+
+pci:v0000DD01d00000201sv0000DD01sd00000001*
+ ID_MODEL_FROM_DATABASE=Resi DVB-C Modulator
+
pci:v0000DEAD*
ID_VENDOR_FROM_DATABASE=Indigita Corporation
diff --git a/hwdb/20-usb-vendor-model.hwdb b/hwdb/20-usb-vendor-model.hwdb
index 8867531a31..4d61dd7690 100644
--- a/hwdb/20-usb-vendor-model.hwdb
+++ b/hwdb/20-usb-vendor-model.hwdb
@@ -614,6 +614,9 @@ usb:v03F0p0704*
usb:v03F0p0705*
ID_MODEL_FROM_DATABASE=ScanJet 4400c
+usb:v03F0p070C*
+ ID_MODEL_FROM_DATABASE=Personal Media Drive
+
usb:v03F0p0711*
ID_MODEL_FROM_DATABASE=OfficeJet K80
@@ -1484,6 +1487,9 @@ usb:v03F0p5A11*
usb:v03F0p5B11*
ID_MODEL_FROM_DATABASE=OfficeJet J2100 series
+usb:v03F0p5B12*
+ ID_MODEL_FROM_DATABASE=Officejet Pro 8100
+
usb:v03F0p5C11*
ID_MODEL_FROM_DATABASE=PhotoSmart C4200 Printer series
@@ -4388,6 +4394,9 @@ usb:v0421p0610*
usb:v0421p0661*
ID_MODEL_FROM_DATABASE=Lumia 920
+usb:v0421p0720*
+ ID_MODEL_FROM_DATABASE=X (RM-980)
+
usb:v0421p0800*
ID_MODEL_FROM_DATABASE=Connectivity Cable DKU-5
@@ -6714,7 +6723,7 @@ usb:v0461*
ID_VENDOR_FROM_DATABASE=Primax Electronics, Ltd
usb:v0461p0010*
- ID_MODEL_FROM_DATABASE=HP Keyboard
+ ID_MODEL_FROM_DATABASE=HP PR1101U / Primax PMX-KPR1101U Keyboard
usb:v0461p0300*
ID_MODEL_FROM_DATABASE=G2-300 Scanner
@@ -7410,7 +7419,7 @@ usb:v046DpC000*
ID_MODEL_FROM_DATABASE=N43 [Pilot Mouse]
usb:v046DpC001*
- ID_MODEL_FROM_DATABASE=N48/M-BB48 [FirstMouse Plus]
+ ID_MODEL_FROM_DATABASE=N48/M-BB48/M-UK96A [FirstMouse Plus]
usb:v046DpC002*
ID_MODEL_FROM_DATABASE=M-BA47 [MouseMan Plus]
@@ -8858,11 +8867,14 @@ usb:v047FpAC01*
usb:v047FpAD01*
ID_MODEL_FROM_DATABASE=GameCom 777 5.1 Headset
+usb:v047FpC008*
+ ID_MODEL_FROM_DATABASE=Audio 655 DSP
+
usb:v047FpC00E*
ID_MODEL_FROM_DATABASE=Blackwire C310 headset
usb:v0480*
- ID_VENDOR_FROM_DATABASE=Toshiba America Info. Systems, Inc.
+ ID_VENDOR_FROM_DATABASE=Toshiba America Inc
usb:v0480p0001*
ID_MODEL_FROM_DATABASE=InTouch Module
@@ -8897,6 +8909,9 @@ usb:v0480pA00D*
usb:v0480pB001*
ID_MODEL_FROM_DATABASE=Stor.E Partner
+usb:v0480pD000*
+ ID_MODEL_FROM_DATABASE=External Disk 2TB Model DT01ABA200
+
usb:v0480pD010*
ID_MODEL_FROM_DATABASE=External Disk 3TB
@@ -9071,6 +9086,12 @@ usb:v0489pE016*
usb:v0489pE02C*
ID_MODEL_FROM_DATABASE=Atheros AR5BBU12 Bluetooth Device
+usb:v0489pE032*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM20702 Bluetooth
+
+usb:v0489pE042*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM20702 Bluetooth
+
usb:v0489pE04D*
ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth
@@ -12447,7 +12468,7 @@ usb:v04B8p0884*
ID_MODEL_FROM_DATABASE=Stylus NX430W Series
usb:v04B8p0885*
- ID_MODEL_FROM_DATABASE=Stylus NX230 Series
+ ID_MODEL_FROM_DATABASE=Stylus NX230/SX235W Series
usb:v04B8p088F*
ID_MODEL_FROM_DATABASE=Stylus Office BX635FWD
@@ -12845,6 +12866,12 @@ usb:v04CAp1766*
usb:v04CAp2004*
ID_MODEL_FROM_DATABASE=Bluetooth 4.0 [Broadcom BCM20702A0]
+usb:v04CAp300B*
+ ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth
+
+usb:v04CAp300D*
+ ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth
+
usb:v04CAp7025*
ID_MODEL_FROM_DATABASE=HP HD Webcam
@@ -13364,6 +13391,9 @@ usb:v04D9p1603*
usb:v04D9p1702*
ID_MODEL_FROM_DATABASE=Keyboard LKS02
+usb:v04D9p2011*
+ ID_MODEL_FROM_DATABASE=Keyboard [Diatec Filco Majestouch 1]
+
usb:v04D9p2013*
ID_MODEL_FROM_DATABASE=Keyboard [Das Keyboard]
@@ -14063,6 +14093,9 @@ usb:v04E8p3297*
usb:v04E8p329F*
ID_MODEL_FROM_DATABASE=CLP-325 Color Laser Printer
+usb:v04E8p3301*
+ ID_MODEL_FROM_DATABASE=ML-1660 Series
+
usb:v04E8p330C*
ID_MODEL_FROM_DATABASE=ML-1865
@@ -14481,7 +14514,7 @@ usb:v04E8p685E*
ID_MODEL_FROM_DATABASE=GT-I9100 / GT-C3350 Phones (USB Debugging mode)
usb:v04E8p6860*
- ID_MODEL_FROM_DATABASE=GT-I9100 Phone [Galaxy S II], GT-I9300 Phone [Galaxy S III], GT-P7500 [Galaxy Tab 10.1] , GT-I9500 [Galaxy S 4]
+ ID_MODEL_FROM_DATABASE=Galaxy (MTP)
usb:v04E8p6863*
ID_MODEL_FROM_DATABASE=GT-I9500 [Galaxy S4] / GT-I9250 [Galaxy Nexus] (network tethering)
@@ -14858,6 +14891,9 @@ usb:v04F2pB354*
usb:v04F2pB394*
ID_MODEL_FROM_DATABASE=Integrated Camera
+usb:v04F2pB3F6*
+ ID_MODEL_FROM_DATABASE=HD WebCam (Acer)
+
usb:v04F3*
ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp.
@@ -15267,7 +15303,7 @@ usb:v04F9p0181*
ID_MODEL_FROM_DATABASE=MFC-7820N Port(FaxModem)
usb:v04F9p0182*
- ID_MODEL_FROM_DATABASE=Composite Device
+ ID_MODEL_FROM_DATABASE=DCP-7010
usb:v04F9p0183*
ID_MODEL_FROM_DATABASE=DCP-7020
@@ -17924,6 +17960,9 @@ usb:v056Ap0400*
usb:v056Ap4850*
ID_MODEL_FROM_DATABASE=PenPartner 6x8
+usb:v056Ap5010*
+ ID_MODEL_FROM_DATABASE=Thinkpad T550 touchscreen
+
usb:v056B*
ID_VENDOR_FROM_DATABASE=Decicon, Inc.
@@ -18083,6 +18122,9 @@ usb:v0572pC688*
usb:v0572pCAFC*
ID_MODEL_FROM_DATABASE=CX861xx ROM Boot Loader
+usb:v0572pCAFD*
+ ID_MODEL_FROM_DATABASE=CX82310 ROM Boot Loader
+
usb:v0572pCAFE*
ID_MODEL_FROM_DATABASE=AccessRunner ADSL Modem
@@ -19181,11 +19223,17 @@ usb:v0586*
usb:v0586p0025*
ID_MODEL_FROM_DATABASE=802.11b/g/n USB Wireless Network Adapter
+usb:v0586p0100*
+ ID_MODEL_FROM_DATABASE=omni.net
+
usb:v0586p0102*
- ID_MODEL_FROM_DATABASE=omni.net II ISDN TA
+ ID_MODEL_FROM_DATABASE=omni.net II ISDN TA [HFC-S]
+
+usb:v0586p0110*
+ ID_MODEL_FROM_DATABASE=omni.net Plus
usb:v0586p1000*
- ID_MODEL_FROM_DATABASE=Omni NET Modem / ISDN TA
+ ID_MODEL_FROM_DATABASE=omni.net LCD Plus - ISDN TA
usb:v0586p1500*
ID_MODEL_FROM_DATABASE=Omni 56K Plus
@@ -19748,6 +19796,9 @@ usb:v059Fp100C*
usb:v059Fp1010*
ID_MODEL_FROM_DATABASE=Desktop Hard Drive
+usb:v059Fp1018*
+ ID_MODEL_FROM_DATABASE=Desktop Hard Drive
+
usb:v059Fp1019*
ID_MODEL_FROM_DATABASE=Desktop Hard Drive
@@ -19895,6 +19946,9 @@ usb:v05A9p4519*
usb:v05A9p7670*
ID_MODEL_FROM_DATABASE=OV7670 Webcam
+usb:v05A9p8065*
+ ID_MODEL_FROM_DATABASE=GAIA Sensor FPGA Demo Board
+
usb:v05A9p8519*
ID_MODEL_FROM_DATABASE=OV519 Webcam
@@ -20331,7 +20385,7 @@ usb:v05ACp12A6*
ID_MODEL_FROM_DATABASE=iPad 3 (3G, 16 GB)
usb:v05ACp12A8*
- ID_MODEL_FROM_DATABASE=iPhone5/5C/5S
+ ID_MODEL_FROM_DATABASE=iPhone5/5C/5S/6
usb:v05ACp12A9*
ID_MODEL_FROM_DATABASE=iPad 2
@@ -20340,7 +20394,7 @@ usb:v05ACp12AA*
ID_MODEL_FROM_DATABASE=iPod Touch 5.Gen [A1421]
usb:v05ACp12AB*
- ID_MODEL_FROM_DATABASE=iPad 4 (WiFi, 32GB)
+ ID_MODEL_FROM_DATABASE=iPad 4/Mini1
usb:v05ACp1300*
ID_MODEL_FROM_DATABASE=iPod Shuffle
@@ -21857,6 +21911,9 @@ usb:v05E3p0741*
usb:v05E3p0743*
ID_MODEL_FROM_DATABASE=SDXC and microSDXC CardReader
+usb:v05E3p0745*
+ ID_MODEL_FROM_DATABASE=Logilink CR0012
+
usb:v05E3p0760*
ID_MODEL_FROM_DATABASE=USB 2.0 Card Reader/Writer
@@ -22604,6 +22661,9 @@ usb:v064D*
usb:v064E*
ID_VENDOR_FROM_DATABASE=Suyin Corp.
+usb:v064Ep2100*
+ ID_MODEL_FROM_DATABASE=Sony Visual Communication Camera
+
usb:v064EpA100*
ID_MODEL_FROM_DATABASE=Acer OrbiCam
@@ -23217,10 +23277,10 @@ usb:v0675p0550*
ID_MODEL_FROM_DATABASE=Vigor550
usb:v0675p1688*
- ID_MODEL_FROM_DATABASE=miniVigor 128 ISDN TA
+ ID_MODEL_FROM_DATABASE=miniVigor 128 ISDN TA [HFC-S]
usb:v0675p6694*
- ID_MODEL_FROM_DATABASE=USB ISDN TA
+ ID_MODEL_FROM_DATABASE=miniVigor 128 ISDN TA
usb:v0676*
ID_VENDOR_FROM_DATABASE=Teles AG
@@ -25269,10 +25329,13 @@ usb:v071D*
ID_VENDOR_FROM_DATABASE=Eicon Networks Corp.
usb:v071Dp1000*
- ID_MODEL_FROM_DATABASE=Diva ISDN TA
+ ID_MODEL_FROM_DATABASE=Diva 2.01 S/T [PSB2115F]
usb:v071Dp1003*
- ID_MODEL_FROM_DATABASE=Diva
+ ID_MODEL_FROM_DATABASE=Diva ISDN 2.0
+
+usb:v071Dp1005*
+ ID_MODEL_FROM_DATABASE=Diva ISDN 4.0 [HFC-S]
usb:v071Dp2000*
ID_MODEL_FROM_DATABASE=Teledat Surf
@@ -25646,6 +25709,18 @@ usb:v073E*
usb:v073Ep0301*
ID_MODEL_FROM_DATABASE=Game Pad
+usb:v0742*
+ ID_VENDOR_FROM_DATABASE=Stollmann
+
+usb:v0742p2008*
+ ID_MODEL_FROM_DATABASE=ISDN TA [HFC-S]
+
+usb:v0742p2009*
+ ID_MODEL_FROM_DATABASE=ISDN TA [HFC-S]
+
+usb:v0742p200A*
+ ID_MODEL_FROM_DATABASE=ISDN TA [HFC-S]
+
usb:v0745*
ID_VENDOR_FROM_DATABASE=Syntech Information Co., Ltd
@@ -25973,6 +26048,9 @@ usb:v076Bp1784*
usb:v076Bp3021*
ID_MODEL_FROM_DATABASE=CardMan 3121
+usb:v076Bp3022*
+ ID_MODEL_FROM_DATABASE=CardMan 3021
+
usb:v076Bp3610*
ID_MODEL_FROM_DATABASE=CardMan 3620
@@ -26814,10 +26892,10 @@ usb:v07B0p0005*
ID_MODEL_FROM_DATABASE=ISDN TA128 SE
usb:v07B0p0006*
- ID_MODEL_FROM_DATABASE=ISDN TA128 CE
+ ID_MODEL_FROM_DATABASE=ISDN TA 128 [HFC-S]
usb:v07B0p0007*
- ID_MODEL_FROM_DATABASE=ISDN TA
+ ID_MODEL_FROM_DATABASE=ISDN TA [HFC-S]
usb:v07B0p0008*
ID_MODEL_FROM_DATABASE=ISDN TA
@@ -26970,7 +27048,7 @@ usb:v07B3p0C2B*
ID_MODEL_FROM_DATABASE=Mobile Office D428 Scanner
usb:v07B3p0E08*
- ID_MODEL_FROM_DATABASE=Plustek OpticBook A300 Scanner
+ ID_MODEL_FROM_DATABASE=OpticBook A300 Scanner
usb:v07B3p1300*
ID_MODEL_FROM_DATABASE=OpticBook 3800 Scanner
@@ -27998,6 +28076,12 @@ usb:v07FA*
usb:v07FAp0778*
ID_MODEL_FROM_DATABASE=miniVigor 128 ISDN TA
+usb:v07FAp0846*
+ ID_MODEL_FROM_DATABASE=ISDN TA [HFC-S]
+
+usb:v07FAp0847*
+ ID_MODEL_FROM_DATABASE=ISDN TA [HFC-S]
+
usb:v07FAp1012*
ID_MODEL_FROM_DATABASE=BeWAN ADSL USB ST (grey)
@@ -29484,7 +29568,7 @@ usb:v08E3p0102*
ID_MODEL_FROM_DATABASE=ADSL
usb:v08E3p0301*
- ID_MODEL_FROM_DATABASE=RNIS
+ ID_MODEL_FROM_DATABASE=RNIS ISDN TA [HFC-S]
usb:v08E4*
ID_VENDOR_FROM_DATABASE=Pioneer Corp.
@@ -30425,6 +30509,9 @@ usb:v0930p0010*
usb:v0930p0200*
ID_MODEL_FROM_DATABASE=Integrated Bluetooth (Taiyo Yuden)
+usb:v0930p021C*
+ ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth
+
usb:v0930p0301*
ID_MODEL_FROM_DATABASE=PCX1100U Cable Modem (WDM)
@@ -31059,7 +31146,7 @@ usb:v0959*
ID_VENDOR_FROM_DATABASE=Cologne Chip AG
usb:v0959p2BD0*
- ID_MODEL_FROM_DATABASE=Intelligent ISDN (Ver. 3.60.04)
+ ID_MODEL_FROM_DATABASE=Intelligent ISDN (Ver. 3.60.04) [HFC-S]
usb:v095A*
ID_VENDOR_FROM_DATABASE=Portsmith
@@ -31634,6 +31721,9 @@ usb:v0A01*
usb:v0A05*
ID_VENDOR_FROM_DATABASE=Unknown Manufacturer
+usb:v0A05p0001*
+ ID_MODEL_FROM_DATABASE=Hub
+
usb:v0A05p7211*
ID_MODEL_FROM_DATABASE=hub
@@ -31799,6 +31889,9 @@ usb:v0A17p003B*
usb:v0A17p003D*
ID_MODEL_FROM_DATABASE=Optio S55
+usb:v0A17p0041*
+ ID_MODEL_FROM_DATABASE=Optio S5z
+
usb:v0A17p0043*
ID_MODEL_FROM_DATABASE=*ist DL
@@ -32210,6 +32303,9 @@ usb:v0A5Cp2151*
usb:v0A5Cp2154*
ID_MODEL_FROM_DATABASE=BCM92046DG-CL1ROM Bluetooth 2.1 UHE Dongle
+usb:v0A5Cp216C*
+ ID_MODEL_FROM_DATABASE=BCM43142A0 Bluetooth Device
+
usb:v0A5Cp217D*
ID_MODEL_FROM_DATABASE=HP Bluethunder
@@ -33281,6 +33377,9 @@ usb:v0B05p17C7*
usb:v0B05p17C9*
ID_MODEL_FROM_DATABASE=USB-AC53 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]
+usb:v0B05p17CB*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM20702A0 Bluetooth
+
usb:v0B05p17D1*
ID_MODEL_FROM_DATABASE=AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610/Ralink RT2870]
@@ -33756,7 +33855,7 @@ usb:v0B7D*
ID_VENDOR_FROM_DATABASE=Astrodesign, Inc.
usb:v0B81*
- ID_VENDOR_FROM_DATABASE=id3 Semiconductors
+ ID_VENDOR_FROM_DATABASE=id3 Technologies
usb:v0B81p0001*
ID_MODEL_FROM_DATABASE=Biothentic II smartcard reader with fingerprint sensor
@@ -34544,6 +34643,9 @@ usb:v0BB4p0CAE*
usb:v0BB4p0DEA*
ID_MODEL_FROM_DATABASE=M7_UL [HTC One]
+usb:v0BB4p0F25*
+ ID_MODEL_FROM_DATABASE=One M8
+
usb:v0BB4p0F64*
ID_MODEL_FROM_DATABASE=Desire 601
@@ -34889,6 +34991,9 @@ usb:v0BDAp2832*
usb:v0BDAp2838*
ID_MODEL_FROM_DATABASE=RTL2838 DVB-T
+usb:v0BDAp5401*
+ ID_MODEL_FROM_DATABASE=RTL 8153 USB 3.0 hub with gigabit ethernet
+
usb:v0BDAp5730*
ID_MODEL_FROM_DATABASE=HP 2.0MP High Definition Webcam
@@ -38195,6 +38300,9 @@ usb:v0DF6p2208*
usb:v0DF6p2209*
ID_MODEL_FROM_DATABASE=Sitecom bluetooth2.0 class 1 dongle CN-521
+usb:v0DF6p3068*
+ ID_MODEL_FROM_DATABASE=DC-104v2 ISDN Adapter [HFC-S]
+
usb:v0DF6p9071*
ID_MODEL_FROM_DATABASE=WL-113 rev 1 Wireless Network USB Adapter
@@ -39563,6 +39671,9 @@ usb:v0FCEp00D9*
usb:v0FCEp0112*
ID_MODEL_FROM_DATABASE=W995 Walkman Phone
+usb:v0FCEp014E*
+ ID_MODEL_FROM_DATABASE=J108i Cedar (MTP mode)
+
usb:v0FCEp015A*
ID_MODEL_FROM_DATABASE=Xperia Pro [Media Transfer Protocol]
@@ -39581,6 +39692,9 @@ usb:v0FCEp0172*
usb:v0FCEp0177*
ID_MODEL_FROM_DATABASE=Xperia Ion [Mass Storage]
+usb:v0FCEp01BB*
+ ID_MODEL_FROM_DATABASE=D5803 [Xperia Z3 Compact] (MTP mode)
+
usb:v0FCEp0DDE*
ID_MODEL_FROM_DATABASE=Xperia Mini Pro Bootloader
@@ -39605,6 +39719,9 @@ usb:v0FCEp2138*
usb:v0FCEp2149*
ID_MODEL_FROM_DATABASE=Xperia X8 (debug)
+usb:v0FCEp214E*
+ ID_MODEL_FROM_DATABASE=J108i Cedar (Windows-driver mode)
+
usb:v0FCEp3137*
ID_MODEL_FROM_DATABASE=Xperia X10 mini
@@ -39717,7 +39834,7 @@ usb:v0FCEpD12E*
ID_MODEL_FROM_DATABASE=Xperia X10
usb:v0FCEpD14E*
- ID_MODEL_FROM_DATABASE=J108i Cedar
+ ID_MODEL_FROM_DATABASE=J108i Cedar (modem mode)
usb:v0FCEpE000*
ID_MODEL_FROM_DATABASE=K810 (PictBridge mode)
@@ -39773,6 +39890,9 @@ usb:v0FCEpE12E*
usb:v0FCEpE133*
ID_MODEL_FROM_DATABASE=Vivaz
+usb:v0FCEpE14E*
+ ID_MODEL_FROM_DATABASE=J108i Cedar (mass-storage mode)
+
usb:v0FCEpE14F*
ID_MODEL_FROM_DATABASE=Xperia Arc/X12
@@ -40439,6 +40559,12 @@ usb:v1050p0114*
usb:v1050p0115*
ID_MODEL_FROM_DATABASE=Yubikey NEO(-N) U2F+CCID
+usb:v1050p0116*
+ ID_MODEL_FROM_DATABASE=Yubikey NEO(-N) OTP+U2F+CCID
+
+usb:v1050p0120*
+ ID_MODEL_FROM_DATABASE=Yubikey Touch U2F Security Key
+
usb:v1050p0200*
ID_MODEL_FROM_DATABASE=U2F Gnubby
@@ -40532,6 +40658,9 @@ usb:v1058p0810*
usb:v1058p0820*
ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBMWV, WDBZFP)
+usb:v1058p0830*
+ ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBZFP)
+
usb:v1058p0900*
ID_MODEL_FROM_DATABASE=MyBook Essential External HDD
@@ -40622,6 +40751,12 @@ usb:v1059*
usb:v1059p000B*
ID_MODEL_FROM_DATABASE=StarSign Bio Token 3.0
+usb:v105B*
+ ID_VENDOR_FROM_DATABASE=Foxconn International, Inc.
+
+usb:v105BpE065*
+ ID_MODEL_FROM_DATABASE=BCM43142A0 Bluetooth module
+
usb:v105C*
ID_VENDOR_FROM_DATABASE=Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd
@@ -40895,6 +41030,9 @@ usb:v1076p0031*
usb:v1076p0032*
ID_MODEL_FROM_DATABASE=Bluetooth Device
+usb:v1076p8002*
+ ID_MODEL_FROM_DATABASE=LU150 LTE Modem [Yota LU150]
+
usb:v107B*
ID_VENDOR_FROM_DATABASE=Gateway, Inc.
@@ -40937,6 +41075,9 @@ usb:v108A*
usb:v108B*
ID_VENDOR_FROM_DATABASE=Grand-tek Technology Co., Ltd
+usb:v108Bp0005*
+ ID_MODEL_FROM_DATABASE=HID Keyboard/Mouse PS/2 Translator
+
usb:v108C*
ID_VENDOR_FROM_DATABASE=Robert Bosch GmbH
@@ -41259,7 +41400,10 @@ usb:v10C4p8918*
ID_MODEL_FROM_DATABASE=C8051F38x HDMI Audio Extractor [VSA-HA-DP]
usb:v10C4p8973*
- ID_MODEL_FROM_DATABASE=C8051F38x HDMI Splitter [UHBX-8X]
+ ID_MODEL_FROM_DATABASE=C8051F38x HDMI Extender [UHBX-8X]
+
+usb:v10C4p89E1*
+ ID_MODEL_FROM_DATABASE=C8051F38x HDMI Extender [UHBX-SW3-WP]
usb:v10C4pEA60*
ID_MODEL_FROM_DATABASE=CP210x UART Bridge / myAVR mySmartUSB light
@@ -41333,6 +41477,12 @@ usb:v10D1p0202*
usb:v10D1p0301*
ID_MODEL_FROM_DATABASE=CP42 - Communication Processor
+usb:v10D2*
+ ID_VENDOR_FROM_DATABASE=RayComposer - R. Adams
+
+usb:v10D2p5243*
+ ID_MODEL_FROM_DATABASE=RayComposer
+
usb:v10D4*
ID_VENDOR_FROM_DATABASE=Man Boon Manufactory, Ltd
@@ -41351,6 +41501,9 @@ usb:v10D5p55A2*
usb:v10D6*
ID_VENDOR_FROM_DATABASE=Actions Semiconductor Co., Ltd
+usb:v10D6p0C02*
+ ID_MODEL_FROM_DATABASE=BioniQ 1001 Tablet
+
usb:v10D6p1000*
ID_MODEL_FROM_DATABASE=MP3 Player
@@ -41564,6 +41717,9 @@ usb:v112F*
usb:v1130*
ID_VENDOR_FROM_DATABASE=Tenx Technology, Inc.
+usb:v1130p0001*
+ ID_MODEL_FROM_DATABASE=BlyncLight
+
usb:v1130p0002*
ID_MODEL_FROM_DATABASE=iBuddy
@@ -42077,6 +42233,72 @@ usb:v1209p1004*
usb:v1209p1005*
ID_MODEL_FROM_DATABASE=IBSecureCam-N
+usb:v1209p1006*
+ ID_MODEL_FROM_DATABASE=Mini IO-Board
+
+usb:v1209p2000*
+ ID_MODEL_FROM_DATABASE=Zygmunt Krynicki Lantern Brightness Sensor
+
+usb:v1209p2048*
+ ID_MODEL_FROM_DATABASE=Housedillon.com MRF49XA Transciever
+
+usb:v1209p2222*
+ ID_MODEL_FROM_DATABASE=LabConnect Signalgenerator
+
+usb:v1209p2300*
+ ID_MODEL_FROM_DATABASE=Keyboardio Keyboardio Model 01 Bootloader
+
+usb:v1209p2301*
+ ID_MODEL_FROM_DATABASE=Keyboardio Keyboardio Model 01
+
+usb:v1209p2337*
+ ID_MODEL_FROM_DATABASE=/Dev or SlashDev /Net
+
+usb:v1209p3000*
+ ID_MODEL_FROM_DATABASE=lloyd3000
+
+usb:v1209p3333*
+ ID_MODEL_FROM_DATABASE=LabConnect Digitalnetzteil
+
+usb:v1209p5222*
+ ID_MODEL_FROM_DATABASE=telavivmakers attami
+
+usb:v1209p5A22*
+ ID_MODEL_FROM_DATABASE=ikari_01 sd2snes
+
+usb:v1209p7BD0*
+ ID_MODEL_FROM_DATABASE=pokey9000 Tiny Bit Dingus
+
+usb:v1209pABD0*
+ ID_MODEL_FROM_DATABASE=tibounise ADB converter
+
+usb:v1209pBEEF*
+ ID_MODEL_FROM_DATABASE=Modal MC-USB
+
+usb:v1209pC0F5*
+ ID_MODEL_FROM_DATABASE=unethi PERswitch
+
+usb:v1209pCA1C*
+ ID_MODEL_FROM_DATABASE=KnightOS Hub
+
+usb:v1209pCA1D*
+ ID_MODEL_FROM_DATABASE=KnightOS MTP Device
+
+usb:v1209pCAFE*
+ ID_MODEL_FROM_DATABASE=ii iigadget
+
+usb:v1209pDADA*
+ ID_MODEL_FROM_DATABASE=Rebel Technology OWL
+
+usb:v1209pDEAD*
+ ID_MODEL_FROM_DATABASE=chaosfield.at AVR-Ruler
+
+usb:v1209pFA11*
+ ID_MODEL_FROM_DATABASE=moonglow OpenXHC
+
+usb:v1209pFEED*
+ ID_MODEL_FROM_DATABASE=ProgramGyar AVR-IR Sender
+
usb:v120E*
ID_VENDOR_FROM_DATABASE=Hudson Soft Co., Ltd
@@ -42107,6 +42329,12 @@ usb:v121E*
usb:v121Ep3403*
ID_MODEL_FROM_DATABASE=Muzio JM250 Audio Player
+usb:v1221*
+ ID_VENDOR_FROM_DATABASE=Unknown manufacturer
+
+usb:v1221p3234*
+ ID_MODEL_FROM_DATABASE=Disk (Thumb drive)
+
usb:v1223*
ID_VENDOR_FROM_DATABASE=SKYCABLE ENTERPRISE. CO., LTD.
@@ -42669,10 +42897,10 @@ usb:v12D1p1412*
ID_MODEL_FROM_DATABASE=EC168c
usb:v12D1p1436*
- ID_MODEL_FROM_DATABASE=E173 3G Modem (modem-mode)
+ ID_MODEL_FROM_DATABASE=Broadband stick
usb:v12D1p1446*
- ID_MODEL_FROM_DATABASE=E1552/E1800/E173 (HSPA modem)
+ ID_MODEL_FROM_DATABASE=Broadband stick (modem on)
usb:v12D1p1465*
ID_MODEL_FROM_DATABASE=K3765 HSPA
@@ -42732,7 +42960,7 @@ usb:v12D1p1805*
ID_MODEL_FROM_DATABASE=AT&T Go Phone U2800A phone
usb:v12D1p1C05*
- ID_MODEL_FROM_DATABASE=E173s 3G broadband stick (modem on)
+ ID_MODEL_FROM_DATABASE=Broadband stick (modem on)
usb:v12D1p1C0B*
ID_MODEL_FROM_DATABASE=E173s 3G broadband stick (modem off)
@@ -43283,6 +43511,9 @@ usb:v1390p0001*
usb:v1390p5454*
ID_MODEL_FROM_DATABASE=Blue & Me 2
+usb:v1390p7474*
+ ID_MODEL_FROM_DATABASE=GPS Sport Watch [Runner, Multi-Sport]
+
usb:v1391*
ID_VENDOR_FROM_DATABASE=IdealTEK, Inc.
@@ -43574,6 +43805,9 @@ usb:v13D3p3306*
usb:v13D3p3315*
ID_MODEL_FROM_DATABASE=Bluetooth module
+usb:v13D3p3362*
+ ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth 4.0 Adapter
+
usb:v13D3p3375*
ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth 4.0 Adapter
@@ -43583,6 +43817,9 @@ usb:v13D3p3392*
usb:v13D3p3394*
ID_MODEL_FROM_DATABASE=Bluetooth
+usb:v13D3p3474*
+ ID_MODEL_FROM_DATABASE=Atheros AR3012 Bluetooth
+
usb:v13D3p5070*
ID_MODEL_FROM_DATABASE=Webcam
@@ -44387,9 +44624,6 @@ usb:v14E1*
usb:v14E1p5000*
ID_MODEL_FROM_DATABASE=PenMount 5000 Touch Controller
-usb:v14E4*
- ID_VENDOR_FROM_DATABASE=Broadcom Corp.
-
usb:v14E5*
ID_VENDOR_FROM_DATABASE=SAIN Information & Communications Co., Ltd.
@@ -44492,6 +44726,9 @@ usb:v1519*
usb:v1519p0020*
ID_MODEL_FROM_DATABASE=HSIC Device
+usb:v1519p0443*
+ ID_MODEL_FROM_DATABASE=Telit LN930
+
usb:v1520*
ID_VENDOR_FROM_DATABASE=Bitwire Corp.
@@ -44519,6 +44756,9 @@ usb:v1529p3100*
usb:v152A*
ID_VENDOR_FROM_DATABASE=Thesycon Systemsoftware & Consulting GmbH
+usb:v152Ap8350*
+ ID_MODEL_FROM_DATABASE=NET Gmbh iCube Camera
+
usb:v152Ap8400*
ID_MODEL_FROM_DATABASE=INI DVS128
@@ -44528,11 +44768,80 @@ usb:v152Ap840D*
usb:v152Ap841A*
ID_MODEL_FROM_DATABASE=INI DAViS FX3
+usb:v152B*
+ ID_VENDOR_FROM_DATABASE=MIR Srl
+
+usb:v152Bp0001*
+ ID_MODEL_FROM_DATABASE=spirobank II
+
+usb:v152Bp0002*
+ ID_MODEL_FROM_DATABASE=spirolab III
+
+usb:v152Bp0003*
+ ID_MODEL_FROM_DATABASE=MiniSpir
+
+usb:v152Bp0004*
+ ID_MODEL_FROM_DATABASE=Oxi
+
+usb:v152Bp0005*
+ ID_MODEL_FROM_DATABASE=spiros II
+
+usb:v152Bp0006*
+ ID_MODEL_FROM_DATABASE=smiths spirobank II
+
+usb:v152Bp0007*
+ ID_MODEL_FROM_DATABASE=smiths spirobank G-USB
+
+usb:v152Bp0008*
+ ID_MODEL_FROM_DATABASE=smiths MiniSpir
+
+usb:v152Bp0009*
+ ID_MODEL_FROM_DATABASE=spirobank G-USB
+
+usb:v152Bp000A*
+ ID_MODEL_FROM_DATABASE=smiths Oxi
+
+usb:v152Bp000B*
+ ID_MODEL_FROM_DATABASE=smiths spirolab III
+
+usb:v152Bp000C*
+ ID_MODEL_FROM_DATABASE=chorus III
+
+usb:v152Bp000D*
+ ID_MODEL_FROM_DATABASE=spirolab III Bw
+
+usb:v152Bp000E*
+ ID_MODEL_FROM_DATABASE=spirolab III
+
+usb:v152Bp000F*
+ ID_MODEL_FROM_DATABASE=easySpiro
+
+usb:v152Bp0010*
+ ID_MODEL_FROM_DATABASE=Spirotel converter
+
+usb:v152Bp0011*
+ ID_MODEL_FROM_DATABASE=spirobank
+
+usb:v152Bp0012*
+ ID_MODEL_FROM_DATABASE=spiro3 Zimmer
+
+usb:v152Bp0013*
+ ID_MODEL_FROM_DATABASE=spirotel serial
+
+usb:v152Bp0014*
+ ID_MODEL_FROM_DATABASE=spirotel II
+
+usb:v152Bp0015*
+ ID_MODEL_FROM_DATABASE=spirodoc
+
usb:v152D*
ID_VENDOR_FROM_DATABASE=JMicron Technology Corp. / JMicron USA Technology Corp.
usb:v152Dp0539*
- ID_MODEL_FROM_DATABASE=JMS539 SuperSpeed SATA II 3.0G Bridge
+ ID_MODEL_FROM_DATABASE=JMS539/567 SuperSpeed SATA II/III 3.0G/6.0G Bridge
+
+usb:v152Dp0567*
+ ID_MODEL_FROM_DATABASE=JMS567 SATA 6.0Gb/s bridge
usb:v152Dp0770*
ID_MODEL_FROM_DATABASE=Alienware Integrated Webcam
@@ -44561,6 +44870,18 @@ usb:v152Dp2352*
usb:v152Dp2509*
ID_MODEL_FROM_DATABASE=JMS539 SuperSpeed SATA II 3.0G Bridge
+usb:v152Dp2551*
+ ID_MODEL_FROM_DATABASE=JMS551 SATA 3Gb/s bridge
+
+usb:v152Dp2566*
+ ID_MODEL_FROM_DATABASE=JMS566 SATA 3Gb/s bridge
+
+usb:v152Dp3562*
+ ID_MODEL_FROM_DATABASE=JMS567 SATA 6.0Gb/s bridge
+
+usb:v152Dp3569*
+ ID_MODEL_FROM_DATABASE=ATA/ATAPI Bridge [AdPlus SuperVer]
+
usb:v152E*
ID_VENDOR_FROM_DATABASE=LG (HLDS)
@@ -44633,6 +44954,9 @@ usb:v153Bp1182*
usb:v1546*
ID_VENDOR_FROM_DATABASE=U-Blox AG
+usb:v1546p01A5*
+ ID_MODEL_FROM_DATABASE=NL-402U
+
usb:v1547*
ID_VENDOR_FROM_DATABASE=SG Intec Ltd & Co KG
@@ -44657,15 +44981,27 @@ usb:v154Bp0048*
usb:v154Bp004D*
ID_MODEL_FROM_DATABASE=8 GB Flash Drive
+usb:v154Bp0053*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
usb:v154Bp0057*
ID_MODEL_FROM_DATABASE=32GB Micro Slide Attache Flash Drive
+usb:v154Bp005B*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
+usb:v154Bp0062*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
usb:v154Bp007A*
- ID_MODEL_FROM_DATABASE=8GB Classic Attache Flash Drive
+ ID_MODEL_FROM_DATABASE=Classic Attache Flash Drive
usb:v154Bp6545*
ID_MODEL_FROM_DATABASE=FD Device
+usb:v154BpFA05*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
usb:v154D*
ID_VENDOR_FROM_DATABASE=ConnectCounty Holdings Berhad
@@ -44843,6 +45179,9 @@ usb:v15A9p0010*
usb:v15A9p0012*
ID_MODEL_FROM_DATABASE=WUBR-208N 802.11abgn Wireless Adapter [Ralink RT2870]
+usb:v15A9p002D*
+ ID_MODEL_FROM_DATABASE=WLTUBA-107 [Yota 4G LTE]
+
usb:v15AA*
ID_VENDOR_FROM_DATABASE=Gearway Electronics (Dong Guan) Co., Ltd.
@@ -45383,6 +45722,12 @@ usb:v1614p0600*
usb:v1614p0804*
ID_MODEL_FROM_DATABASE=WP-S1 Phone
+usb:v1617*
+ ID_VENDOR_FROM_DATABASE=Sony Corp.
+
+usb:v1617p2002*
+ ID_MODEL_FROM_DATABASE=NVX-P1 Personal Navigation System
+
usb:v1619*
ID_VENDOR_FROM_DATABASE=L & K Precision Technology Co., Ltd.
@@ -45420,7 +45765,7 @@ usb:v1631pC019*
ID_MODEL_FROM_DATABASE=RT2573
usb:v1645*
- ID_VENDOR_FROM_DATABASE=Cross Match Technologies GmbH
+ ID_VENDOR_FROM_DATABASE=Entrega [hex]
usb:v1645p0001*
ID_MODEL_FROM_DATABASE=1S Serial Port
@@ -45536,6 +45881,12 @@ usb:v165Cp0002*
usb:v1660*
ID_VENDOR_FROM_DATABASE=Creatix Polymedia GmbH
+usb:v1667*
+ ID_VENDOR_FROM_DATABASE=GIGA-TMS INC.
+
+usb:v1667p0005*
+ ID_MODEL_FROM_DATABASE=PCR330A RFID Reader (125 kHz, keyboard emulation)
+
usb:v1668*
ID_VENDOR_FROM_DATABASE=Actiontec Electronics, Inc. [hex]
@@ -45956,6 +46307,12 @@ usb:v16C0p06B4*
usb:v16C0p06B5*
ID_MODEL_FROM_DATABASE=USB2LPT with 3 interfaces (native, HID, printer)
+usb:v16C0p074E*
+ ID_MODEL_FROM_DATABASE=DSP-Weuffen USB-HPI-Programmer
+
+usb:v16C0p074F*
+ ID_MODEL_FROM_DATABASE=DSP-Weuffen USB2-HPI-Programmer
+
usb:v16C0p0762*
ID_MODEL_FROM_DATABASE=Osmocom SIMtrace
@@ -46175,6 +46532,9 @@ usb:v170D*
usb:v1711*
ID_VENDOR_FROM_DATABASE=Leica Microsystems
+usb:v1711p0101*
+ ID_MODEL_FROM_DATABASE=DFC-365FX camera
+
usb:v1711p3020*
ID_MODEL_FROM_DATABASE=IC80 HD Camera
@@ -46334,14 +46694,23 @@ usb:v1748p0101*
usb:v174C*
ID_VENDOR_FROM_DATABASE=ASMedia Technology Inc.
+usb:v174Cp1153*
+ ID_MODEL_FROM_DATABASE=ASM2115 SATA 6Gb/s bridge
+
+usb:v174Cp2074*
+ ID_MODEL_FROM_DATABASE=ASM1074 High-Speed hub
+
+usb:v174Cp3074*
+ ID_MODEL_FROM_DATABASE=ASM1074 SuperSpeed hub
+
usb:v174Cp5106*
- ID_MODEL_FROM_DATABASE=Transcend StoreJet 25M3
+ ID_MODEL_FROM_DATABASE=ASM1051 SATA 3Gb/s bridge
usb:v174Cp5136*
ID_MODEL_FROM_DATABASE=ASM1053 SATA 6Gb/s bridge
usb:v174Cp55AA*
- ID_MODEL_FROM_DATABASE=ASM1051 SATA 3Gb/s bridge
+ ID_MODEL_FROM_DATABASE=ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge
usb:v174F*
ID_VENDOR_FROM_DATABASE=Syntek
@@ -46460,6 +46829,36 @@ usb:v1781p083F*
usb:v1781p0938*
ID_MODEL_FROM_DATABASE=Iguanaworks USB IR Transceiver
+usb:v1781p0A96*
+ ID_MODEL_FROM_DATABASE=raphnet.net usb_game12
+
+usb:v1781p0A97*
+ ID_MODEL_FROM_DATABASE=raphnet.net SNES mouse adapter
+
+usb:v1781p0A98*
+ ID_MODEL_FROM_DATABASE=raphnet.net USBTenki
+
+usb:v1781p0A99*
+ ID_MODEL_FROM_DATABASE=raphnet.net NES
+
+usb:v1781p0A9A*
+ ID_MODEL_FROM_DATABASE=raphnet.net Gamecube/N64 controller
+
+usb:v1781p0A9B*
+ ID_MODEL_FROM_DATABASE=raphnet.net DB9Joy
+
+usb:v1781p0A9C*
+ ID_MODEL_FROM_DATABASE=raphnet.net Intellivision
+
+usb:v1781p0A9D*
+ ID_MODEL_FROM_DATABASE=raphnet.net 4nes4snes
+
+usb:v1781p0A9E*
+ ID_MODEL_FROM_DATABASE=raphnet.net Megadrive multitap
+
+usb:v1781p0A9F*
+ ID_MODEL_FROM_DATABASE=raphnet.net MultiDB9joy
+
usb:v1781p0C30*
ID_MODEL_FROM_DATABASE=Telldus TellStick
@@ -46472,6 +46871,12 @@ usb:v1781p0C9F*
usb:v1781p1EEF*
ID_MODEL_FROM_DATABASE=OpenAPC SecuKey
+usb:v1781p1EF0*
+ ID_MODEL_FROM_DATABASE=E1701 Modular Controller Card
+
+usb:v1781p1EF1*
+ ID_MODEL_FROM_DATABASE=E1701 Modular Controller Card
+
usb:v1782*
ID_VENDOR_FROM_DATABASE=Spreadtrum Communications Inc.
@@ -47513,6 +47918,18 @@ usb:v1995p3202*
usb:v1995p3203*
ID_MODEL_FROM_DATABASE=REC-A-ADPT-USB (recorder)
+usb:v1996*
+ ID_VENDOR_FROM_DATABASE=PixeLINK
+
+usb:v1996p3010*
+ ID_MODEL_FROM_DATABASE=Camera Release 4
+
+usb:v1996p3011*
+ ID_MODEL_FROM_DATABASE=OEM Camera
+
+usb:v1996p3012*
+ ID_MODEL_FROM_DATABASE=e-ImageData Corp. ScanPro
+
usb:v199B*
ID_VENDOR_FROM_DATABASE=MicroStrain, Inc.
@@ -50054,6 +50471,36 @@ usb:v2101*
usb:v2101p0201*
ID_MODEL_FROM_DATABASE=SIIG 4-to-2 Printer Switch
+usb:v2109*
+ ID_VENDOR_FROM_DATABASE=VIA Labs, Inc.
+
+usb:v2109p0700*
+ ID_MODEL_FROM_DATABASE=VL700 SATA 3Gb/s bridge
+
+usb:v2109p0701*
+ ID_MODEL_FROM_DATABASE=VL701 SATA 3Gb/s bridge
+
+usb:v2109p0810*
+ ID_MODEL_FROM_DATABASE=VL81x Hub
+
+usb:v2109p0811*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2109p0812*
+ ID_MODEL_FROM_DATABASE=VL812 Hub
+
+usb:v2109p2811*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2109p2812*
+ ID_MODEL_FROM_DATABASE=VL812 Hub
+
+usb:v2109p3431*
+ ID_MODEL_FROM_DATABASE=Hub
+
+usb:v2109p8110*
+ ID_MODEL_FROM_DATABASE=Hub
+
usb:v2149*
ID_VENDOR_FROM_DATABASE=Advanced Silicon S.A.
@@ -50636,6 +51083,15 @@ usb:v2478p2008*
usb:v249C*
ID_VENDOR_FROM_DATABASE=M2Tech s.r.l.
+usb:v24E1*
+ ID_VENDOR_FROM_DATABASE=Paratronic
+
+usb:v24E1p3001*
+ ID_MODEL_FROM_DATABASE=Adp-usb
+
+usb:v24E1p3005*
+ ID_MODEL_FROM_DATABASE=Radius
+
usb:v2632*
ID_VENDOR_FROM_DATABASE=TwinMOS
@@ -50906,6 +51362,54 @@ usb:v2899*
usb:v2899p012C*
ID_MODEL_FROM_DATABASE=Camera Device
+usb:v289B*
+ ID_VENDOR_FROM_DATABASE=Dracal/Raphnet technologies
+
+usb:v289Bp0001*
+ ID_MODEL_FROM_DATABASE=Gamecube/N64 controller v2.2
+
+usb:v289Bp0002*
+ ID_MODEL_FROM_DATABASE=2nes2snes
+
+usb:v289Bp0003*
+ ID_MODEL_FROM_DATABASE=4nes4snes
+
+usb:v289Bp0004*
+ ID_MODEL_FROM_DATABASE=Gamecube/N64 controller v2.3
+
+usb:v289Bp0005*
+ ID_MODEL_FROM_DATABASE=Saturn (Joystick mode)
+
+usb:v289Bp0006*
+ ID_MODEL_FROM_DATABASE=Saturn (Mouse mode)
+
+usb:v289Bp0007*
+ ID_MODEL_FROM_DATABASE=Famicom controller
+
+usb:v289Bp0008*
+ ID_MODEL_FROM_DATABASE=Dreamcast (Joystick mode)
+
+usb:v289Bp0009*
+ ID_MODEL_FROM_DATABASE=Dreamcast (Mouse mode)
+
+usb:v289Bp000A*
+ ID_MODEL_FROM_DATABASE=Dreamcast (Keyboard mode)
+
+usb:v289Bp000B*
+ ID_MODEL_FROM_DATABASE=Gamecube/N64 controller v2.9 (Keyboard mode)
+
+usb:v289Bp000C*
+ ID_MODEL_FROM_DATABASE=Gamecube/N64 controller v2.9 (Joystick mode)
+
+usb:v289Bp0100*
+ ID_MODEL_FROM_DATABASE=Dual-relay board
+
+usb:v289Bp0500*
+ ID_MODEL_FROM_DATABASE=Energy meter
+
+usb:v289Bp0502*
+ ID_MODEL_FROM_DATABASE=Precision barometer
+
usb:v2931*
ID_VENDOR_FROM_DATABASE=Jolla Oy
@@ -50925,10 +51429,106 @@ usb:v2A03*
ID_VENDOR_FROM_DATABASE=dog hunter AG
usb:v2A03p0001*
- ID_MODEL_FROM_DATABASE=Linino One (CDC ACM)
+ ID_MODEL_FROM_DATABASE=Linino ONE (bootloader)
+
+usb:v2A03p0036*
+ ID_MODEL_FROM_DATABASE=Arduino Leonardo (bootloader)
+
+usb:v2A03p0037*
+ ID_MODEL_FROM_DATABASE=Arduino Micro (bootloader)
+
+usb:v2A03p0038*
+ ID_MODEL_FROM_DATABASE=Arduino Robot Control (bootloader)
+
+usb:v2A03p0039*
+ ID_MODEL_FROM_DATABASE=Arduino Robot Motor (bootloader)
+
+usb:v2A03p003A*
+ ID_MODEL_FROM_DATABASE=Arduino Micro ADK rev3 (bootloader)
+
+usb:v2A03p003B*
+ ID_MODEL_FROM_DATABASE=Arduino Serial
+
+usb:v2A03p003C*
+ ID_MODEL_FROM_DATABASE=Arduino Explora (bootloader)
+
+usb:v2A03p003D*
+ ID_MODEL_FROM_DATABASE=Arduino Due (usb2serial)
+
+usb:v2A03p003E*
+ ID_MODEL_FROM_DATABASE=Arduino Due
+
+usb:v2A03p0041*
+ ID_MODEL_FROM_DATABASE=Arduino Yun (bootloader)
+
+usb:v2A03p0042*
+ ID_MODEL_FROM_DATABASE=Arduino Mega 2560 Rev3
+
+usb:v2A03p0043*
+ ID_MODEL_FROM_DATABASE=Arduino Uno Rev3
+
+usb:v2A03p004D*
+ ID_MODEL_FROM_DATABASE=Arduino Zero Pro (bootloader)
usb:v2A03p8001*
- ID_MODEL_FROM_DATABASE=Linino ONE board
+ ID_MODEL_FROM_DATABASE=Linino ONE (CDC ACM)
+
+usb:v2A03p8036*
+ ID_MODEL_FROM_DATABASE=Arduino Leonardo (CDC ACM)
+
+usb:v2A03p8037*
+ ID_MODEL_FROM_DATABASE=Arduino Micro (CDC ACM)
+
+usb:v2A03p8038*
+ ID_MODEL_FROM_DATABASE=Arduino Robot Control (CDC ACM)
+
+usb:v2A03p8039*
+ ID_MODEL_FROM_DATABASE=Arduino Robot Motor (CDC ACM)
+
+usb:v2A03p803A*
+ ID_MODEL_FROM_DATABASE=Arduino Micro ADK rev3 (CDC ACM)
+
+usb:v2A03p803C*
+ ID_MODEL_FROM_DATABASE=Arduino Explora (CDC ACM)
+
+usb:v2A03p8041*
+ ID_MODEL_FROM_DATABASE=Arduino Yun (CDC ACM)
+
+usb:v2A03p804D*
+ ID_MODEL_FROM_DATABASE=Arduino Zero Pro (CDC ACM)
+
+usb:v2A37*
+ ID_VENDOR_FROM_DATABASE=RTD Embedded Technologies, Inc.
+
+usb:v2A37p5110*
+ ID_MODEL_FROM_DATABASE=UPS35110/UPS25110
+
+usb:v2A45*
+ ID_VENDOR_FROM_DATABASE=Meizu Corp.
+
+usb:v2A45p0001*
+ ID_MODEL_FROM_DATABASE=MX Phone (BICR)
+
+usb:v2A45p0C02*
+ ID_MODEL_FROM_DATABASE=MX Phone (MTP & ADB)
+
+usb:v2A45p0C03*
+ ID_MODEL_FROM_DATABASE=MX Phone (BICR & ADB)
+
+usb:v2A45p2008*
+ ID_MODEL_FROM_DATABASE=MX Phone (MTP)
+
+usb:v2A45p200A*
+ ID_MODEL_FROM_DATABASE=MX Phone (MTP & ACM & ADB)
+
+usb:v2A45p200B*
+ ID_MODEL_FROM_DATABASE=MX Phone (PTP)
+
+usb:v2A45p200C*
+ ID_MODEL_FROM_DATABASE=MX Phone (PTP & ADB)
+
+usb:v2A45p2012*
+ ID_MODEL_FROM_DATABASE=MX Phone (MTP & ACM)
usb:v2C02*
ID_VENDOR_FROM_DATABASE=Planex Communications
diff --git a/hwdb/70-mouse.hwdb b/hwdb/70-mouse.hwdb
index fbb2933581..8174f2762e 100644
--- a/hwdb/70-mouse.hwdb
+++ b/hwdb/70-mouse.hwdb
@@ -198,6 +198,10 @@ mouse:usb:v046dpc245:name:Logitech Gaming Mouse G400:
mouse:usb:v046dpc24c:name:Logitech G400s Optical Gaming Mouse:
MOUSE_DPI=400@1000 *800@1000 2000@1000 4000@1000
+# Logitech M570 trackball
+mouse:usb:v046dp1028:name:Logitech M570:
+ MOUSE_DPI=540@167
+
# Logitech Wireless Mouse M185
mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4008:
# Logitech M705 (marathon mouse)
@@ -276,6 +280,10 @@ mouse:usb:v045ep07b1:name:Microsoft Microsoft® Nano Transceiver v1.0:
mouse:bluetooth:v045ep0702:name:Microsoft Wireless Laser Mouse 8000:
MOUSE_DPI=1000@1000
+# Microsoft Arc Touch Mouse SE:
+mouse:bluetooth:v045ep07f3:name:Arc Touch Mouse SE:
+ MOUSE_DPI=1000@2000
+
##########################################
# Oklick
##########################################
diff --git a/m4/ax_normalize_path.m4 b/m4/ax_normalize_path.m4
new file mode 100644
index 0000000000..e8f9973e35
--- /dev/null
+++ b/m4/ax_normalize_path.m4
@@ -0,0 +1,115 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_normalize_path.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_NORMALIZE_PATH(VARNAME, [REFERENCE_STRING])
+#
+# DESCRIPTION
+#
+# Perform some cleanups on the value of $VARNAME (interpreted as a path):
+#
+# - empty paths are changed to '.'
+# - trailing slashes are removed
+# - repeated slashes are squeezed except a leading doubled slash '//'
+# (which might indicate a networked disk on some OS).
+#
+# REFERENCE_STRING is used to turn '/' into '\' and vice-versa: if
+# REFERENCE_STRING contains some backslashes, all slashes and backslashes
+# are turned into backslashes, otherwise they are all turned into slashes.
+#
+# This makes processing of DOS filenames quite easier, because you can
+# turn a filename to the Unix notation, make your processing, and turn it
+# back to original notation.
+#
+# filename='A:\FOO\\BAR\'
+# old_filename="$filename"
+# # Switch to the unix notation
+# AX_NORMALIZE_PATH([filename], ["/"])
+# # now we have $filename = 'A:/FOO/BAR' and we can process it as if
+# # it was a Unix path. For instance let's say that you want
+# # to append '/subpath':
+# filename="$filename/subpath"
+# # finally switch back to the original notation
+# AX_NORMALIZE_PATH([filename], ["$old_filename"])
+# # now $filename equals to 'A:\FOO\BAR\subpath'
+#
+# One good reason to make all path processing with the unix convention is
+# that backslashes have a special meaning in many cases. For instance
+#
+# expr 'A:\FOO' : 'A:\Foo'
+#
+# will return 0 because the second argument is a regex in which
+# backslashes have to be backslashed. In other words, to have the two
+# strings to match you should write this instead:
+#
+# expr 'A:\Foo' : 'A:\\Foo'
+#
+# Such behavior makes DOS filenames extremely unpleasant to work with. So
+# temporary turn your paths to the Unix notation, and revert them to the
+# original notation after the processing. See the macro
+# AX_COMPUTE_RELATIVE_PATHS for a concrete example of this.
+#
+# REFERENCE_STRING defaults to $VARIABLE, this means that slashes will be
+# converted to backslashes if $VARIABLE already contains some backslashes
+# (see $thirddir below).
+#
+# firstdir='/usr/local//share'
+# seconddir='C:\Program Files\\'
+# thirddir='C:\home/usr/'
+# AX_NORMALIZE_PATH([firstdir])
+# AX_NORMALIZE_PATH([seconddir])
+# AX_NORMALIZE_PATH([thirddir])
+# # $firstdir = '/usr/local/share'
+# # $seconddir = 'C:\Program Files'
+# # $thirddir = 'C:\home\usr'
+#
+# LICENSE
+#
+# Copyright (c) 2008 Alexandre Duret-Lutz <adl@gnu.org>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 5
+
+AU_ALIAS([ADL_NORMALIZE_PATH], [AX_NORMALIZE_PATH])
+AC_DEFUN([AX_NORMALIZE_PATH],
+[case ":[$]$1:" in
+# change empty paths to '.'
+ ::) $1='.' ;;
+# strip trailing slashes
+ :*[[\\/]]:) $1=`echo "[$]$1" | sed 's,[[\\/]]*[$],,'` ;;
+ :*:) ;;
+esac
+# squeze repeated slashes
+case ifelse($2,,"[$]$1",$2) in
+# if the path contains any backslashes, turn slashes into backslashes
+ *\\*) $1=`echo "[$]$1" | sed 's,\(.\)[[\\/]][[\\/]]*,\1\\\\,g'` ;;
+# if the path contains slashes, also turn backslashes into slashes
+ *) $1=`echo "[$]$1" | sed 's,\(.\)[[\\/]][[\\/]]*,\1/,g'` ;;
+esac])
diff --git a/man/binfmt.d.xml b/man/binfmt.d.xml
index 5b63cfb4c3..3aa5eb1859 100644
--- a/man/binfmt.d.xml
+++ b/man/binfmt.d.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/bootchart.conf.xml b/man/bootchart.conf.xml
index bf6ca0bf9e..b383f6e24d 100644
--- a/man/bootchart.conf.xml
+++ b/man/bootchart.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -52,17 +55,17 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/bootchart.conf</filename></para>
- <para><filename>/etc/systemd/bootchart.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/bootchart.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/bootchart.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/bootchart.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/bootchart.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/bootchart.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>When starting, systemd-bootchart will read the configuration
- file <filename>/etc/systemd/bootchart.conf</filename>, followed by
+ file <filename>&pkgsysconfdir;/bootchart.conf</filename>, followed by
the files in the <filename>bootchart.conf.d</filename>
directories. These configuration files determine logging
parameters and graph output.</para>
@@ -122,10 +125,10 @@
<term><varname>Init=[path]</varname></term>
<listitem><para>Configures bootchart to run a non-standard
binary instead of
- <filename>/usr/lib/systemd/systemd</filename>. This option is
+ <filename>&rootlibexecdir;/systemd</filename>. This option is
only relevant if bootchart was invoked from the kernel command
line with
- init=/usr/lib/systemd/systemd-bootchart.</para></listitem>
+ init=&rootlibexecdir;/systemd-bootchart.</para></listitem>
</varlistentry>
<varlistentry>
diff --git a/man/bootctl.xml b/man/bootctl.xml
index 63ad9392eb..c7c65aa4b2 100644
--- a/man/bootctl.xml
+++ b/man/bootctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/bootup.xml b/man/bootup.xml
index b92057af29..de34a59a72 100644
--- a/man/bootup.xml
+++ b/man/bootup.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/busctl.xml b/man/busctl.xml
index 807fc78e8f..08303b4dd8 100644
--- a/man/busctl.xml
+++ b/man/busctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/coredump.conf.xml b/man/coredump.conf.xml
index fd54c59e6b..4c65c1cf03 100644
--- a/man/coredump.conf.xml
+++ b/man/coredump.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/coredump.conf</filename></para>
- <para><filename>/etc/systemd/coredump.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/coredump.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/coredump.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/coredump.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/coredump.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/coredump.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/coredumpctl.xml b/man/coredumpctl.xml
index efbc655a76..4bd1a7e67f 100644
--- a/man/coredumpctl.xml
+++ b/man/coredumpctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/crypttab.xml b/man/crypttab.xml
index d4ff760adc..d403e71bef 100644
--- a/man/crypttab.xml
+++ b/man/crypttab.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/daemon.xml b/man/daemon.xml
index a8bbfc055b..38d458e05d 100644
--- a/man/daemon.xml
+++ b/man/daemon.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/file-hierarchy.xml b/man/file-hierarchy.xml
index 3a5627d196..f73a3edc06 100644
--- a/man/file-hierarchy.xml
+++ b/man/file-hierarchy.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/halt.xml b/man/halt.xml
index a06dbd0097..f425ebdb8e 100644
--- a/man/halt.xml
+++ b/man/halt.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/hostname.xml b/man/hostname.xml
index 5d3d46d8ce..34aaca1acd 100644
--- a/man/hostname.xml
+++ b/man/hostname.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -57,11 +60,12 @@
name of the local system that is set during boot using the
<citerefentry><refentrytitle>sethostname</refentrytitle><manvolnum>2</manvolnum></citerefentry>
system call. It should contain a single newline-terminated
- hostname string. The hostname may be a free-form string up to 64
- characters in length; however, it is recommended that it consists
- only of 7-bit ASCII lower-case characters and no spaces or dots,
- and limits itself to the format allowed for DNS domain name
- labels, even though this is not a strict requirement.</para>
+ hostname string. Comments (lines starting with a `#') are ignored.
+ The hostname may be a free-form string up to 64 characters in length;
+ however, it is recommended that it consists only of 7-bit ASCII lower-case
+ characters and no spaces or dots, and limits itself to the format allowed
+ for DNS domain name labels, even though this is not a strict
+ requirement.</para>
<para>Depending on the operating system, other configuration files
might be checked for configuration of the hostname as well,
diff --git a/man/hostnamectl.xml b/man/hostnamectl.xml
index b1f038156d..93934668cc 100644
--- a/man/hostnamectl.xml
+++ b/man/hostnamectl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/hwdb.xml b/man/hwdb.xml
index 509dab81c5..e6215df738 100644
--- a/man/hwdb.xml
+++ b/man/hwdb.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refentry id="hwdb" conditional="ENABLE_HWDB">
<refentryinfo>
@@ -40,17 +43,17 @@
<refsect1><title>Hardware Database Files</title>
<para>The hwdb files are read from the files located in the
- system hwdb directory <filename>/usr/lib/udev/hwdb.d</filename>,
+ system hwdb directory <filename>&udevlibexecdir;/hwdb.d</filename>,
the volatile runtime directory <filename>/run/udev/hwdb.d</filename>
and the local administration directory <filename>/etc/udev/hwdb.d</filename>.
All hwdb 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
+ over files with the same name in <filename>&rootprefix;/lib</filename>. This can be
used to override a system-supplied hwdb file with a local file if needed;
a symlink in <filename>/etc</filename> with the same name as a hwdb file in
- <filename>/usr/lib</filename>, pointing to <filename>/dev/null</filename>,
+ <filename>&rootprefix;/lib</filename>, pointing to <filename>/dev/null</filename>,
disables the hwdb file entirely. hwdb files must have the extension
<filename>.hwdb</filename>; other extensions are ignored.</para>
@@ -70,7 +73,7 @@
<para>The content of all hwdb files is read by
<citerefentry><refentrytitle>systemd-hwdb</refentrytitle><manvolnum>8</manvolnum></citerefentry>
and compiled to a binary database located at <filename>/etc/udev/hwdb.bin</filename>,
- or alternatively <filename>/usr/lib/udev/hwdb.bin</filename> if you want ship the compiled
+ or alternatively <filename>&udevlibexecdir;/hwdb.bin</filename> if you want ship the compiled
database in an immutable image.
During runtime only the binary database is used.</para>
</refsect1>
diff --git a/man/journal-remote.conf.xml b/man/journal-remote.conf.xml
index a7b2227182..948dfa531d 100644
--- a/man/journal-remote.conf.xml
+++ b/man/journal-remote.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/journal-remote.conf</filename></para>
- <para><filename>/etc/systemd/journald.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/journal-remote.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/journald.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/journald.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/journald.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/journald.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -83,7 +86,7 @@
<varlistentry>
<term><varname>ServerKeyFile=</varname></term>
- <listitem><para>SSL key in PEM format</para></listitem>
+ <listitem><para>SSL key in PEM format.</para></listitem>
</varlistentry>
<varlistentry>
diff --git a/man/journalctl.xml b/man/journalctl.xml
index 08de0ff068..d67d9606be 100644
--- a/man/journalctl.xml
+++ b/man/journalctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/journald.conf.xml b/man/journald.conf.xml
index 2cbe58bc15..8d0dbb0133 100644
--- a/man/journald.conf.xml
+++ b/man/journald.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/journald.conf</filename></para>
- <para><filename>/etc/systemd/journald.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/journald.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/journald.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/journald.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/journald.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/journald.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml
index eb73727027..6490123a53 100644
--- a/man/kernel-command-line.xml
+++ b/man/kernel-command-line.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/kernel-install.xml b/man/kernel-install.xml
index d7e27de758..8891bae71e 100644
--- a/man/kernel-install.xml
+++ b/man/kernel-install.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/less-variables.xml b/man/less-variables.xml
index 0fb4d7fbcf..e344c62e1a 100644
--- a/man/less-variables.xml
+++ b/man/less-variables.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refsect1>
<title>Environment</title>
diff --git a/man/libsystemd-pkgconfig.xml b/man/libsystemd-pkgconfig.xml
index 272da64cd7..3620f47316 100644
--- a/man/libsystemd-pkgconfig.xml
+++ b/man/libsystemd-pkgconfig.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refsect1>
<title>Notes</title>
diff --git a/man/locale.conf.xml b/man/locale.conf.xml
index 2c32d16094..8af49af7f2 100644
--- a/man/locale.conf.xml
+++ b/man/locale.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/localectl.xml b/man/localectl.xml
index 7def047f62..caf963ae5e 100644
--- a/man/localectl.xml
+++ b/man/localectl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/localtime.xml b/man/localtime.xml
index 2827da6e93..1740dde9eb 100644
--- a/man/localtime.xml
+++ b/man/localtime.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/loginctl.xml b/man/loginctl.xml
index 9dda14d454..d0529c160e 100644
--- a/man/loginctl.xml
+++ b/man/loginctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/logind.conf.xml b/man/logind.conf.xml
index 2b79547275..96ebd6eed0 100644
--- a/man/logind.conf.xml
+++ b/man/logind.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/logind.conf</filename></para>
- <para><filename>/etc/systemd/logind.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/logind.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/logind.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/logind.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/logind.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/logind.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/machine-id.xml b/man/machine-id.xml
index 92d67a3869..bb7cd7f060 100644
--- a/man/machine-id.xml
+++ b/man/machine-id.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/machine-info.xml b/man/machine-info.xml
index 916f1dab66..a6db1e0317 100644
--- a/man/machine-info.xml
+++ b/man/machine-info.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/machinectl.xml b/man/machinectl.xml
index 50cbb1bc98..18ef6a5780 100644
--- a/man/machinectl.xml
+++ b/man/machinectl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -585,8 +588,8 @@
first verified with detached GPG signature file
<filename>SHA256SUMS.gpg</filename>. The public key for this
verification step needs to be available in
- <filename>/usr/lib/systemd/import-pubring.gpg</filename> or
- <filename>/etc/systemd/import-pubring.gpg</filename>.</para>
+ <filename>&rootlibexecdir;/import-pubring.gpg</filename> or
+ <filename>&pkgsysconfdir;/import-pubring.gpg</filename>.</para>
<para>The container image will be downloaded and stored in a
read-only subvolume in
diff --git a/man/modules-load.d.xml b/man/modules-load.d.xml
index 4b722aa128..82a98be666 100644
--- a/man/modules-load.d.xml
+++ b/man/modules-load.d.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/networkctl.xml b/man/networkctl.xml
index d11d60f2a9..402698cb12 100644
--- a/man/networkctl.xml
+++ b/man/networkctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/nss-myhostname.xml b/man/nss-myhostname.xml
index 2d36df6f6f..7379213f81 100644
--- a/man/nss-myhostname.xml
+++ b/man/nss-myhostname.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/nss-mymachines.xml b/man/nss-mymachines.xml
index eb1ed2592b..a3e6c75d1b 100644
--- a/man/nss-mymachines.xml
+++ b/man/nss-mymachines.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/os-release.xml b/man/os-release.xml
index 4ca2e59706..6ce5885812 100644
--- a/man/os-release.xml
+++ b/man/os-release.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/pam_systemd.xml b/man/pam_systemd.xml
index b4a3f502b4..6fdbcf91e0 100644
--- a/man/pam_systemd.xml
+++ b/man/pam_systemd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/resolved.conf.xml b/man/resolved.conf.xml
index 8047a4ea75..52329eba56 100644
--- a/man/resolved.conf.xml
+++ b/man/resolved.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/resolved.conf</filename></para>
- <para><filename>/etc/systemd/resolved.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/resolved.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/resolved.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/resolved.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/resolved.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/resolved.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/runlevel.xml b/man/runlevel.xml
index fc1f523855..f34f9583e8 100644
--- a/man/runlevel.xml
+++ b/man/runlevel.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd-daemon.xml b/man/sd-daemon.xml
index b7ba363656..686ba0cefe 100644
--- a/man/sd-daemon.xml
+++ b/man/sd-daemon.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd-id128.xml b/man/sd-id128.xml
index ea7972055d..067d43b432 100644
--- a/man/sd-id128.xml
+++ b/man/sd-id128.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd-journal.xml b/man/sd-journal.xml
index 9b1a52207f..165284c0ae 100644
--- a/man/sd-journal.xml
+++ b/man/sd-journal.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd-login.xml b/man/sd-login.xml
index 328f71164d..4c4e5f0077 100644
--- a/man/sd-login.xml
+++ b/man/sd-login.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_booted.xml b/man/sd_booted.xml
index 4dd674b8ea..235e78d083 100644
--- a/man/sd_booted.xml
+++ b/man/sd_booted.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_creds_get_pid.xml b/man/sd_bus_creds_get_pid.xml
index 4debee6124..54714dea1d 100644
--- a/man/sd_bus_creds_get_pid.xml
+++ b/man/sd_bus_creds_get_pid.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_creds_new_from_pid.xml b/man/sd_bus_creds_new_from_pid.xml
index 518a95abd0..695d4e1f5a 100644
--- a/man/sd_bus_creds_new_from_pid.xml
+++ b/man/sd_bus_creds_new_from_pid.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_default.xml b/man/sd_bus_default.xml
index 9db264ce59..55f1b8bb69 100644
--- a/man/sd_bus_default.xml
+++ b/man/sd_bus_default.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_error.xml b/man/sd_bus_error.xml
index dc5a93d617..bd2a27984c 100644
--- a/man/sd_bus_error.xml
+++ b/man/sd_bus_error.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_append.xml b/man/sd_bus_message_append.xml
index c3bffbdfd9..91a80792e1 100644
--- a/man/sd_bus_message_append.xml
+++ b/man/sd_bus_message_append.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_append_array.xml b/man/sd_bus_message_append_array.xml
index 9490689e06..5409893374 100644
--- a/man/sd_bus_message_append_array.xml
+++ b/man/sd_bus_message_append_array.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_append_basic.xml b/man/sd_bus_message_append_basic.xml
index 344b7791fa..81ac6de952 100644
--- a/man/sd_bus_message_append_basic.xml
+++ b/man/sd_bus_message_append_basic.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_append_string_memfd.xml b/man/sd_bus_message_append_string_memfd.xml
index ea3b7d3b75..1fecbd5773 100644
--- a/man/sd_bus_message_append_string_memfd.xml
+++ b/man/sd_bus_message_append_string_memfd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_append_strv.xml b/man/sd_bus_message_append_strv.xml
index b91406f275..d986b06a41 100644
--- a/man/sd_bus_message_append_strv.xml
+++ b/man/sd_bus_message_append_strv.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_get_cookie.xml b/man/sd_bus_message_get_cookie.xml
index 02374d7508..7795acfec3 100644
--- a/man/sd_bus_message_get_cookie.xml
+++ b/man/sd_bus_message_get_cookie.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_message_get_monotonic_usec.xml b/man/sd_bus_message_get_monotonic_usec.xml
index d74aaad7dd..c109fe10a3 100644
--- a/man/sd_bus_message_get_monotonic_usec.xml
+++ b/man/sd_bus_message_get_monotonic_usec.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_negotiate_fds.xml b/man/sd_bus_negotiate_fds.xml
index 26a599e7d3..4f9204e7bc 100644
--- a/man/sd_bus_negotiate_fds.xml
+++ b/man/sd_bus_negotiate_fds.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_new.xml b/man/sd_bus_new.xml
index 91ca8161dc..bc91dd2665 100644
--- a/man/sd_bus_new.xml
+++ b/man/sd_bus_new.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_path_encode.xml b/man/sd_bus_path_encode.xml
index 69cda53bf4..0a6ac80473 100644
--- a/man/sd_bus_path_encode.xml
+++ b/man/sd_bus_path_encode.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_bus_request_name.xml b/man/sd_bus_request_name.xml
index 6aa132bb26..78b440b7db 100644
--- a/man/sd_bus_request_name.xml
+++ b/man/sd_bus_request_name.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_add_child.xml b/man/sd_event_add_child.xml
index 640d4b12d0..7de9f409e9 100644
--- a/man/sd_event_add_child.xml
+++ b/man/sd_event_add_child.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_add_defer.xml b/man/sd_event_add_defer.xml
index dd5d19b519..4aabc0793a 100644
--- a/man/sd_event_add_defer.xml
+++ b/man/sd_event_add_defer.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_add_signal.xml b/man/sd_event_add_signal.xml
index ca9c4b94fd..e84d5c7200 100644
--- a/man/sd_event_add_signal.xml
+++ b/man/sd_event_add_signal.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_add_time.xml b/man/sd_event_add_time.xml
index 5692ee6008..3c5de48cab 100644
--- a/man/sd_event_add_time.xml
+++ b/man/sd_event_add_time.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_get_fd.xml b/man/sd_event_get_fd.xml
index 332e729ee8..8f74c1e5c4 100644
--- a/man/sd_event_get_fd.xml
+++ b/man/sd_event_get_fd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_new.xml b/man/sd_event_new.xml
index 854a887bce..d225330023 100644
--- a/man/sd_event_new.xml
+++ b/man/sd_event_new.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_run.xml b/man/sd_event_run.xml
index ac78d358b6..036887d9f0 100644
--- a/man/sd_event_run.xml
+++ b/man/sd_event_run.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_set_name.xml b/man/sd_event_set_name.xml
index 3584b225d1..0b46414bba 100644
--- a/man/sd_event_set_name.xml
+++ b/man/sd_event_set_name.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_event_wait.xml b/man/sd_event_wait.xml
index 835cc5deb3..db74a96e8e 100644
--- a/man/sd_event_wait.xml
+++ b/man/sd_event_wait.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_get_seats.xml b/man/sd_get_seats.xml
index 4390d36ebe..3f2c666c61 100644
--- a/man/sd_get_seats.xml
+++ b/man/sd_get_seats.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_id128_get_machine.xml b/man/sd_id128_get_machine.xml
index 2ad1f8f728..02fa2da283 100644
--- a/man/sd_id128_get_machine.xml
+++ b/man/sd_id128_get_machine.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_id128_randomize.xml b/man/sd_id128_randomize.xml
index ab449d2937..c4d7c42106 100644
--- a/man/sd_id128_randomize.xml
+++ b/man/sd_id128_randomize.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_id128_to_string.xml b/man/sd_id128_to_string.xml
index e70c80892e..988a646d84 100644
--- a/man/sd_id128_to_string.xml
+++ b/man/sd_id128_to_string.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_is_fifo.xml b/man/sd_is_fifo.xml
index 627cb87aaf..57dd6afc89 100644
--- a/man/sd_is_fifo.xml
+++ b/man/sd_is_fifo.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_add_match.xml b/man/sd_journal_add_match.xml
index 420f56356a..fe89cbf75c 100644
--- a/man/sd_journal_add_match.xml
+++ b/man/sd_journal_add_match.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_catalog.xml b/man/sd_journal_get_catalog.xml
index c19eb11b20..2ff3fc2826 100644
--- a/man/sd_journal_get_catalog.xml
+++ b/man/sd_journal_get_catalog.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_cursor.xml b/man/sd_journal_get_cursor.xml
index a400d8b1b5..1d38bac7fb 100644
--- a/man/sd_journal_get_cursor.xml
+++ b/man/sd_journal_get_cursor.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_cutoff_realtime_usec.xml b/man/sd_journal_get_cutoff_realtime_usec.xml
index 23e7cc65e8..ae5e638d70 100644
--- a/man/sd_journal_get_cutoff_realtime_usec.xml
+++ b/man/sd_journal_get_cutoff_realtime_usec.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_data.xml b/man/sd_journal_get_data.xml
index 1afbd7371c..b395fe01c9 100644
--- a/man/sd_journal_get_data.xml
+++ b/man/sd_journal_get_data.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_fd.xml b/man/sd_journal_get_fd.xml
index 3a38f733ab..51dcb1aeeb 100644
--- a/man/sd_journal_get_fd.xml
+++ b/man/sd_journal_get_fd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_realtime_usec.xml b/man/sd_journal_get_realtime_usec.xml
index 607d74666b..921aa77ab6 100644
--- a/man/sd_journal_get_realtime_usec.xml
+++ b/man/sd_journal_get_realtime_usec.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_get_usage.xml b/man/sd_journal_get_usage.xml
index 72c804d834..a89b77907c 100644
--- a/man/sd_journal_get_usage.xml
+++ b/man/sd_journal_get_usage.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_next.xml b/man/sd_journal_next.xml
index 115fe26661..216d9a59c6 100644
--- a/man/sd_journal_next.xml
+++ b/man/sd_journal_next.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_open.xml b/man/sd_journal_open.xml
index fb572802a3..f6aac75546 100644
--- a/man/sd_journal_open.xml
+++ b/man/sd_journal_open.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_print.xml b/man/sd_journal_print.xml
index 0cd0b45b9a..6dbf73f9c1 100644
--- a/man/sd_journal_print.xml
+++ b/man/sd_journal_print.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_query_unique.xml b/man/sd_journal_query_unique.xml
index ac0e5f633f..5c92f8972e 100644
--- a/man/sd_journal_query_unique.xml
+++ b/man/sd_journal_query_unique.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_seek_head.xml b/man/sd_journal_seek_head.xml
index d74c2d5bbc..d4c13c21f8 100644
--- a/man/sd_journal_seek_head.xml
+++ b/man/sd_journal_seek_head.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_journal_stream_fd.xml b/man/sd_journal_stream_fd.xml
index 2ea7731b48..ae7990e212 100644
--- a/man/sd_journal_stream_fd.xml
+++ b/man/sd_journal_stream_fd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_listen_fds.xml b/man/sd_listen_fds.xml
index 9b9705eb2e..38e159bb42 100644
--- a/man/sd_listen_fds.xml
+++ b/man/sd_listen_fds.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_login_monitor_new.xml b/man/sd_login_monitor_new.xml
index a7b47a3207..ef97dae1d0 100644
--- a/man/sd_login_monitor_new.xml
+++ b/man/sd_login_monitor_new.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_machine_get_class.xml b/man/sd_machine_get_class.xml
index 5b881ccea1..68babd1981 100644
--- a/man/sd_machine_get_class.xml
+++ b/man/sd_machine_get_class.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_notify.xml b/man/sd_notify.xml
index 87e59c9cc2..d563bcf2aa 100644
--- a/man/sd_notify.xml
+++ b/man/sd_notify.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_pid_get_session.xml b/man/sd_pid_get_session.xml
index b46d47101b..05a396157a 100644
--- a/man/sd_pid_get_session.xml
+++ b/man/sd_pid_get_session.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_seat_get_active.xml b/man/sd_seat_get_active.xml
index 3c57ec9ea4..74b4ed5fc1 100644
--- a/man/sd_seat_get_active.xml
+++ b/man/sd_seat_get_active.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_session_is_active.xml b/man/sd_session_is_active.xml
index 4ca3a6c150..e3af2b39c9 100644
--- a/man/sd_session_is_active.xml
+++ b/man/sd_session_is_active.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_uid_get_state.xml b/man/sd_uid_get_state.xml
index b158f3528c..18a3427026 100644
--- a/man/sd_uid_get_state.xml
+++ b/man/sd_uid_get_state.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/sd_watchdog_enabled.xml b/man/sd_watchdog_enabled.xml
index 991431f33b..41850106e6 100644
--- a/man/sd_watchdog_enabled.xml
+++ b/man/sd_watchdog_enabled.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/shutdown.xml b/man/shutdown.xml
index a8af387c67..9bf599b372 100644
--- a/man/shutdown.xml
+++ b/man/shutdown.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/standard-conf.xml b/man/standard-conf.xml
index 004f53f70c..123877a0a5 100644
--- a/man/standard-conf.xml
+++ b/man/standard-conf.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refsection PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refsection>
<refsection id='confd'>
@@ -39,14 +42,14 @@
<para>Default configuration is defined during compilation, so a
configuration file is only needed when it is necessary to deviate
from those defaults. By default the configuration file in
- <filename>/etc/systemd/</filename> contains commented out entries
+ <filename>&pkgsysconfdir;/</filename> contains commented out entries
showing the defaults as a guide to the administrator. This file
can be edited to create local overrides.
</para>
<para>When packages need to customize the configuration, they can
install configuration snippets in
- <filename>/usr/lib/systemd/*.conf.d/</filename>. Files in
+ <filename>&rootlibexecdir;/*.conf.d/</filename>. Files in
<filename>/etc/</filename> are reserved for the local
administrator, who may use this logic to override the
configuration files installed by vendor packages. The main
diff --git a/man/standard-options.xml b/man/standard-options.xml
index f214463392..5adda7c670 100644
--- a/man/standard-options.xml
+++ b/man/standard-options.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<variablelist>
<varlistentry id='help'>
diff --git a/man/sysctl.d.xml b/man/sysctl.d.xml
index 8a131791a5..841cedba3a 100644
--- a/man/sysctl.d.xml
+++ b/man/sysctl.d.xml
@@ -1,5 +1,8 @@
<?xml version="1.0"?> <!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -127,7 +130,7 @@
<para><filename>/etc/udev/rules.d/99-bridge.rules</filename>:
</para>
- <programlisting>ACTION=="add", SUBSYSTEM=="module", KERNEL=="bridge", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/net/bridge"
+ <programlisting>ACTION=="add", SUBSYSTEM=="module", KERNEL=="bridge", RUN+="&rootlibexecdir;/systemd-sysctl --prefix=/net/bridge"
</programlisting>
<para><filename>/etc/sysctl.d/bridge.conf</filename>:
diff --git a/man/systemctl.xml b/man/systemctl.xml
index 94a77bce0c..35f47de52c 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -410,8 +413,8 @@
processes. Not all unit types manage processes of these
types however. For example, for mount units, control processes
are defined (which are the invocations of
- <filename>/usr/bin/mount</filename> and
- <filename>/usr/bin/umount</filename>), but no main process
+ <filename>&MOUNT_PATH;</filename> and
+ <filename>&UMOUNT_PATH;</filename>), but no main process
is defined. If omitted, defaults to
<option>all</option>.</para>
</listitem>
diff --git a/man/systemd-activate.xml b/man/systemd-activate.xml
index 3b854fd8ec..3aecc40b60 100644
--- a/man/systemd-activate.xml
+++ b/man/systemd-activate.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<cmdsynopsis>
- <command>/usr/lib/systemd/systemd-activate</command>
+ <command>&rootlibexecdir;/systemd-activate</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
<arg choice="plain"><replaceable>daemon</replaceable></arg>
<arg choice="opt" rep="repeat">OPTIONS</arg>
@@ -149,13 +152,13 @@
<example>
<title>Run an echo server on port 2000</title>
- <programlisting>$ /usr/lib/systemd/systemd-activate -l 2000 -a cat</programlisting>
+ <programlisting>$ &rootlibexecdir;/systemd-activate -l 2000 -a cat</programlisting>
</example>
<example>
<title>Run a socket activated instance of <citerefentry><refentrytitle>systemd-journal-gatewayd</refentrytitle><manvolnum>8</manvolnum></citerefentry></title>
- <programlisting>$ /usr/lib/systemd/systemd-activate -l 19531 /usr/lib/systemd/systemd-journal-gatewayd</programlisting>
+ <programlisting>$ &rootlibexecdir;/systemd-activate -l 19531 &rootlibexecdir;/systemd-journal-gatewayd</programlisting>
</example>
</refsect1>
diff --git a/man/systemd-analyze.xml b/man/systemd-analyze.xml
index 198315052f..3509d155d3 100644
--- a/man/systemd-analyze.xml
+++ b/man/systemd-analyze.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-ask-password-console.service.xml b/man/systemd-ask-password-console.service.xml
index 479e5f2e5b..488a8793dd 100644
--- a/man/systemd-ask-password-console.service.xml
+++ b/man/systemd-ask-password-console.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-ask-password.xml b/man/systemd-ask-password.xml
index 877c71af53..2402103719 100644
--- a/man/systemd-ask-password.xml
+++ b/man/systemd-ask-password.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-backlight@.service.xml b/man/systemd-backlight@.service.xml
index a259f5d583..123576255d 100644
--- a/man/systemd-backlight@.service.xml
+++ b/man/systemd-backlight@.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-backlight@.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-backlight</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-backlight</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-binfmt.service.xml b/man/systemd-binfmt.service.xml
index 66d264389e..8659e63ebc 100644
--- a/man/systemd-binfmt.service.xml
+++ b/man/systemd-binfmt.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-binfmt.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-binfmt</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-binfmt</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-bootchart.xml b/man/systemd-bootchart.xml
index 538666760a..ea8a783601 100644
--- a/man/systemd-bootchart.xml
+++ b/man/systemd-bootchart.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -60,7 +63,7 @@
usage, as well as per-process information from a running system.
Collected results are output as an SVG graph. Normally,
systemd-bootchart is invoked by the kernel by passing
- <option>init=<filename>/usr/lib/systemd/systemd-bootchart</filename></option>
+ <option>init=<filename>&rootlibexecdir;/systemd-bootchart</filename></option>
on the kernel command line. systemd-bootchart will then fork the
real init off to resume normal system startup, while monitoring
and logging startup information in the background.
@@ -106,7 +109,7 @@
<listitem><para>The kernel can invoke
<command>systemd-bootchart</command> instead of the init
process. In turn, <command>systemd-bootchart</command> will
- invoke <command>/usr/lib/systemd/systemd</command>.
+ invoke <command>&rootlibexecdir;/systemd</command>.
</para></listitem>
</varlistentry>
@@ -128,7 +131,7 @@
<title>Options</title>
<para>These options can also be set in the
- <filename>/etc/systemd/bootchart.conf</filename> file. See
+ <filename>&pkgsysconfdir;/bootchart.conf</filename> file. See
<citerefentry project='man-pages'><refentrytitle>bootchart.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
</para>
@@ -201,7 +204,7 @@
<term><option>-i</option></term>
<term><option>--init <replaceable>path</replaceable></option></term>
<listitem><para>Use this init binary. Defaults to
- <command>/usr/lib/systemd/systemd</command>.
+ <command>&rootlibexecdir;/systemd</command>.
</para></listitem>
</varlistentry>
diff --git a/man/systemd-bus-proxyd.xml b/man/systemd-bus-proxyd.xml
index a1e8f4fb64..bbcf3d0981 100644
--- a/man/systemd-bus-proxyd.xml
+++ b/man/systemd-bus-proxyd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<cmdsynopsis>
- <command>/usr/lib/systemd/systemd-bus-proxyd</command>
+ <command>&rootlibexecdir;/systemd-bus-proxyd</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
<arg choice="opt"><replaceable>PLACEHOLDER</replaceable></arg>
</cmdsynopsis>
diff --git a/man/systemd-bus-proxyd@.service.xml b/man/systemd-bus-proxyd@.service.xml
index dc4f07ff1b..9dabc4dd5f 100644
--- a/man/systemd-bus-proxyd@.service.xml
+++ b/man/systemd-bus-proxyd@.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-cat.xml b/man/systemd-cat.xml
index 9b1a8809dc..d51acd7cf8 100644
--- a/man/systemd-cat.xml
+++ b/man/systemd-cat.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-cgls.xml b/man/systemd-cgls.xml
index e8f0368f48..d3b2404a76 100644
--- a/man/systemd-cgls.xml
+++ b/man/systemd-cgls.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-cgtop.xml b/man/systemd-cgtop.xml
index f1ff218c39..b0c88001d4 100644
--- a/man/systemd-cgtop.xml
+++ b/man/systemd-cgtop.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-coredump.xml b/man/systemd-coredump.xml
index 5da3857c08..d40562b5e1 100644
--- a/man/systemd-coredump.xml
+++ b/man/systemd-coredump.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,7 +52,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/systemd-coredump</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-coredump</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-cryptsetup-generator.xml b/man/systemd-cryptsetup-generator.xml
index b6270358ea..c4747f72d3 100644
--- a/man/systemd-cryptsetup-generator.xml
+++ b/man/systemd-cryptsetup-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -46,7 +49,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-cryptsetup-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-cryptsetup-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-cryptsetup@.service.xml b/man/systemd-cryptsetup@.service.xml
index ea524851eb..efc213a917 100644
--- a/man/systemd-cryptsetup@.service.xml
+++ b/man/systemd-cryptsetup@.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-cryptsetup@.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-cryptsetup</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-cryptsetup</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-debug-generator.xml b/man/systemd-debug-generator.xml
index 5c5e9fc4a1..075ec58e7e 100644
--- a/man/systemd-debug-generator.xml
+++ b/man/systemd-debug-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -47,7 +50,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-debug-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-debug-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-delta.xml b/man/systemd-delta.xml
index 6a6460ffaa..69ea0411e6 100644
--- a/man/systemd-delta.xml
+++ b/man/systemd-delta.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-detect-virt.xml b/man/systemd-detect-virt.xml
index 40755a24d0..16ac4f3091 100644
--- a/man/systemd-detect-virt.xml
+++ b/man/systemd-detect-virt.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-efi-boot-generator.xml b/man/systemd-efi-boot-generator.xml
index 23464bcf15..1f8194dd62 100644
--- a/man/systemd-efi-boot-generator.xml
+++ b/man/systemd-efi-boot-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-efi-boot-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-efi-boot-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-escape.xml b/man/systemd-escape.xml
index 0c3b230526..6680bcf963 100644
--- a/man/systemd-escape.xml
+++ b/man/systemd-escape.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-firstboot.xml b/man/systemd-firstboot.xml
index 67289daa26..6ec54bf1c3 100644
--- a/man/systemd-firstboot.xml
+++ b/man/systemd-firstboot.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-fsck@.service.xml b/man/systemd-fsck@.service.xml
index e4ffcba168..7286cd8803 100644
--- a/man/systemd-fsck@.service.xml
+++ b/man/systemd-fsck@.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-fsck@.service</filename></para>
<para><filename>systemd-fsck-root.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-fsck</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-fsck</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-fstab-generator.xml b/man/systemd-fstab-generator.xml
index c09ed4b4da..383aab70ff 100644
--- a/man/systemd-fstab-generator.xml
+++ b/man/systemd-fstab-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -46,7 +49,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-fstab-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-fstab-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-getty-generator.xml b/man/systemd-getty-generator.xml
index 338925964d..12127d9c2a 100644
--- a/man/systemd-getty-generator.xml
+++ b/man/systemd-getty-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -47,7 +50,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-getty-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-getty-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-gpt-auto-generator.xml b/man/systemd-gpt-auto-generator.xml
index bcc64ec9b5..16ff100d73 100644
--- a/man/systemd-gpt-auto-generator.xml
+++ b/man/systemd-gpt-auto-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-gpt-auto-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-gpt-auto-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-halt.service.xml b/man/systemd-halt.service.xml
index c94e2a1820..7e83a88fab 100644
--- a/man/systemd-halt.service.xml
+++ b/man/systemd-halt.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -56,7 +59,7 @@
<para><filename>systemd-poweroff.service</filename></para>
<para><filename>systemd-reboot.service</filename></para>
<para><filename>systemd-kexec.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-shutdown</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-shutdown</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -75,7 +78,7 @@
<para>When these services are run, they ensure that PID 1 is
replaced by the
- <filename>/usr/lib/systemd/systemd-shutdown</filename> tool which
+ <filename>&rootlibexecdir;/systemd-shutdown</filename> tool which
is then responsible for the actual shutdown. Before shutting down,
this binary will try to unmount all remaining file systems,
disable all remaining swap devices, detach all remaining storage
@@ -90,7 +93,7 @@
<para>Immediately before executing the actual system
halt/poweroff/reboot/kexec <filename>systemd-shutdown</filename>
will run all executables in
- <filename>/usr/lib/systemd/system-shutdown/</filename> and pass
+ <filename>&rootlibexecdir;/system-shutdown/</filename> and pass
one arguments to them: either <literal>halt</literal>,
<literal>poweroff</literal>, <literal>reboot</literal> or
<literal>kexec</literal>, depending on the chosen action. All
diff --git a/man/systemd-hibernate-resume-generator.xml b/man/systemd-hibernate-resume-generator.xml
index d811b9b551..52837bc3f0 100644
--- a/man/systemd-hibernate-resume-generator.xml
+++ b/man/systemd-hibernate-resume-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -46,7 +49,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-hibernate-resume-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-hibernate-resume-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-hibernate-resume@.service.xml b/man/systemd-hibernate-resume@.service.xml
index 7d00827447..bca08b5fd5 100644
--- a/man/systemd-hibernate-resume@.service.xml
+++ b/man/systemd-hibernate-resume@.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-hibernate-resume@.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-hibernate-resume</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-hibernate-resume</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-hostnamed.service.xml b/man/systemd-hostnamed.service.xml
index 6990d41b02..2db1d035b1 100644
--- a/man/systemd-hostnamed.service.xml
+++ b/man/systemd-hostnamed.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-hostnamed.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-hostnamed</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-hostnamed</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-hwdb.xml b/man/systemd-hwdb.xml
index f1a14025b0..9a58776af2 100644
--- a/man/systemd-hwdb.xml
+++ b/man/systemd-hwdb.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refentry id="systemd-hwdb" conditional="ENABLE_HWDB">
<refentryinfo>
@@ -57,7 +60,7 @@
<varlistentry>
<term><option>--usr</option></term>
<listitem>
- <para>Generate in /usr/lib/udev instead of /etc/udev.</para>
+ <para>Generate in &udevlibexecdir; instead of /etc/udev.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/man/systemd-inhibit.xml b/man/systemd-inhibit.xml
index 9d85908f97..6ff07210d3 100644
--- a/man/systemd-inhibit.xml
+++ b/man/systemd-inhibit.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-initctl.service.xml b/man/systemd-initctl.service.xml
index 5c7f9a4a16..95288d068f 100644
--- a/man/systemd-initctl.service.xml
+++ b/man/systemd-initctl.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -52,7 +55,7 @@
<refsynopsisdiv>
<para><filename>systemd-initctl.service</filename></para>
<para><filename>systemd-initctl.socket</filename></para>
- <para><filename>/usr/lib/systemd/systemd-initctl</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-initctl</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-journal-gatewayd.service.xml b/man/systemd-journal-gatewayd.service.xml
index 6df2248578..f7588794cd 100644
--- a/man/systemd-journal-gatewayd.service.xml
+++ b/man/systemd-journal-gatewayd.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -54,7 +57,7 @@
<para><filename>systemd-journal-gatewayd.service</filename></para>
<para><filename>systemd-journal-gatewayd.socket</filename></para>
<cmdsynopsis>
- <command>/usr/lib/systemd/systemd-journal-gatewayd</command>
+ <command>&rootlibexecdir;/systemd-journal-gatewayd</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
</cmdsynopsis>
</refsynopsisdiv>
diff --git a/man/systemd-journal-remote.xml b/man/systemd-journal-remote.xml
index ebaca2657f..596479edb1 100644
--- a/man/systemd-journal-remote.xml
+++ b/man/systemd-journal-remote.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-journal-upload.xml b/man/systemd-journal-upload.xml
index 597f2a2d3e..5398ff42e2 100644
--- a/man/systemd-journal-upload.xml
+++ b/man/systemd-journal-upload.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -243,8 +246,8 @@ openssl ca -batch -config ca.conf -notext -in $CLIENT.csr -out $CLIENT.pem
<varname>TrustedCertificateFile=</varname>,
<varname>ServerCertificateFile=</varname>,
<varname>ServerKeyFile=</varname>, in
- <filename>/etc/systemd/journal-remote.conf</filename> and
- <filename>/etc/systemd/journal-upload.conf</filename>
+ <filename>&pkgsysconfdir;/journal-remote.conf</filename> and
+ <filename>&pkgsysconfdir;/journal-upload.conf</filename>
respectively. The default locations can be queried by using
<command>systemd-journal-remote --help</command> and
<command>systemd-journal-upload --help</command>.</para>
diff --git a/man/systemd-journald.service.xml b/man/systemd-journald.service.xml
index 8280d6c874..ead1eee3fb 100644
--- a/man/systemd-journald.service.xml
+++ b/man/systemd-journald.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -54,7 +57,7 @@
<para><filename>systemd-journald.service</filename></para>
<para><filename>systemd-journald.socket</filename></para>
<para><filename>systemd-journald-dev-log.socket</filename></para>
- <para><filename>/usr/lib/systemd/systemd-journald</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-journald</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -199,7 +202,7 @@
<variablelist>
<varlistentry>
- <term><filename>/etc/systemd/journald.conf</filename></term>
+ <term><filename>&pkgsysconfdir;/journald.conf</filename></term>
<listitem><para>Configure
<command>systemd-journald</command>
diff --git a/man/systemd-localed.service.xml b/man/systemd-localed.service.xml
index 06aa78c0e4..1628054a3b 100644
--- a/man/systemd-localed.service.xml
+++ b/man/systemd-localed.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-localed.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-localed</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-localed</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-logind.service.xml b/man/systemd-logind.service.xml
index 5733e42cd1..1416d884ce 100644
--- a/man/systemd-logind.service.xml
+++ b/man/systemd-logind.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-logind.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-logind</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-logind</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-machine-id-commit.service.xml b/man/systemd-machine-id-commit.service.xml
index 7c8fc0874e..7bda76c4e5 100644
--- a/man/systemd-machine-id-commit.service.xml
+++ b/man/systemd-machine-id-commit.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -47,7 +50,7 @@
<refsynopsisdiv>
<para><filename>systemd-machine-id-commit.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-machine-id-commit</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-machine-id-commit</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-machine-id-commit.xml b/man/systemd-machine-id-commit.xml
index cfb1722063..0ebbfe7f07 100644
--- a/man/systemd-machine-id-commit.xml
+++ b/man/systemd-machine-id-commit.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-machine-id-setup.xml b/man/systemd-machine-id-setup.xml
index 182717f524..5a84a3b36c 100644
--- a/man/systemd-machine-id-setup.xml
+++ b/man/systemd-machine-id-setup.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-machined.service.xml b/man/systemd-machined.service.xml
index 999aeee1c6..a62e42c35b 100644
--- a/man/systemd-machined.service.xml
+++ b/man/systemd-machined.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-machined.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-machined</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-machined</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-modules-load.service.xml b/man/systemd-modules-load.service.xml
index dacd083bad..dc9e2a8554 100644
--- a/man/systemd-modules-load.service.xml
+++ b/man/systemd-modules-load.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-modules-load.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-modules-load</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-modules-load</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-networkd-wait-online.service.xml b/man/systemd-networkd-wait-online.service.xml
index f53b337daa..157671d6b2 100644
--- a/man/systemd-networkd-wait-online.service.xml
+++ b/man/systemd-networkd-wait-online.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-networkd-wait-online.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-networkd-wait-online</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-networkd-wait-online</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml
index 0bfe5519bc..1eef5b745b 100644
--- a/man/systemd-networkd.service.xml
+++ b/man/systemd-networkd.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-networkd.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-networkd</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-networkd</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -75,10 +78,10 @@
<refsect1><title>Configuration Files</title>
<para>The configuration files are read from the files located in the
- system network directory <filename>/usr/lib/systemd/network</filename>,
+ system network directory <filename>&rootlibexecdir;/network</filename>,
the volatile runtime network directory
<filename>/run/systemd/network</filename> and the local administration
- network directory <filename>/etc/systemd/network</filename>.</para>
+ network directory <filename>&pkgsysconfdir;/network</filename>.</para>
<para>Networks are configured in <filename>.network</filename>
files, see
diff --git a/man/systemd-notify.xml b/man/systemd-notify.xml
index 06d5ae5319..1158473117 100644
--- a/man/systemd-notify.xml
+++ b/man/systemd-notify.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml
index 3a2af2711c..218c7291e0 100644
--- a/man/systemd-nspawn.xml
+++ b/man/systemd-nspawn.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -321,6 +324,42 @@
</varlistentry>
<varlistentry>
+ <term><option>--private-users=</option></term>
+
+ <listitem><para>Enables user namespacing. If enabled the
+ container will run with its own private set of Unix user and
+ group ids (UIDs and GIDs). Takes none, one or two
+ colon-separated parameters: the first parameter specifies the
+ first host UID to assign to the container, the second
+ parameter specifies the number of host UIDs to assign to the
+ container. If the second parameter is omitted, 65536 UIDs are
+ assigned. If the first parameter is also omitted (and hence
+ no parameter passed at all), the first UID assigned to the
+ container is read from the owner of the root directory of the
+ container's directory tree. By default no user namespacing is
+ applied.</para>
+
+ <para>Note that user namespacing currently requires OS trees
+ that are prepared for the UID shift that is being applied:
+ UIDs and GIDs used for file ownership or in file ACL entries
+ must be shifted to the container UID base that is
+ used during container runtime.</para>
+
+ <para>It is recommended to assign as least 65536 UIDs to each
+ container, so that the usable UID range in the container
+ covers 16bit. For best security do not assign overlapping UID
+ ranges to multiple containers. It is hence a good idea to use
+ the upper 16bit of the host 32bit UIDs as container
+ identifier, while the lower 16bit encode the container UID
+ used.</para>
+
+ <para>When user namespaces are used the GID range assigned to
+ each container is always chosen identical to the UID
+ range.</para></listitem>
+ </varlistentry>
+
+
+ <varlistentry>
<term><option>--private-network</option></term>
<listitem><para>Disconnect networking of the container from
@@ -418,7 +457,7 @@
container port number in the range from 1 to 65535. The
protocol specifier and its separating colon may be omitted, in
which case <literal>tcp</literal> is assumed. The container
- port number and its colon may be ommitted, in which case the
+ port number and its colon may be omitted, in which case the
same port as the host port is implied. This option is only
supported if private networking is used, such as
<option>--network-veth</option> or
diff --git a/man/systemd-path.xml b/man/systemd-path.xml
index dfc75ee0ff..185a0cc901 100644
--- a/man/systemd-path.xml
+++ b/man/systemd-path.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-quotacheck.service.xml b/man/systemd-quotacheck.service.xml
index 9d4976274e..7673635a68 100644
--- a/man/systemd-quotacheck.service.xml
+++ b/man/systemd-quotacheck.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-quotacheck.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-quotacheck</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-quotacheck</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-random-seed.service.xml b/man/systemd-random-seed.service.xml
index 8c836688fe..580c3518c3 100644
--- a/man/systemd-random-seed.service.xml
+++ b/man/systemd-random-seed.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-random-seed.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-random-seed</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-random-seed</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-remount-fs.service.xml b/man/systemd-remount-fs.service.xml
index 9bc07fcdda..c8c3d16157 100644
--- a/man/systemd-remount-fs.service.xml
+++ b/man/systemd-remount-fs.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-remount-fs.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-remount-fs</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-remount-fs</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-resolved.service.xml b/man/systemd-resolved.service.xml
index 89ec5f8b19..892ebff7ad 100644
--- a/man/systemd-resolved.service.xml
+++ b/man/systemd-resolved.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-resolved.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-resolved</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-resolved</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-rfkill@.service.xml b/man/systemd-rfkill@.service.xml
index 709b09d818..befe001f29 100644
--- a/man/systemd-rfkill@.service.xml
+++ b/man/systemd-rfkill@.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-rfkill@.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-rfkill</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-rfkill</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-run.xml b/man/systemd-run.xml
index 71b365c8eb..ddd08e5b51 100644
--- a/man/systemd-run.xml
+++ b/man/systemd-run.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-sleep.conf.xml b/man/systemd-sleep.conf.xml
index 9a379ecb94..c5d26d0649 100644
--- a/man/systemd-sleep.conf.xml
+++ b/man/systemd-sleep.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/sleep.conf</filename></para>
- <para><filename>/etc/systemd/sleep.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/sleep.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/sleep.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/sleep.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/sleep.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/sleep.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -119,7 +122,7 @@
<para>The following options can be configured in the
<literal>[Sleep]</literal> section of
- <filename>/etc/systemd/sleep.conf</filename> or a
+ <filename>&pkgsysconfdir;/sleep.conf</filename> or a
<filename>sleep.conf.d</filename> file:</para>
<variablelist class='systemd-directives'>
diff --git a/man/systemd-socket-proxyd.xml b/man/systemd-socket-proxyd.xml
index ae4217b910..dc3baefe38 100644
--- a/man/systemd-socket-proxyd.xml
+++ b/man/systemd-socket-proxyd.xml
@@ -1,7 +1,10 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -113,7 +116,7 @@ Requires=nginx.service
After=nginx.service
[Service]
-ExecStart=/usr/lib/systemd/systemd-socket-proxyd /tmp/nginx.sock
+ExecStart=]]>&rootlibexecdir;<![CDATA[/systemd-socket-proxyd /tmp/nginx.sock
PrivateTmp=yes
PrivateNetwork=yes]]></programlisting>
</example>
@@ -156,7 +159,7 @@ After=nginx.service
JoinsNamespaceOf=nginx.service
[Service]
-ExecStart=/usr/lib/systemd/systemd-socket-proxyd 127.0.0.1:8080
+ExecStart=]]>&rootlibexecdir;<![CDATA[/systemd-socket-proxyd 127.0.0.1:8080
PrivateTmp=yes
PrivateNetwork=yes]]></programlisting>
</example>
diff --git a/man/systemd-suspend.service.xml b/man/systemd-suspend.service.xml
index a8beb86f4d..2722d1840a 100644
--- a/man/systemd-suspend.service.xml
+++ b/man/systemd-suspend.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -56,7 +59,7 @@
<para><filename>systemd-suspend.service</filename></para>
<para><filename>systemd-hibernate.service</filename></para>
<para><filename>systemd-hybrid-sleep.service</filename></para>
- <para><filename>/usr/lib/systemd/system-sleep</filename></para>
+ <para><filename>&rootlibexecdir;/system-sleep</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -75,7 +78,7 @@
<para>Immediately before entering system suspend and/or
hibernation <filename>systemd-suspend.service</filename> (and the
other mentioned units, respectively) will run all executables in
- <filename>/usr/lib/systemd/system-sleep/</filename> and pass two
+ <filename>&rootlibexecdir;/system-sleep/</filename> and pass two
arguments to them. The first argument will be
<literal>pre</literal>, the second either
<literal>suspend</literal>, <literal>hibernate</literal>, or
@@ -87,7 +90,7 @@
until all executables have finished.</para>
<para>Note that scripts or binaries dropped in
- <filename>/usr/lib/systemd/system-sleep/</filename> are intended
+ <filename>&rootlibexecdir;/system-sleep/</filename> are intended
for local use only and should be considered hacks. If applications
want to be notified of system suspend/hibernation and resume,
there are much nicer interfaces available.</para>
@@ -104,7 +107,7 @@
<literal>mem</literal> into <filename>/sys/power/state</filename>,
to trigger the actual system suspend. What exactly is written
where can be configured in the <literal>[Sleep]</literal> section
- of <filename>/etc/systemd/sleep.conf</filename> or a
+ of <filename>&pkgsysconfdir;/sleep.conf</filename> or a
<filename>sleep.conf.d</filename> file. See
<citerefentry><refentrytitle>systemd-sleep.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
</para>
diff --git a/man/systemd-sysctl.service.xml b/man/systemd-sysctl.service.xml
index d4c1a7ebe3..f7da4cd71a 100644
--- a/man/systemd-sysctl.service.xml
+++ b/man/systemd-sysctl.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-sysctl.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-sysctl</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-sysctl</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-system-update-generator.xml b/man/systemd-system-update-generator.xml
index e7fc95c742..5c593b3906 100644
--- a/man/systemd-system-update-generator.xml
+++ b/man/systemd-system-update-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -46,7 +49,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-system-update-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-system-update-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-system.conf.xml b/man/systemd-system.conf.xml
index c06accd791..5aa5da4706 100644
--- a/man/systemd-system.conf.xml
+++ b/man/systemd-system.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -51,14 +54,14 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/system.conf</filename></para>
- <para><filename>/etc/systemd/system.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/system.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/system.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/system.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/system.conf.d/*.conf</filename></para>
- <para><filename>/etc/systemd/user.conf</filename></para>
- <para><filename>/etc/systemd/user.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/system.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/user.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/user.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/user.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/user.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/user.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-sysusers.xml b/man/systemd-sysusers.xml
index a0c0f996ac..cbe4f2f9cb 100644
--- a/man/systemd-sysusers.xml
+++ b/man/systemd-sysusers.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-sysv-generator.xml b/man/systemd-sysv-generator.xml
index f2d56cbcd2..e7592d6692 100644
--- a/man/systemd-sysv-generator.xml
+++ b/man/systemd-sysv-generator.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -46,7 +49,7 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/usr/lib/systemd/system-generators/systemd-sysv-generator</filename></para>
+ <para><filename>&rootlibexecdir;/system-generators/systemd-sysv-generator</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-timedated.service.xml b/man/systemd-timedated.service.xml
index e44163aefb..3598490d14 100644
--- a/man/systemd-timedated.service.xml
+++ b/man/systemd-timedated.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-timedated.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-timedated</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-timedated</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-timesyncd.service.xml b/man/systemd-timesyncd.service.xml
index ac1af2d136..a1b364534b 100644
--- a/man/systemd-timesyncd.service.xml
+++ b/man/systemd-timesyncd.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -50,7 +53,7 @@
<refsynopsisdiv>
<para><filename>systemd-timesyncd.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-timesyncd</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-timesyncd</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-tmpfiles.xml b/man/systemd-tmpfiles.xml
index ceec06f840..f12f997f93 100644
--- a/man/systemd-tmpfiles.xml
+++ b/man/systemd-tmpfiles.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-tty-ask-password-agent.xml b/man/systemd-tty-ask-password-agent.xml
index 2876fab644..dac3a3c02c 100644
--- a/man/systemd-tty-ask-password-agent.xml
+++ b/man/systemd-tty-ask-password-agent.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd-udevd.service.xml b/man/systemd-udevd.service.xml
index b18b22871f..c0d323033c 100644
--- a/man/systemd-udevd.service.xml
+++ b/man/systemd-udevd.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refentry id="systemd-udevd.service"
xmlns:xi="http://www.w3.org/2001/XInclude">
@@ -37,7 +40,7 @@
<para><filename>systemd-udevd-kernel.socket</filename></para>
<cmdsynopsis>
- <command>/usr/lib/systemd/systemd-udevd</command>
+ <command>&rootlibexecdir;/systemd-udevd</command>
<arg><option>--daemon</option></arg>
<arg><option>--debug</option></arg>
<arg><option>--children-max=</option></arg>
diff --git a/man/systemd-update-done.service.xml b/man/systemd-update-done.service.xml
index d65f175418..3f121582e9 100644
--- a/man/systemd-update-done.service.xml
+++ b/man/systemd-update-done.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-update-done.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-update-done</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-update-done</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-update-utmp.service.xml b/man/systemd-update-utmp.service.xml
index c8a9cb7c90..285691849f 100644
--- a/man/systemd-update-utmp.service.xml
+++ b/man/systemd-update-utmp.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -51,7 +54,7 @@
<refsynopsisdiv>
<para><filename>systemd-update-utmp.service</filename></para>
<para><filename>systemd-update-utmp-runlevel.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-update-utmp</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-update-utmp</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-user-sessions.service.xml b/man/systemd-user-sessions.service.xml
index e75ef11c4e..620648cfe8 100644
--- a/man/systemd-user-sessions.service.xml
+++ b/man/systemd-user-sessions.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-user-sessions.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-user-sessions</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-user-sessions</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd-vconsole-setup.service.xml b/man/systemd-vconsole-setup.service.xml
index 7c6ed08997..6c6d8e2af0 100644
--- a/man/systemd-vconsole-setup.service.xml
+++ b/man/systemd-vconsole-setup.service.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -48,7 +51,7 @@
<refsynopsisdiv>
<para><filename>systemd-vconsole-setup.service</filename></para>
- <para><filename>/usr/lib/systemd/systemd-vconsole-setup</filename></para>
+ <para><filename>&rootlibexecdir;/systemd-vconsole-setup</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/systemd.automount.xml b/man/systemd.automount.xml
index 9561590c5c..18c10d00f5 100644
--- a/man/systemd.automount.xml
+++ b/man/systemd.automount.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.device.xml b/man/systemd.device.xml
index ac6deafb18..96a20d14d1 100644
--- a/man/systemd.device.xml
+++ b/man/systemd.device.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 64877720bc..ea53722f0f 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -1,5 +1,8 @@
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.generator.xml b/man/systemd.generator.xml
index 2285e91812..5ce0592a6e 100644
--- a/man/systemd.generator.xml
+++ b/man/systemd.generator.xml
@@ -59,14 +59,14 @@
<para>
<literallayout><filename>/run/systemd/system-generators/*</filename>
-<filename>/etc/systemd/system-generators/*</filename>
+<filename>&pkgsysconfdir;/system-generators/*</filename>
<filename>/usr/local/lib/systemd/system-generators/*</filename>
<filename>&systemgeneratordir;/*</filename></literallayout>
</para>
<para>
<literallayout><filename>/run/systemd/user-generators/*</filename>
-<filename>/etc/systemd/user-generators/*</filename>
+<filename>&pkgsysconfdir;/user-generators/*</filename>
<filename>/usr/local/lib/systemd/user-generators/*</filename>
<filename>&usergeneratordir;/*</filename></literallayout>
</para>
diff --git a/man/systemd.journal-fields.xml b/man/systemd.journal-fields.xml
index a101006a7e..2cb010c0be 100644
--- a/man/systemd.journal-fields.xml
+++ b/man/systemd.journal-fields.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.kill.xml b/man/systemd.kill.xml
index e57f0e7242..ef828e081c 100644
--- a/man/systemd.kill.xml
+++ b/man/systemd.kill.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.link.xml b/man/systemd.link.xml
index 3fac760b01..5db06842bd 100644
--- a/man/systemd.link.xml
+++ b/man/systemd.link.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -56,21 +59,21 @@
<command>net_setup_link</command> udev builtin.</para>
<para>The link files are read from the files located in the system
- network directory <filename>/usr/lib/systemd/network</filename>,
+ network directory <filename>&rootlibexecdir;/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
+ <filename>&pkgsysconfdir;/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
+ name in <filename>&rootprefix;/lib</filename>. This can be used to
override a system-supplied link file with a local file if needed;
a symlink in <filename>/etc</filename> with the same name as a
- link file in <filename>/usr/lib</filename>, pointing to
+ link file in <filename>&rootprefix;/lib</filename>, pointing to
<filename>/dev/null</filename>, disables the link file
entirely.</para>
@@ -382,7 +385,7 @@
<refsect1>
<title>Example</title>
<example>
- <title>/etc/systemd/network/wireless.link</title>
+ <title>&pkgsysconfdir;/network/wireless.link</title>
<programlisting>[Match]
MACAddress=12:34:56:78:9a:bc
diff --git a/man/systemd.mount.xml b/man/systemd.mount.xml
index ffffc56936..f22c86adc1 100644
--- a/man/systemd.mount.xml
+++ b/man/systemd.mount.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml
index 01c31c5ef5..786c7d478a 100644
--- a/man/systemd.netdev.xml
+++ b/man/systemd.netdev.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -68,20 +71,20 @@
<para>The <filename>.netdev</filename> files are read from the
files located in the system network directory
- <filename>/usr/lib/systemd/network</filename>, the volatile
+ <filename>&rootlibexecdir;/network</filename>, the volatile
runtime network directory
<filename>/run/systemd/network</filename> and the local
administration network directory
- <filename>/etc/systemd/network</filename>. All configuration files
+ <filename>&pkgsysconfdir;/network</filename>. All configuration 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
+ name in <filename>&rootprefix;/lib</filename>. This can be used to
override a system-supplied configuration file with a local file if
needed; a symlink in <filename>/etc</filename> with the same name
- as a configuration file in <filename>/usr/lib</filename>, pointing
+ as a configuration file in <filename>&rootprefix;/lib</filename>, pointing
to <filename>/dev/null</filename>, disables the configuration file
entirely.</para>
@@ -842,7 +845,7 @@
<refsect1>
<title>Example</title>
<example>
- <title>/etc/systemd/network/bridge.netdev</title>
+ <title>&pkgsysconfdir;/network/bridge.netdev</title>
<programlisting>[NetDev]
Name=bridge0
@@ -850,7 +853,7 @@ Kind=bridge</programlisting>
</example>
<example>
- <title>/etc/systemd/network/vlan1.netdev</title>
+ <title>&pkgsysconfdir;/network/vlan1.netdev</title>
<programlisting>[Match]
Virtualization=no
@@ -863,7 +866,7 @@ Kind=vlan
Id=1</programlisting>
</example>
<example>
- <title>/etc/systemd/network/ipip.netdev</title>
+ <title>&pkgsysconfdir;/network/ipip.netdev</title>
<programlisting>[NetDev]
Name=ipip-tun
Kind=ipip
@@ -875,7 +878,7 @@ Remote=192.169.224.239
TTL=64</programlisting>
</example>
<example>
- <title>/etc/systemd/network/tap.netdev</title>
+ <title>&pkgsysconfdir;/network/tap.netdev</title>
<programlisting>[NetDev]
Name=tap-test
Kind=tap
@@ -885,7 +888,7 @@ MultiQueue=true
PacketInfo=true</programlisting> </example>
<example>
- <title>/etc/systemd/network/sit.netdev</title>
+ <title>&pkgsysconfdir;/network/sit.netdev</title>
<programlisting>[NetDev]
Name=sit-tun
Kind=sit
@@ -897,7 +900,7 @@ Remote=10.65.223.239</programlisting>
</example>
<example>
- <title>/etc/systemd/network/gre.netdev</title>
+ <title>&pkgsysconfdir;/network/gre.netdev</title>
<programlisting>[NetDev]
Name=gre-tun
Kind=gre
@@ -909,7 +912,7 @@ Remote=10.65.223.239</programlisting>
</example>
<example>
- <title>/etc/systemd/network/vti.netdev</title>
+ <title>&pkgsysconfdir;/network/vti.netdev</title>
<programlisting>[NetDev]
Name=vti-tun
@@ -922,7 +925,7 @@ Remote=10.65.223.239</programlisting>
</example>
<example>
- <title>/etc/systemd/network/veth.netdev</title>
+ <title>&pkgsysconfdir;/network/veth.netdev</title>
<programlisting>[NetDev]
Name=veth-test
Kind=veth
@@ -932,7 +935,7 @@ Name=veth-peer</programlisting>
</example>
<example>
- <title>/etc/systemd/network/dummy.netdev</title>
+ <title>&pkgsysconfdir;/network/dummy.netdev</title>
<programlisting>[NetDev]
Name=dummy-test
Kind=dummy
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 5504b4646c..bd061c270a 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -64,20 +67,20 @@
<para>The <filename>.network</filename> files are read from the
files located in the system network directory
- <filename>/usr/lib/systemd/network</filename>, the volatile
+ <filename>&rootlibexecdir;/network</filename>, the volatile
runtime network directory
<filename>/run/systemd/network</filename> and the local
administration network directory
- <filename>/etc/systemd/network</filename>. All configuration files
+ <filename>&pkgsysconfdir;/network</filename>. All configuration 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
+ name in <filename>&rootprefix;/lib</filename>. This can be used to
override a system-supplied configuration file with a local file if
needed; a symlink in <filename>/etc</filename> with the same name
- as a configuration file in <filename>/usr/lib</filename>, pointing
+ as a configuration file in <filename>&rootprefix;/lib</filename>, pointing
to <filename>/dev/null</filename>, disables the configuration file
entirely.</para>
@@ -228,6 +231,10 @@
<para>Enables DHCPv4 and/or DHCPv6 support. Accepts
<literal>yes</literal>, <literal>no</literal>,
<literal>ipv4</literal>, or <literal>ipv6</literal>.</para>
+
+ <para>Please note that by default the domain name
+ specified through DHCP is not used for name resolution.
+ See option <option>UseDomains=</option> below.</para>
</listitem>
</varlistentry>
<varlistentry>
@@ -529,6 +536,9 @@
<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>This corresponds to the <option>nameserver</option>
+ option in <citerefentry project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
</listitem>
</varlistentry>
<varlistentry>
@@ -567,7 +577,13 @@
<listitem>
<para>When true (not the default), the domain name
received from the DHCP server will be used for DNS
- resolution over this link.</para>
+ resolution over this link. When a name cannot be resolved
+ as specified, the domain name will be used a suffix and
+ name resolution of that will be attempted.</para>
+
+ <para>This corresponds to the <option>domain</option>
+ option in <citerefentry project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+ and should not be enabled on untrusted networks.</para>
</listitem>
</varlistentry>
<varlistentry>
@@ -670,7 +686,7 @@
<refsect1>
<title>Example</title>
<example>
- <title>/etc/systemd/network/50-static.network</title>
+ <title>&pkgsysconfdir;/network/50-static.network</title>
<programlisting>[Match]
Name=enp2s0
@@ -681,7 +697,7 @@ Gateway=192.168.0.1</programlisting>
</example>
<example>
- <title>/etc/systemd/network/80-dhcp.network</title>
+ <title>&pkgsysconfdir;/network/80-dhcp.network</title>
<programlisting>[Match]
Name=en*
@@ -691,7 +707,7 @@ DHCP=yes</programlisting>
</example>
<example>
- <title>/etc/systemd/network/bridge-static.network</title>
+ <title>&pkgsysconfdir;/network/bridge-static.network</title>
<programlisting>[Match]
Name=bridge0
@@ -703,7 +719,7 @@ DNS=192.168.0.1</programlisting>
</example>
<example>
- <title>/etc/systemd/network/bridge-slave-interface.network</title>
+ <title>&pkgsysconfdir;/network/bridge-slave-interface.network</title>
<programlisting>[Match]
Name=enp2s0
@@ -712,7 +728,7 @@ Name=enp2s0
Bridge=bridge0</programlisting>
</example>
<example>
- <title>/etc/systemd/network/ipip.network</title>
+ <title>&pkgsysconfdir;/network/ipip.network</title>
<programlisting>[Match]
Name=em1
@@ -722,7 +738,7 @@ Tunnel=ipip-tun</programlisting>
</example>
<example>
- <title>/etc/systemd/network/sit.network</title>
+ <title>&pkgsysconfdir;/network/sit.network</title>
<programlisting>[Match]
Name=em1
@@ -732,7 +748,7 @@ Tunnel=sit-tun</programlisting>
</example>
<example>
- <title>/etc/systemd/network/gre.network</title>
+ <title>&pkgsysconfdir;/network/gre.network</title>
<programlisting>[Match]
Name=em1
@@ -742,7 +758,7 @@ Tunnel=gre-tun</programlisting>
</example>
<example>
- <title>/etc/systemd/network/vti.network</title>
+ <title>&pkgsysconfdir;/network/vti.network</title>
<programlisting>[Match]
Name=em1
diff --git a/man/systemd.path.xml b/man/systemd.path.xml
index d02bc92ae6..03b626b560 100644
--- a/man/systemd.path.xml
+++ b/man/systemd.path.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.preset.xml b/man/systemd.preset.xml
index 2f9add8d6c..4667f9d616 100644
--- a/man/systemd.preset.xml
+++ b/man/systemd.preset.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -46,12 +49,12 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/system-preset/*.preset</filename></para>
+ <para><filename>&pkgsysconfdir;/system-preset/*.preset</filename></para>
<para><filename>/run/systemd/system-preset/*.preset</filename></para>
- <para><filename>/usr/lib/systemd/system-preset/*.preset</filename></para>
- <para><filename>/etc/systemd/user-preset/*.preset</filename></para>
+ <para><filename>&rootlibexecdir;/system-preset/*.preset</filename></para>
+ <para><filename>&pkgsysconfdir;/user-preset/*.preset</filename></para>
<para><filename>/run/systemd/user-preset/*.preset</filename></para>
- <para><filename>/usr/lib/systemd/user-preset/*.preset</filename></para>
+ <para><filename>&rootlibexecdir;/user-preset/*.preset</filename></para>
</refsynopsisdiv>
<refsect1>
@@ -125,7 +128,7 @@
<para>If the administrator wants to disable a preset file supplied
by the vendor, the recommended way is to place a symlink to
<filename>/dev/null</filename> in
- <filename>/etc/systemd/system-preset/</filename> bearing the same
+ <filename>&pkgsysconfdir;/system-preset/</filename> bearing the same
filename.</para>
</refsect1>
@@ -133,7 +136,7 @@
<title>Example</title>
<example>
- <title>Default off example <filename>/usr/lib/systemd/system-preset/99-default.preset</filename>:</title>
+ <title>Default off example <filename>&rootlibexecdir;/system-preset/99-default.preset</filename>:</title>
<programlisting>disable *</programlisting>
</example>
@@ -144,7 +147,7 @@
suchlike.</para>
<example>
- <title>A GNOME spin example <filename>/usr/lib/systemd/system-preset/50-gnome.preset</filename>:</title>
+ <title>A GNOME spin example <filename>&rootlibexecdir;/system-preset/50-gnome.preset</filename>:</title>
<programlisting>enable gdm.service
enable colord.service
@@ -162,7 +165,7 @@ enable avahi-daemon.*</programlisting>
example like the one from the first example above.</para>
<example>
- <title>Administrator policy <filename>/etc/systemd/system-preset/00-lennart.preset</filename>:</title>
+ <title>Administrator policy <filename>&pkgsysconfdir;/system-preset/00-lennart.preset</filename>:</title>
<programlisting>enable httpd.service
enable sshd.service
diff --git a/man/systemd.resource-control.xml b/man/systemd.resource-control.xml
index 8f4e7a3f16..82e21c6906 100644
--- a/man/systemd.resource-control.xml
+++ b/man/systemd.resource-control.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.scope.xml b/man/systemd.scope.xml
index fd65a851e2..f137cb7391 100644
--- a/man/systemd.scope.xml
+++ b/man/systemd.scope.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index 7ff2adf4e9..0fe694ab7e 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.slice.xml b/man/systemd.slice.xml
index f0bac41763..c443528ab1 100644
--- a/man/systemd.slice.xml
+++ b/man/systemd.slice.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -90,7 +93,7 @@
slice specific configuration options are configured in
the [Slice] section. Currently, only generic resource control settings
as described in
- <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>7</manvolnum></citerefentry> are allowed.
+ <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> are allowed.
</para>
<para>Unless <varname>DefaultDependencies=false</varname>
diff --git a/man/systemd.snapshot.xml b/man/systemd.snapshot.xml
index 96069c324a..4c1f40e814 100644
--- a/man/systemd.snapshot.xml
+++ b/man/systemd.snapshot.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.socket.xml b/man/systemd.socket.xml
index 1e9778bc2a..1d0fa1bd16 100644
--- a/man/systemd.socket.xml
+++ b/man/systemd.socket.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.special.xml b/man/systemd.special.xml
index cf76aaf607..8db3050b58 100644
--- a/man/systemd.special.xml
+++ b/man/systemd.special.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.swap.xml b/man/systemd.swap.xml
index 5016f453d5..d3ddc1ab4d 100644
--- a/man/systemd.swap.xml
+++ b/man/systemd.swap.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -177,7 +180,8 @@
<listitem><para>Swap priority to use when activating the swap
device or file. This takes an integer. This setting is
- optional.</para></listitem>
+ optional and ignored when priotiry is set by <option>pri=</option> in the
+ <varname>Options=</varname> option.</para></listitem>
</varlistentry>
<varlistentry>
diff --git a/man/systemd.target.xml b/man/systemd.target.xml
index e790e9b77a..884177e9fa 100644
--- a/man/systemd.target.xml
+++ b/man/systemd.target.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.time.xml b/man/systemd.time.xml
index da0729725d..570a20e5cf 100644
--- a/man/systemd.time.xml
+++ b/man/systemd.time.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.timer.xml b/man/systemd.timer.xml
index 20890f2270..5f7e80425e 100644
--- a/man/systemd.timer.xml
+++ b/man/systemd.timer.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 0aa1eeac77..8286cf3f78 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -64,20 +64,20 @@
<filename><replaceable>slice</replaceable>.slice</filename>,
<filename><replaceable>scope</replaceable>.scope</filename></para>
- <para><literallayout><filename>/etc/systemd/system/*</filename>
+ <para><literallayout><filename>&pkgsysconfdir;/system/*</filename>
<filename>/run/systemd/system/*</filename>
-<filename>/usr/lib/systemd/system/*</filename>
+<filename>&rootlibexecdir;/system/*</filename>
<filename>...</filename>
</literallayout></para>
<para><literallayout><filename>$XDG_CONFIG_HOME/systemd/user/*</filename>
<filename>$HOME/.config/systemd/user/*</filename>
-<filename>/etc/systemd/user/*</filename>
+<filename>&pkgsysconfdir;/user/*</filename>
<filename>$XDG_RUNTIME_DIR/systemd/user/*</filename>
<filename>/run/systemd/user/*</filename>
<filename>$XDG_DATA_HOME/systemd/user/*</filename>
<filename>$HOME/.local/share/systemd/user/*</filename>
-<filename>/usr/lib/systemd/user/*</filename>
+<filename>&rootlibexecdir;/user/*</filename>
<filename>...</filename>
</literallayout></para>
</refsynopsisdiv>
@@ -287,7 +287,7 @@
</thead>
<tbody>
<row>
- <entry><filename>/etc/systemd/system</filename></entry>
+ <entry><filename>&pkgsysconfdir;/system</filename></entry>
<entry>Local configuration</entry>
</row>
<row>
@@ -295,7 +295,7 @@
<entry>Runtime units</entry>
</row>
<row>
- <entry><filename>/usr/lib/systemd/system</filename></entry>
+ <entry><filename>&rootlibexecdir;/system</filename></entry>
<entry>Units of installed packages</entry>
</row>
</tbody>
@@ -326,7 +326,7 @@
<entry>User configuration (only used when $XDG_CONFIG_HOME is not set)</entry>
</row>
<row>
- <entry><filename>/etc/systemd/user</filename></entry>
+ <entry><filename>&pkgsysconfdir;/user</filename></entry>
<entry>Local configuration</entry>
</row>
<row>
@@ -346,7 +346,7 @@
<entry>Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is not set)</entry>
</row>
<row>
- <entry><filename>/usr/lib/systemd/user</filename></entry>
+ <entry><filename>&rootlibexecdir;/user</filename></entry>
<entry>Units of packages that have been installed system-wide</entry>
</row>
</tbody>
@@ -1296,7 +1296,7 @@ ExecStart=/usr/sbin/foo-daemon
<para>After running <command>systemctl enable</command>, a
symlink
- <filename>/etc/systemd/system/multi-user.target.wants/foo.service</filename>
+ <filename>&pkgsysconfdir;/system/multi-user.target.wants/foo.service</filename>
linking to the actual unit will be created. It tells systemd to
pull in the unit when starting
<filename>multi-user.target</filename>. The inverse
@@ -1309,11 +1309,11 @@ ExecStart=/usr/sbin/foo-daemon
<para>There are two methods of overriding vendor settings in
unit files: copying the unit file from
- <filename>/usr/lib/systemd/system</filename> to
- <filename>/etc/systemd/system</filename> and modifying the
+ <filename>&rootlibexecdir;/system</filename> to
+ <filename>&pkgsysconfdir;/system</filename> and modifying the
chosen settings. Alternatively, one can create a directory named
<filename><replaceable>unit</replaceable>.d/</filename> within
- <filename>/etc/systemd/system</filename> and place a drop-in
+ <filename>&pkgsysconfdir;/system</filename> and place a drop-in
file <filename><replaceable>name</replaceable>.conf</filename>
there that only changes the specific settings one is interested
in. Note that multiple such drop-in files are read if
@@ -1343,7 +1343,7 @@ ExecStart=/usr/sbin/foo-daemon
load paths for further details.</para>
<para>Suppose there is a vendor-supplied unit
- <filename>/usr/lib/systemd/system/httpd.service</filename> with
+ <filename>&rootlibexecdir;/system/httpd.service</filename> with
the following contents:</para>
<programlisting>[Unit]
@@ -1375,7 +1375,7 @@ WantedBy=multi-user.target</programlisting>
the niceness of the service to its default value of 0.</para>
<para>The first possibility is to copy the unit file to
- <filename>/etc/systemd/system/httpd.service</filename> and
+ <filename>&pkgsysconfdir;/system/httpd.service</filename> and
change the chosen settings:</para>
<programlisting>[Unit]
@@ -1395,7 +1395,7 @@ WantedBy=multi-user.target</programlisting>
<para>Alternatively, the administrator could create a drop-in
file
- <filename>/etc/systemd/system/httpd.service.d/local.conf</filename>
+ <filename>&pkgsysconfdir;/system/httpd.service.d/local.conf</filename>
with the following contents:</para>
<programlisting>[Unit]
diff --git a/man/systemd.xml b/man/systemd.xml
index 4556d56969..5fa65a3631 100644
--- a/man/systemd.xml
+++ b/man/systemd.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -438,7 +441,7 @@
by <command>pkg-config systemd
--variable=systemdsystemunitdir</command>. Other directories
checked are <filename>/usr/local/lib/systemd/system</filename>
- and <filename>/usr/lib/systemd/system</filename>. User
+ and <filename>&rootlibexecdir;/system</filename>. User
configuration always takes precedence. <command>pkg-config
systemd --variable=systemdsystemconfdir</command> returns the
path of the system configuration directory. Packages should
diff --git a/man/sysusers.d.xml b/man/sysusers.d.xml
index 99aa07a1cc..3085f3dd01 100644
--- a/man/sysusers.d.xml
+++ b/man/sysusers.d.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/telinit.xml b/man/telinit.xml
index 02d31fbd46..ec7e8eace4 100644
--- a/man/telinit.xml
+++ b/man/telinit.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/timedatectl.xml b/man/timedatectl.xml
index 2d42b41d5e..d7bd052eff 100644
--- a/man/timedatectl.xml
+++ b/man/timedatectl.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -210,13 +213,13 @@ Password: ********
<programlisting>$ systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
- Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled)
+ Loaded: loaded (&rootlibexecdir;/system/systemd-timesyncd.service; enabled)
Active: active (running) since Mo 2015-03-30 14:20:38 CEST; 5s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 595 (systemd-timesyn)
Status: "Using Time Server 216.239.38.15:123 (time4.google.com)."
CGroup: /system.slice/systemd-timesyncd.service
- └─595 /usr/lib/systemd/systemd-timesyncd
+ └─595 &rootlibexecdir;/systemd-timesyncd
...</programlisting>
</para>
</refsect1>
diff --git a/man/timesyncd.conf.xml b/man/timesyncd.conf.xml
index 89a651c662..c297d3254c 100644
--- a/man/timesyncd.conf.xml
+++ b/man/timesyncd.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
@@ -49,10 +52,10 @@
</refnamediv>
<refsynopsisdiv>
- <para><filename>/etc/systemd/timesyncd.conf</filename></para>
- <para><filename>/etc/systemd/timesyncd.conf.d/*.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/timesyncd.conf</filename></para>
+ <para><filename>&pkgsysconfdir;/timesyncd.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/timesyncd.conf.d/*.conf</filename></para>
- <para><filename>/usr/lib/systemd/timesyncd.conf.d/*.conf</filename></para>
+ <para><filename>&rootlibexecdir;/timesyncd.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
diff --git a/man/tmpfiles.d.xml b/man/tmpfiles.d.xml
index 8d3ed37ae3..c37de65229 100644
--- a/man/tmpfiles.d.xml
+++ b/man/tmpfiles.d.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!--*-nxml-*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/udev.conf.xml b/man/udev.conf.xml
index e104e53f5d..a10cc3cebe 100644
--- a/man/udev.conf.xml
+++ b/man/udev.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/man/udev.xml b/man/udev.xml
index d1a4f614cf..d5d8a17cdb 100644
--- a/man/udev.xml
+++ b/man/udev.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refentry id="udev">
<refentryinfo>
@@ -55,17 +58,17 @@
<refsect1><title>Rules Files</title>
<para>The udev rules are read from the files located in the
- system rules directory <filename>/usr/lib/udev/rules.d</filename>,
+ system rules directory <filename>&udevlibexecdir;/rules.d</filename>,
the volatile runtime directory <filename>/run/udev/rules.d</filename>
and the local administration directory <filename>/etc/udev/rules.d</filename>.
All rules 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
+ over files with the same name in <filename>&rootprefix;/lib</filename>. This can be
used to override a system-supplied rules file with a local file if needed;
a symlink in <filename>/etc</filename> with the same name as a rules file in
- <filename>/usr/lib</filename>, pointing to <filename>/dev/null</filename>,
+ <filename>&rootprefix;/lib</filename>, pointing to <filename>/dev/null</filename>,
disables the rules file entirely. Rule files must have the extension
<filename>.rules</filename>; other extensions are ignored.</para>
@@ -421,7 +424,7 @@
<listitem>
<para>Execute an external program specified as the assigned
value. If no absolute path is given, the program is expected
- to live in <filename>/usr/lib/udev</filename>; otherwise, the
+ to live in <filename>&udevlibexecdir;</filename>; otherwise, the
absolute path must be specified.</para>
<para>This is the default if no <replaceable>type</replaceable>
is specified.</para>
diff --git a/man/udevadm.xml b/man/udevadm.xml
index 8ef9e23aa2..c7ef7279c9 100644
--- a/man/udevadm.xml
+++ b/man/udevadm.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<refentry id="udevadm">
<refentryinfo>
diff --git a/man/user-system-options.xml b/man/user-system-options.xml
index 8616c54249..1e415ddd4c 100644
--- a/man/user-system-options.xml
+++ b/man/user-system-options.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<variablelist>
<varlistentry id='user'>
diff --git a/man/vconsole.conf.xml b/man/vconsole.conf.xml
index 27196d44e9..1c3bdd2e54 100644
--- a/man/vconsole.conf.xml
+++ b/man/vconsole.conf.xml
@@ -1,6 +1,9 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
<!--
This file is part of systemd.
diff --git a/po/es.po b/po/es.po
index 675f9721bf..811e36e81f 100644
--- a/po/es.po
+++ b/po/es.po
@@ -528,5 +528,5 @@ msgstr ""
#, c-format
msgid "Checking in progress on %d disk (%3.1f%% complete)"
msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
-msgstr[0] "Comprobando progreso en %d disco (%3.1f%% completado)"
-msgstr[1] "Comprobando progreso en %d discos (%3.1f%% completado)"
+msgstr[0] "Comprobando progreso en %d disco (%3.1f %% completado)"
+msgstr[1] "Comprobando progreso en %d discos (%3.1f %% completado)"
diff --git a/rules/60-block.rules b/rules/60-block.rules
index de41499cb7..a69d648023 100644
--- a/rules/60-block.rules
+++ b/rules/60-block.rules
@@ -8,4 +8,4 @@ ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_
ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
# watch metadata changes, caused by tools closing the device node which was opened for writing
-ACTION=="add", SUBSYSTEM=="block", KERNEL!="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
+ACTION!="remove", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
diff --git a/rules/60-persistent-storage.rules b/rules/60-persistent-storage.rules
index 3f803ceb9a..2aa15f3411 100644
--- a/rules/60-persistent-storage.rules
+++ b/rules/60-persistent-storage.rules
@@ -6,7 +6,7 @@
ACTION=="remove", GOTO="persistent_storage_end"
SUBSYSTEM!="block", GOTO="persistent_storage_end"
-KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*", GOTO="persistent_storage_end"
+KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|bcache*", GOTO="persistent_storage_end"
# ignore partitions that span the entire disk
TEST=="whole_disk", GOTO="persistent_storage_end"
diff --git a/shell-completion/zsh/_bootctl b/shell-completion/zsh/_bootctl
index 7d2453cc2c..0e1b0a5562 100644
--- a/shell-completion/zsh/_bootctl
+++ b/shell-completion/zsh/_bootctl
@@ -4,7 +4,10 @@
{
local -a _bootctl_cmds
_bootctl_cmds=(
- "status:Show current firmware and boot settings"
+ "status:Show status of installed systemd-boot and EFI variables"
+ "install:Install systemd-boot to the ESP and EFI variables"
+ "update:Update systemd-boot in the ESP and EFI variables"
+ "remove:Remove systemd-boot from the ESP and EFI variables"
)
if (( CURRENT == 1 )); then
_describe -t commands 'bootctl command' _bootctl_cmds || compadd "$@"
@@ -22,4 +25,6 @@
_arguments \
{-h,--help}'[Prints a short help text and exits.]' \
'--version[Prints a short version string and exits.]' \
+ '--path=[Path to the EFI System Partition (ESP)]:path:_directories' \
+ '--no-variables[Do not touch EFI variables]' \
'*::bootctl command:_bootctl_command'
diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c
index 29dcec7166..1e65597acf 100644
--- a/src/boot/bootctl.c
+++ b/src/boot/bootctl.c
@@ -41,70 +41,53 @@
#include "build.h"
#include "util.h"
#include "rm-rf.h"
+#include "blkid-util.h"
static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t *psize, sd_id128_t *uuid) {
struct statfs sfs;
struct stat st, st2;
- char *t;
- blkid_probe b = NULL;
+ _cleanup_free_ char *t = NULL;
+ _cleanup_blkid_free_probe_ blkid_probe b = NULL;
int r;
- const char *v;
+ const char *v, *t2;
- if (statfs(p, &sfs) < 0) {
- fprintf(stderr, "Failed to check file system type of %s: %m\n", p);
- return -errno;
- }
+ if (statfs(p, &sfs) < 0)
+ return log_error_errno(errno, "Failed to check file system type of \"%s\": %m", p);
if (sfs.f_type != 0x4d44) {
- fprintf(stderr, "File system %s is not a FAT EFI System Partition (ESP) file system.\n", p);
+ log_error("File system \"%s\" is not a FAT EFI System Partition (ESP) file system.", p);
return -ENODEV;
}
- if (stat(p, &st) < 0) {
- fprintf(stderr, "Failed to determine block device node of %s: %m\n", p);
- return -errno;
- }
+ if (stat(p, &st) < 0)
+ return log_error_errno(errno, "Failed to determine block device node of \"%s\": %m", p);
if (major(st.st_dev) == 0) {
- fprintf(stderr, "Block device node of %p is invalid.\n", p);
+ log_error("Block device node of %p is invalid.", p);
return -ENODEV;
}
- r = asprintf(&t, "%s/..", p);
- if (r < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
- r = stat(t, &st2);
- free(t);
- if (r < 0) {
- fprintf(stderr, "Failed to determine block device node of parent of %s: %m\n", p);
- return -errno;
- }
+ t2 = strjoina(p, "/..");
+ r = stat(t2, &st2);
+ if (r < 0)
+ return log_error_errno(errno, "Failed to determine block device node of parent of \"%s\": %m", p);
if (st.st_dev == st2.st_dev) {
- fprintf(stderr, "Directory %s is not the root of the EFI System Partition (ESP) file system.\n", p);
+ log_error("Directory \"%s\" is not the root of the EFI System Partition (ESP) file system.", p);
return -ENODEV;
}
r = asprintf(&t, "/dev/block/%u:%u", major(st.st_dev), minor(st.st_dev));
- if (r < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
+ if (r < 0)
+ return log_oom();
errno = 0;
b = blkid_new_probe_from_filename(t);
- free(t);
if (!b) {
- if (errno != 0) {
- fprintf(stderr, "Failed to open file system %s: %m\n", p);
- return -errno;
- }
+ if (errno == 0)
+ return log_oom();
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
+ return log_error_errno(errno, "Failed to open file system \"%s\": %m", p);
}
blkid_probe_enable_superblocks(b, 1);
@@ -115,82 +98,70 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
errno = 0;
r = blkid_do_safeprobe(b);
if (r == -2) {
- fprintf(stderr, "File system %s is ambigious.\n", p);
- r = -ENODEV;
- goto fail;
+ log_error("File system \"%s\" is ambigious.", p);
+ return -ENODEV;
} else if (r == 1) {
- fprintf(stderr, "File system %s does not contain a label.\n", p);
- r = -ENODEV;
- goto fail;
+ log_error("File system \"%s\" does not contain a label.", p);
+ return -ENODEV;
} else if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe file system %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe file system \"%s\": %m", p);
}
errno = 0;
r = blkid_probe_lookup_value(b, "TYPE", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe file system type %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe file system type \"%s\": %m", p);
}
- if (strcmp(v, "vfat") != 0) {
- fprintf(stderr, "File system %s is not a FAT EFI System Partition (ESP) file system after all.\n", p);
- r = -ENODEV;
- goto fail;
+ if (!streq(v, "vfat")) {
+ log_error("File system \"%s\" is not FAT.", p);
+ return -ENODEV;
}
errno = 0;
r = blkid_probe_lookup_value(b, "PART_ENTRY_SCHEME", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe partition scheme %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe partition scheme \"%s\": %m", p);
}
- if (strcmp(v, "gpt") != 0) {
- fprintf(stderr, "File system %s is not on a GPT partition table.\n", p);
- r = -ENODEV;
- goto fail;
+ if (!streq(v, "gpt")) {
+ log_error("File system \"%s\" is not on a GPT partition table.", p);
+ return -ENODEV;
}
errno = 0;
r = blkid_probe_lookup_value(b, "PART_ENTRY_TYPE", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe partition type UUID %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe partition type UUID \"%s\": %m", p);
}
- if (strcmp(v, "c12a7328-f81f-11d2-ba4b-00a0c93ec93b") != 0) {
- r = -ENODEV;
- fprintf(stderr, "File system %s is not an EFI System Partition (ESP).\n", p);
- goto fail;
+ if (!streq(v, "c12a7328-f81f-11d2-ba4b-00a0c93ec93b")) {
+ log_error("File system \"%s\" has wrong type for an EFI System Partition (ESP).", p);
+ return -ENODEV;
}
errno = 0;
r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe partition entry UUID %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe partition entry UUID \"%s\": %m", p);
}
r = sd_id128_from_string(v, uuid);
if (r < 0) {
- fprintf(stderr, "Partition %s has invalid UUID: %s\n", p, v);
- r = -EIO;
- goto fail;
+ log_error("Partition \"%s\" has invalid UUID \"%s\".", p, v);
+ return -EIO;
}
errno = 0;
r = blkid_probe_lookup_value(b, "PART_ENTRY_NUMBER", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe partition number %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe partition number \"%s\": m", p);
}
*part = strtoul(v, NULL, 10);
@@ -198,8 +169,7 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
r = blkid_probe_lookup_value(b, "PART_ENTRY_OFFSET", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe partition offset %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe partition offset \"%s\": %m", p);
}
*pstart = strtoul(v, NULL, 10);
@@ -207,37 +177,31 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
r = blkid_probe_lookup_value(b, "PART_ENTRY_SIZE", &v, NULL);
if (r != 0) {
r = errno ? -errno : -EIO;
- fprintf(stderr, "Failed to probe partition size %s: %s\n", p, strerror(-r));
- goto fail;
+ return log_error_errno(r, "Failed to probe partition size \"%s\": %m", p);
}
*psize = strtoul(v, NULL, 10);
- blkid_free_probe(b);
return 0;
-fail:
- if (b)
- blkid_free_probe(b);
- return r;
}
/* search for "#### LoaderInfo: systemd-boot 218 ####" string inside the binary */
-static int get_file_version(FILE *f, char **v) {
+static int get_file_version(int fd, char **v) {
struct stat st;
char *buf;
const char *s, *e;
char *x = NULL;
int r = 0;
- assert(f);
+ assert(fd >= 0);
assert(v);
- if (fstat(fileno(f), &st) < 0)
+ if (fstat(fd, &st) < 0)
return -errno;
if (st.st_size < 27)
return 0;
- buf = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fileno(f), 0);
+ buf = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (buf == MAP_FAILED)
return -errno;
@@ -248,15 +212,14 @@ static int get_file_version(FILE *f, char **v) {
e = memmem(s, st.st_size - (s - buf), " ####", 5);
if (!e || e - s < 3) {
- fprintf(stderr, "Malformed version string.\n");
+ log_error("Malformed version string.");
r = -EINVAL;
goto finish;
}
x = strndup(s, e - s);
if (!x) {
- fprintf(stderr, "Out of memory.\n");
- r = -ENOMEM;
+ r = log_oom();
goto finish;
}
r = 1;
@@ -268,83 +231,48 @@ finish:
}
static int enumerate_binaries(const char *esp_path, const char *path, const char *prefix) {
+ char *p;
+ _cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
- char *p = NULL, *q = NULL;
- DIR *d = NULL;
int r = 0, c = 0;
- if (asprintf(&p, "%s/%s", esp_path, path) < 0) {
- fprintf(stderr, "Out of memory.\n");
- r = -ENOMEM;
- goto finish;
- }
-
+ p = strjoina(esp_path, "/", path);
d = opendir(p);
if (!d) {
- if (errno == ENOENT) {
- r = 0;
- goto finish;
- }
+ if (errno == ENOENT)
+ return 0;
- fprintf(stderr, "Failed to read %s: %m\n", p);
- r = -errno;
- goto finish;
+ return log_error_errno(errno, "Failed to read \"%s\": %m", p);
}
while ((de = readdir(d))) {
- char *v;
- size_t n;
- FILE *f;
+ _cleanup_close_ int fd = -1;
+ _cleanup_free_ char *v = NULL;
if (de->d_name[0] == '.')
continue;
- n = strlen(de->d_name);
- if (n < 4 || strcasecmp(de->d_name + n - 4, ".efi") != 0)
+ if (!endswith_no_case(de->d_name, ".efi"))
continue;
- if (prefix && strncasecmp(de->d_name, prefix, strlen(prefix)) != 0)
+ if (prefix && !startswith_no_case(de->d_name, prefix))
continue;
- free(q);
- q = NULL;
- if (asprintf(&q, "%s/%s/%s", esp_path, path, de->d_name) < 0) {
- fprintf(stderr, "Out of memory.\n");
- r = -ENOMEM;
- goto finish;
- }
-
- f = fopen(q, "re");
- if (!f) {
- fprintf(stderr, "Failed to open %s for reading: %m\n", q);
- r = -errno;
- goto finish;
- }
-
- r = get_file_version(f, &v);
- fclose(f);
+ fd = openat(dirfd(d), de->d_name, O_RDONLY|O_CLOEXEC);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open \"%s/%s\" for reading: %m", p, de->d_name);
+ r = get_file_version(fd, &v);
if (r < 0)
- goto finish;
-
+ return r;
if (r > 0)
printf(" File: └─/%s/%s (%s)\n", path, de->d_name, v);
else
printf(" File: └─/%s/%s\n", path, de->d_name);
-
c++;
- free(v);
}
- r = c;
-
-finish:
- if (d)
- closedir(d);
-
- free(p);
- free(q);
- return r;
+ return c;
}
static int status_binaries(const char *esp_path, sd_id128_t partition) {
@@ -356,17 +284,16 @@ static int status_binaries(const char *esp_path, sd_id128_t partition) {
r = enumerate_binaries(esp_path, "EFI/systemd", NULL);
if (r == 0)
- fprintf(stderr, "systemd-boot not installed in ESP.\n");
+ log_error("systemd-boot not installed in ESP.");
else if (r < 0)
return r;
r = enumerate_binaries(esp_path, "EFI/Boot", "boot");
if (r == 0)
- fprintf(stderr, "No default/fallback boot loader installed in ESP.\n");
+ log_error("No default/fallback boot loader installed in ESP.");
else if (r < 0)
return r;
- printf("\n");
return 0;
}
@@ -399,62 +326,46 @@ static int print_efi_option(uint16_t id, bool in_order) {
static int status_variables(void) {
int n_options, n_order;
- uint16_t *options = NULL, *order = NULL;
- int r, i;
+ _cleanup_free_ uint16_t *options = NULL, *order = NULL;
+ int i;
if (!is_efi_boot()) {
- fprintf(stderr, "Not booted with EFI, not showing EFI variables.\n");
+ log_notice("Not booted with EFI, not showing EFI variables.");
return 0;
}
n_options = efi_get_boot_options(&options);
- if (n_options < 0) {
- if (n_options == -ENOENT)
- fprintf(stderr, "Failed to access EFI variables, "
- "efivarfs needs to be available at /sys/firmware/efi/efivars/.\n");
- else
- fprintf(stderr, "Failed to read EFI boot entries: %s\n", strerror(-n_options));
- r = n_options;
- goto finish;
- }
+ if (n_options == -ENOENT)
+ return log_error_errno(ENOENT, "Failed to access EFI variables, efivarfs"
+ " needs to be available at /sys/firmware/efi/efivars/.");
+ else if (n_options < 0)
+ return log_error_errno(n_options, "Failed to read EFI boot entries: %m");
- printf("Boot Loader Entries in EFI Variables:\n");
n_order = efi_get_boot_order(&order);
- if (n_order == -ENOENT) {
+ if (n_order == -ENOENT)
n_order = 0;
- } else if (n_order < 0) {
- fprintf(stderr, "Failed to read EFI boot order.\n");
- r = n_order;
- goto finish;
- }
+ else if (n_order < 0)
+ return log_error_errno(n_order, "Failed to read EFI boot order.");
/* print entries in BootOrder first */
+ printf("Boot Loader Entries in EFI Variables:\n");
for (i = 0; i < n_order; i++)
print_efi_option(order[i], true);
/* print remaining entries */
for (i = 0; i < n_options; i++) {
int j;
- bool found = false;
for (j = 0; j < n_order; j++)
- if (options[i] == order[j]) {
- found = true;
- break;
- }
-
- if (found)
- continue;
+ if (options[i] == order[j])
+ goto next;
print_efi_option(options[i], false);
+ next:
+ continue;
}
- r = 0;
-finish:
- free(options);
- free(order);
-
- return r;
+ return 0;
}
static int compare_product(const char *a, const char *b) {
@@ -483,64 +394,50 @@ static int compare_version(const char *a, const char *b) {
return strverscmp(a, b);
}
-static int version_check(FILE *f, const char *from, const char *to) {
- FILE *g = NULL;
- char *a = NULL, *b = NULL;
+static int version_check(int fd, const char *from, const char *to) {
+ _cleanup_free_ char *a = NULL, *b = NULL;
+ _cleanup_close_ int fd2 = -1;
int r;
- assert(f);
+ assert(fd >= 0);
assert(from);
assert(to);
- r = get_file_version(f, &a);
+ r = get_file_version(fd, &a);
if (r < 0)
- goto finish;
+ return r;
if (r == 0) {
- r = -EINVAL;
- fprintf(stderr, "Source file %s does not carry version information!\n", from);
- goto finish;
+ log_error("Source file \"%s\" does not carry version information!", from);
+ return -EINVAL;
}
- g = fopen(to, "re");
- if (!g) {
- if (errno == ENOENT) {
- r = 0;
- goto finish;
- }
+ fd2 = open(to, O_RDONLY|O_CLOEXEC);
+ if (fd2 < 0) {
+ if (errno == ENOENT)
+ return 0;
- r = -errno;
- fprintf(stderr, "Failed to open %s for reading: %m\n", to);
- goto finish;
+ return log_error_errno(errno, "Failed to open \"%s\" for reading: %m", to);
}
- r = get_file_version(g, &b);
+ r = get_file_version(fd2, &b);
if (r < 0)
- goto finish;
+ return r;
if (r == 0 || compare_product(a, b) != 0) {
- r = -EEXIST;
- fprintf(stderr, "Skipping %s, since it's owned by another boot loader.\n", to);
- goto finish;
+ log_notice("Skipping \"%s\", since it's owned by another boot loader.", to);
+ return -EEXIST;
}
if (compare_version(a, b) < 0) {
- r = -EEXIST;
- fprintf(stderr, "Skipping %s, since it's a newer boot loader version already.\n", to);
- goto finish;
+ log_warning("Skipping \"%s\", since a newer boot loader version exists already.", to);
+ return -ESTALE;
}
- r = 0;
-
-finish:
- free(a);
- free(b);
- if (g)
- fclose(g);
- return r;
+ return 0;
}
static int copy_file(const char *from, const char *to, bool force) {
- FILE *f = NULL, *g = NULL;
- char *p = NULL;
+ _cleanup_fclose_ FILE *f = NULL, *g = NULL;
+ char *p;
int r;
struct timespec t[2];
struct stat st;
@@ -549,35 +446,24 @@ static int copy_file(const char *from, const char *to, bool force) {
assert(to);
f = fopen(from, "re");
- if (!f) {
- fprintf(stderr, "Failed to open %s for reading: %m\n", from);
- return -errno;
- }
+ if (!f)
+ return log_error_errno(errno, "Failed to open \"%s\" for reading: %m", from);
if (!force) {
/* If this is an update, then let's compare versions first */
- r = version_check(f, from, to);
+ r = version_check(fileno(f), from, to);
if (r < 0)
- goto finish;
- }
-
- if (asprintf(&p, "%s~", to) < 0) {
- fprintf(stderr, "Out of memory.\n");
- r = -ENOMEM;
- goto finish;
+ return r;
}
+ p = strjoina(to, "~");
g = fopen(p, "wxe");
if (!g) {
/* Directory doesn't exist yet? Then let's skip this... */
- if (!force && errno == ENOENT) {
- r = 0;
- goto finish;
- }
+ if (!force && errno == ENOENT)
+ return 0;
- fprintf(stderr, "Failed to open %s for writing: %m\n", to);
- r = -errno;
- goto finish;
+ return log_error_errno(errno, "Failed to open \"%s\" for writing: %m", to);
}
rewind(f);
@@ -587,33 +473,30 @@ static int copy_file(const char *from, const char *to, bool force) {
k = fread(buf, 1, sizeof(buf), f);
if (ferror(f)) {
- fprintf(stderr, "Failed to read %s: %m\n", from);
- r = -errno;
- goto finish;
+ r = log_error_errno(EIO, "Failed to read \"%s\": %m", from);
+ goto error;
}
+
if (k == 0)
break;
fwrite(buf, 1, k, g);
if (ferror(g)) {
- fprintf(stderr, "Failed to write %s: %m\n", to);
- r = -errno;
- goto finish;
+ r = log_error_errno(EIO, "Failed to write \"%s\": %m", to);
+ goto error;
}
} while (!feof(f));
fflush(g);
if (ferror(g)) {
- fprintf(stderr, "Failed to write %s: %m\n", to);
- r = -errno;
- goto finish;
+ r = log_error_errno(EIO, "Failed to write \"%s\": %m", to);
+ goto error;
}
r = fstat(fileno(f), &st);
if (r < 0) {
- fprintf(stderr, "Failed to get file timestamps of %s: %m", from);
- r = -errno;
- goto finish;
+ r = log_error_errno(errno, "Failed to get file timestamps of \"%s\": %m", from);
+ goto error;
}
t[0] = st.st_atim;
@@ -621,32 +504,20 @@ static int copy_file(const char *from, const char *to, bool force) {
r = futimens(fileno(g), t);
if (r < 0) {
- fprintf(stderr, "Failed to change file timestamps for %s: %m", p);
- r = -errno;
- goto finish;
+ r = log_error_errno(errno, "Failed to set file timestamps on \"%s\": %m", p);
+ goto error;
}
if (rename(p, to) < 0) {
- fprintf(stderr, "Failed to rename %s to %s: %m\n", p, to);
- r = -errno;
- goto finish;
+ r = log_error_errno(errno, "Failed to rename \"%s\" to \"%s\": %m", p, to);
+ goto error;
}
- fprintf(stderr, "Copied %s to %s.\n", from, to);
-
- free(p);
- p = NULL;
- r = 0;
+ log_info("Copied \"%s\" to \"%s\".", from, to);
+ return 0;
-finish:
- if (f)
- fclose(f);
- if (g)
- fclose(g);
- if (p) {
- unlink(p);
- free(p);
- }
+error:
+ unlink(p);
return r;
}
@@ -662,81 +533,56 @@ static char* strupper(char *s) {
static int mkdir_one(const char *prefix, const char *suffix) {
char *p;
- if (asprintf(&p, "%s/%s", prefix, suffix) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
+ p = strjoina(prefix, "/", suffix);
if (mkdir(p, 0700) < 0) {
- if (errno != EEXIST) {
- fprintf(stderr, "Failed to create %s: %m\n", p);
- free(p);
- return -errno;
- }
+ if (errno != EEXIST)
+ return log_error_errno(errno, "Failed to create \"%s\": %m", p);
} else
- fprintf(stderr, "Created %s.\n", p);
+ log_info("Created \"%s\".", p);
- free(p);
return 0;
}
+static const char *efi_subdirs[] = {
+ "EFI",
+ "EFI/systemd",
+ "EFI/Boot",
+ "loader",
+ "loader/entries"
+};
+
static int create_dirs(const char *esp_path) {
int r;
+ unsigned i;
- r = mkdir_one(esp_path, "EFI");
- if (r < 0)
- return r;
-
- r = mkdir_one(esp_path, "EFI/systemd");
- if (r < 0)
- return r;
-
- r = mkdir_one(esp_path, "EFI/Boot");
- if (r < 0)
- return r;
-
- r = mkdir_one(esp_path, "loader");
- if (r < 0)
- return r;
-
- r = mkdir_one(esp_path, "loader/entries");
- if (r < 0)
- return r;
+ for (i = 0; i < ELEMENTSOF(efi_subdirs); i++) {
+ r = mkdir_one(esp_path, efi_subdirs[i]);
+ if (r < 0)
+ return r;
+ }
return 0;
}
static int copy_one_file(const char *esp_path, const char *name, bool force) {
- _cleanup_free_ char *p = NULL;
- _cleanup_free_ char *q = NULL;
- _cleanup_free_ char *v = NULL;
+ char *p, *q;
int r;
- if (asprintf(&p, BOOTLIBDIR "/%s", name) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
- if (asprintf(&q, "%s/EFI/systemd/%s", esp_path, name) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
+ p = strjoina(BOOTLIBDIR "/", name);
+ q = strjoina(esp_path, "/EFI/systemd/", name);
r = copy_file(p, q, force);
if (startswith(name, "systemd-boot")) {
int k;
+ char *v;
/* Create the EFI default boot loader name (specified for removable devices) */
- if (asprintf(&v, "%s/EFI/Boot/BOOT%s", esp_path, name + strlen("systemd-boot")) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
+ v = strjoina(esp_path, "/EFI/Boot/BOOT", name + strlen("systemd-boot"));
strupper(strrchr(v, '/') + 1);
k = copy_file(p, v, force);
if (k < 0 && r == 0)
- return k;
+ r = k;
}
return r;
@@ -744,7 +590,7 @@ static int copy_one_file(const char *esp_path, const char *name, bool force) {
static int install_binaries(const char *esp_path, bool force) {
struct dirent *de;
- DIR *d;
+ _cleanup_closedir_ DIR *d = NULL;
int r = 0;
if (force) {
@@ -759,20 +605,16 @@ static int install_binaries(const char *esp_path, bool force) {
}
d = opendir(BOOTLIBDIR);
- if (!d) {
- fprintf(stderr, "Failed to open "BOOTLIBDIR": %m\n");
- return -errno;
- }
+ if (!d)
+ return log_error_errno(errno, "Failed to open \""BOOTLIBDIR"\": %m");
while ((de = readdir(d))) {
- size_t n;
int k;
if (de->d_name[0] == '.')
continue;
- n = strlen(de->d_name);
- if (n < 4 || strcmp(de->d_name + n - 4, ".efi") != 0)
+ if (!endswith_no_case(de->d_name, ".efi"))
continue;
k = copy_one_file(esp_path, de->d_name, force);
@@ -780,347 +622,239 @@ static int install_binaries(const char *esp_path, bool force) {
r = k;
}
- closedir(d);
return r;
}
static bool same_entry(uint16_t id, const sd_id128_t uuid, const char *path) {
- char *opath = NULL;
+ _cleanup_free_ char *opath = NULL;
sd_id128_t ouuid;
- int err;
- bool same = false;
+ int r;
- err = efi_get_boot_option(id, NULL, &ouuid, &opath, NULL);
- if (err < 0)
+ r = efi_get_boot_option(id, NULL, &ouuid, &opath, NULL);
+ if (r < 0)
return false;
if (!sd_id128_equal(uuid, ouuid))
- goto finish;
-
+ return false;
if (!streq_ptr(path, opath))
- goto finish;
-
- same = true;
+ return false;
-finish:
- return same;
+ return true;
}
static int find_slot(sd_id128_t uuid, const char *path, uint16_t *id) {
- uint16_t *options = NULL;
- int n_options;
- int i;
- uint16_t new_id = 0;
- bool existing = false;
+ _cleanup_free_ uint16_t *options = NULL;
+ int n, i;
- n_options = efi_get_boot_options(&options);
- if (n_options < 0)
- return n_options;
+ n = efi_get_boot_options(&options);
+ if (n < 0)
+ return n;
/* find already existing systemd-boot entry */
- for (i = 0; i < n_options; i++)
+ for (i = 0; i < n; i++)
if (same_entry(options[i], uuid, path)) {
- new_id = options[i];
- existing = true;
- goto finish;
+ *id = options[i];
+ return 1;
}
/* find free slot in the sorted BootXXXX variable list */
- for (i = 0; i < n_options; i++)
+ for (i = 0; i < n; i++)
if (i != options[i]) {
- new_id = i;
- goto finish;
+ *id = i;
+ return 1;
}
/* use the next one */
if (i == 0xffff)
return -ENOSPC;
- new_id = i;
-
-finish:
- *id = new_id;
- free(options);
- return existing;
+ *id = i;
+ return 0;
}
static int insert_into_order(uint16_t slot, bool first) {
- uint16_t *order = NULL;
- uint16_t *new_order;
- int n_order;
- int i;
- int err = 0;
+ _cleanup_free_ uint16_t *order = NULL;
+ uint16_t *t;
+ int n, i;
- n_order = efi_get_boot_order(&order);
- if (n_order <= 0) {
+ n = efi_get_boot_order(&order);
+ if (n <= 0)
/* no entry, add us */
- err = efi_set_boot_order(&slot, 1);
- goto finish;
- }
+ return efi_set_boot_order(&slot, 1);
/* are we the first and only one? */
- if (n_order == 1 && order[0] == slot)
- goto finish;
+ if (n == 1 && order[0] == slot)
+ return 0;
/* are we already in the boot order? */
- for (i = 0; i < n_order; i++) {
+ for (i = 0; i < n; i++) {
if (order[i] != slot)
continue;
/* we do not require to be the first one, all is fine */
if (!first)
- goto finish;
+ return 0;
/* move us to the first slot */
- memmove(&order[1], order, i * sizeof(uint16_t));
+ memmove(order + 1, order, i * sizeof(uint16_t));
order[0] = slot;
- efi_set_boot_order(order, n_order);
- goto finish;
+ return efi_set_boot_order(order, n);
}
/* extend array */
- new_order = realloc(order, (n_order+1) * sizeof(uint16_t));
- if (!new_order) {
- err = -ENOMEM;
- goto finish;
- }
- order = new_order;
+ t = realloc(order, (n + 1) * sizeof(uint16_t));
+ if (!t)
+ return -ENOMEM;
+ order = t;
/* add us to the top or end of the list */
if (first) {
- memmove(&order[1], order, n_order * sizeof(uint16_t));
+ memmove(order + 1, order, n * sizeof(uint16_t));
order[0] = slot;
} else
- order[n_order] = slot;
-
- efi_set_boot_order(order, n_order+1);
+ order[n] = slot;
-finish:
- free(order);
- return err;
+ return efi_set_boot_order(order, n + 1);
}
static int remove_from_order(uint16_t slot) {
_cleanup_free_ uint16_t *order = NULL;
- int n_order;
- int i;
- int err = 0;
+ int n, i;
- n_order = efi_get_boot_order(&order);
- if (n_order < 0)
- return n_order;
- if (n_order == 0)
- return 0;
+ n = efi_get_boot_order(&order);
+ if (n <= 0)
+ return n;
- for (i = 0; i < n_order; i++) {
+ for (i = 0; i < n; i++) {
if (order[i] != slot)
continue;
- if (i+1 < n_order)
- memmove(&order[i], &order[i+1], (n_order - i) * sizeof(uint16_t));
- efi_set_boot_order(order, n_order-1);
- break;
+ if (i + 1 < n)
+ memmove(order + i, order + i+1, (n - i) * sizeof(uint16_t));
+ return efi_set_boot_order(order, n - 1);
}
- return err;
+ return 0;
}
static int install_variables(const char *esp_path,
uint32_t part, uint64_t pstart, uint64_t psize,
sd_id128_t uuid, const char *path,
bool first) {
- char *p = NULL;
- uint16_t *options = NULL;
+ char *p;
uint16_t slot;
int r;
if (!is_efi_boot()) {
- fprintf(stderr, "Not booted with EFI, skipping EFI variable setup.\n");
+ log_warning("Not booted with EFI, skipping EFI variable setup.");
return 0;
}
- if (asprintf(&p, "%s%s", esp_path, path) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
+ p = strjoina(esp_path, path);
if (access(p, F_OK) < 0) {
if (errno == ENOENT)
- r = 0;
+ return 0;
else
- r = -errno;
- goto finish;
+ return log_error_errno(errno, "Cannot access \"%s\": %m", p);
}
r = find_slot(uuid, path, &slot);
- if (r < 0) {
- if (r == -ENOENT)
- fprintf(stderr, "Failed to access EFI variables. Is the \"efivarfs\" filesystem mounted?\n");
- else
- fprintf(stderr, "Failed to determine current boot order: %s\n", strerror(-r));
- goto finish;
- }
+ if (r < 0)
+ return log_error_errno(r,
+ r == -ENOENT ?
+ "Failed to access EFI variables. Is the \"efivarfs\" filesystem mounted?" :
+ "Failed to determine current boot order: %m");
if (first || r == false) {
r = efi_add_boot_option(slot, "Linux Boot Manager",
part, pstart, psize,
uuid, path);
- if (r < 0) {
- fprintf(stderr, "Failed to create EFI Boot variable entry: %s\n", strerror(-r));
- goto finish;
- }
- fprintf(stderr, "Created EFI boot entry \"Linux Boot Manager\".\n");
- }
+ if (r < 0)
+ return log_error_errno(r, "Failed to create EFI Boot variable entry: %m");
- insert_into_order(slot, first);
+ log_info("Created EFI boot entry \"Linux Boot Manager\".");
+ }
-finish:
- free(p);
- free(options);
- return r;
+ return insert_into_order(slot, first);
}
static int remove_boot_efi(const char *esp_path) {
+ char *p;
+ _cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
- char *p = NULL, *q = NULL;
- DIR *d = NULL;
- int r = 0, c = 0;
-
- if (asprintf(&p, "%s/EFI/Boot", esp_path) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
+ int r, c = 0;
+ p = strjoina(esp_path, "/EFI/Boot");
d = opendir(p);
if (!d) {
- if (errno == ENOENT) {
- r = 0;
- goto finish;
- }
+ if (errno == ENOENT)
+ return 0;
- fprintf(stderr, "Failed to read %s: %m\n", p);
- r = -errno;
- goto finish;
+ return log_error_errno(errno, "Failed to open directory \"%s\": %m", p);
}
while ((de = readdir(d))) {
- char *v;
- size_t n;
- FILE *f;
+ _cleanup_close_ int fd = -1;
+ _cleanup_free_ char *v = NULL;
if (de->d_name[0] == '.')
continue;
- n = strlen(de->d_name);
- if (n < 4 || strcasecmp(de->d_name + n - 4, ".EFI") != 0)
+ if (!endswith_no_case(de->d_name, ".efi"))
continue;
- if (strncasecmp(de->d_name, "Boot", 4) != 0)
+ if (!startswith_no_case(de->d_name, "Boot"))
continue;
- free(q);
- q = NULL;
- if (asprintf(&q, "%s/%s", p, de->d_name) < 0) {
- fprintf(stderr, "Out of memory.\n");
- r = -ENOMEM;
- goto finish;
- }
-
- f = fopen(q, "re");
- if (!f) {
- fprintf(stderr, "Failed to open %s for reading: %m\n", q);
- r = -errno;
- goto finish;
- }
-
- r = get_file_version(f, &v);
- fclose(f);
+ fd = openat(dirfd(d), de->d_name, O_RDONLY|O_CLOEXEC);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open \"%s/%s\" for reading: %m", p, de->d_name);
+ r = get_file_version(fd, &v);
if (r < 0)
- goto finish;
-
- if (r > 0 && strncmp(v, "systemd-boot ", 10) == 0) {
-
- r = unlink(q);
- if (r < 0) {
- fprintf(stderr, "Failed to remove %s: %m\n", q);
- r = -errno;
- free(v);
- goto finish;
- } else
- fprintf(stderr, "Removed %s.\n", q);
+ return r;
+ if (r > 0 && startswith(v, "systemd-boot ")) {
+ r = unlinkat(dirfd(d), de->d_name, 0);
+ if (r < 0)
+ return log_error_errno(errno, "Failed to remove \"%s/%s\": %m", p, de->d_name);
+
+ log_info("Removed \"%s/\%s\".", p, de->d_name);
}
c++;
- free(v);
}
- r = c;
-
-finish:
- if (d)
- closedir(d);
- free(p);
- free(q);
-
- return r;
+ return c;
}
static int rmdir_one(const char *prefix, const char *suffix) {
char *p;
- if (asprintf(&p, "%s/%s", prefix, suffix) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
+ p = strjoina(prefix, "/", suffix);
if (rmdir(p) < 0) {
- if (errno != ENOENT && errno != ENOTEMPTY) {
- fprintf(stderr, "Failed to remove %s: %m\n", p);
- free(p);
- return -errno;
- }
+ if (!IN_SET(errno, ENOENT, ENOTEMPTY))
+ return log_error_errno(errno, "Failed to remove \"%s\": %m", p);
} else
- fprintf(stderr, "Removed %s.\n", p);
+ log_info("Removed \"%s\".", p);
- free(p);
return 0;
}
-
static int remove_binaries(const char *esp_path) {
char *p;
int r, q;
+ unsigned i;
- if (asprintf(&p, "%s/EFI/systemd-boot", esp_path) < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
+ p = strjoina(esp_path, "/EFI/systemd");
r = rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
- free(p);
q = remove_boot_efi(esp_path);
if (q < 0 && r == 0)
r = q;
- q = rmdir_one(esp_path, "loader/entries");
- if (q < 0 && r == 0)
- r = q;
-
- q = rmdir_one(esp_path, "loader");
- if (q < 0 && r == 0)
- r = q;
-
- q = rmdir_one(esp_path, "EFI/Boot");
- if (q < 0 && r == 0)
- r = q;
-
- q = rmdir_one(esp_path, "EFI/systemd-boot");
- if (q < 0 && r == 0)
- r = q;
-
- q = rmdir_one(esp_path, "EFI");
- if (q < 0 && r == 0)
- r = q;
+ for (i = ELEMENTSOF(efi_subdirs); i > 0; i--) {
+ q = rmdir_one(esp_path, efi_subdirs[i-1]);
+ if (q < 0 && r == 0)
+ r = q;
+ }
return r;
}
@@ -1141,16 +875,16 @@ static int remove_variables(sd_id128_t uuid, const char *path, bool in_order) {
return r;
if (in_order)
- remove_from_order(slot);
-
- return 0;
+ return remove_from_order(slot);
+ else
+ return 0;
}
static int install_loader_config(const char *esp_path) {
- char *p = NULL;
+ char *p;
char line[64];
char *machine = NULL;
- FILE *f;
+ _cleanup_fclose_ FILE *f = NULL, *g = NULL;
f = fopen("/etc/machine-id", "re");
if (!f)
@@ -1166,24 +900,18 @@ static int install_loader_config(const char *esp_path) {
machine = line;
}
- fclose(f);
-
if (!machine)
return -ESRCH;
- if (asprintf(&p, "%s/%s", esp_path, "loader/loader.conf") < 0) {
- fprintf(stderr, "Out of memory.\n");
- return -ENOMEM;
- }
-
- f = fopen(p, "wxe");
- if (f) {
- fprintf(f, "#timeout 3\n");
- fprintf(f, "default %s-*\n", machine);
- fclose(f);
+ p = strjoina(esp_path, "/loader/loader.conf");
+ g = fopen(p, "wxe");
+ if (g) {
+ fprintf(g, "#timeout 3\n");
+ fprintf(g, "default %s-*\n", machine);
+ if (ferror(g))
+ return log_error_errno(EIO, "Failed to write \"%s\": %m", p);
}
- free(p);
return 0;
}
@@ -1196,7 +924,7 @@ static int help(void) {
" --path=PATH Path to the EFI System Partition (ESP)\n"
" --no-variables Don't touch EFI variables\n"
"\n"
- "Comands:\n"
+ "Commands:\n"
" status Show status of installed systemd-boot and EFI variables\n"
" install Install systemd-boot to the ESP and EFI variables\n"
" update Update systemd-boot in the ESP and EFI variables\n"
@@ -1206,7 +934,7 @@ static int help(void) {
return 0;
}
-static const char *arg_path = NULL;
+static const char *arg_path = "/boot";
static bool arg_touch_variables = true;
static int parse_argv(int argc, char *argv[]) {
@@ -1229,7 +957,7 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) {
+ while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
switch (c) {
case 'h':
@@ -1252,14 +980,20 @@ static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
default:
- fprintf(stderr, "Unknown option code '%c'.\n", c);
- return -EINVAL;
+ assert_not_reached("Unknown option");
}
- }
return 1;
}
+static void read_loader_efi_var(const char *name, char **var) {
+ int r;
+
+ r = efi_get_variable_string(EFI_VENDOR_LOADER, name, var);
+ if (r < 0 && r != -ENOENT)
+ log_warning_errno(r, "Failed to read EFI variable %s: %m", name);
+}
+
static int bootctl_main(int argc, char*argv[]) {
enum action {
ACTION_STATUS,
@@ -1279,13 +1013,12 @@ static int bootctl_main(int argc, char*argv[]) {
sd_id128_t uuid = {};
uint32_t part = 0;
- uint64_t pstart = 0;
- uint64_t psize = 0;
- unsigned int i;
- int q;
- int r;
+ uint64_t pstart = 0, psize = 0;
+ int r, q;
if (argv[optind]) {
+ unsigned i;
+
for (i = 0; i < ELEMENTSOF(verbs); i++) {
if (!streq(argv[optind], verbs[i].verb))
continue;
@@ -1293,26 +1026,19 @@ static int bootctl_main(int argc, char*argv[]) {
break;
}
if (i >= ELEMENTSOF(verbs)) {
- fprintf(stderr, "Unknown operation %s\n", argv[optind]);
- r = -EINVAL;
- goto finish;
+ log_error("Unknown operation \"%s\"", argv[optind]);
+ return -EINVAL;
}
}
- if (!arg_path)
- arg_path = "/boot";
-
- if (geteuid() != 0) {
- fprintf(stderr, "Need to be root.\n");
- r = -EPERM;
- goto finish;
- }
+ if (geteuid() != 0)
+ return log_error_errno(EPERM, "Need to be root.");
r = verify_esp(arg_path, &part, &pstart, &psize, &uuid);
if (r == -ENODEV && !arg_path)
- fprintf(stderr, "You might want to use --path= to indicate the path to your ESP, in case it is not mounted to /boot.\n");
+ log_notice("You might want to use --path= to indicate the path to your ESP, in case it is not mounted on /boot.");
if (r < 0)
- goto finish;
+ return r;
switch (arg_action) {
case ACTION_STATUS: {
@@ -1322,32 +1048,48 @@ static int bootctl_main(int argc, char*argv[]) {
_cleanup_free_ char *loader_path = NULL;
sd_id128_t loader_part_uuid = {};
- efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderFirmwareType", &fw_type);
- efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderFirmwareInfo", &fw_info);
- efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderInfo", &loader);
- if (efi_get_variable_string(EFI_VENDOR_LOADER, "LoaderImageIdentifier", &loader_path) > 0)
- efi_tilt_backslashes(loader_path);
- efi_loader_get_device_part_uuid(&loader_part_uuid);
-
- printf("System:\n");
- printf(" Firmware: %s (%s)\n", fw_type, strna(fw_info));
- printf(" Secure Boot: %s\n", is_efi_secure_boot() ? "enabled" : "disabled");
- printf(" Setup Mode: %s\n", is_efi_secure_boot_setup_mode() ? "setup" : "user");
- printf("\n");
-
- printf("Loader:\n");
- printf(" Product: %s\n", strna(loader));
- if (!sd_id128_equal(loader_part_uuid, SD_ID128_NULL))
- printf(" Partition: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
- SD_ID128_FORMAT_VAL(loader_part_uuid));
- else
- printf(" Partition: n/a\n");
- printf(" File: %s%s\n", draw_special_char(DRAW_TREE_RIGHT), strna(loader_path));
- printf("\n");
+ if (is_efi_boot()) {
+ read_loader_efi_var("LoaderFirmwareType", &fw_type);
+ read_loader_efi_var("LoaderFirmwareInfo", &fw_info);
+ read_loader_efi_var("LoaderInfo", &loader);
+ read_loader_efi_var("LoaderImageIdentifier", &loader_path);
+ if (loader_path)
+ efi_tilt_backslashes(loader_path);
+ r = efi_loader_get_device_part_uuid(&loader_part_uuid);
+ if (r < 0 && r == -ENOENT)
+ log_warning_errno(r, "Failed to read EFI variable LoaderDevicePartUUID: %m");
+
+ printf("System:\n");
+ printf(" Firmware: %s (%s)\n", strna(fw_type), strna(fw_info));
+
+ r = is_efi_secure_boot();
+ if (r < 0)
+ log_warning_errno(r, "Failed to query secure boot status: %m");
+ else
+ printf(" Secure Boot: %s\n", r ? "enabled" : "disabled");
+
+ r = is_efi_secure_boot_setup_mode();
+ if (r < 0)
+ log_warning_errno(r, "Failed to query secure boot mode: %m");
+ else
+ printf(" Setup Mode: %s\n", r ? "setup" : "user");
+ printf("\n");
+
+ printf("Loader:\n");
+ printf(" Product: %s\n", strna(loader));
+ if (!sd_id128_equal(loader_part_uuid, SD_ID128_NULL))
+ printf(" Partition: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
+ SD_ID128_FORMAT_VAL(loader_part_uuid));
+ else
+ printf(" Partition: n/a\n");
+ printf(" File: %s%s\n", draw_special_char(DRAW_TREE_RIGHT), strna(loader_path));
+ printf("\n");
+ } else
+ printf("System:\n Not booted with EFI\n");
r = status_binaries(arg_path, uuid);
if (r < 0)
- goto finish;
+ return r;
if (arg_touch_variables)
r = status_variables();
@@ -1360,10 +1102,13 @@ static int bootctl_main(int argc, char*argv[]) {
r = install_binaries(arg_path, arg_action == ACTION_INSTALL);
if (r < 0)
- goto finish;
+ return r;
- if (arg_action == ACTION_INSTALL)
- install_loader_config(arg_path);
+ if (arg_action == ACTION_INSTALL) {
+ r = install_loader_config(arg_path);
+ if (r < 0)
+ return r;
+ }
if (arg_touch_variables)
r = install_variables(arg_path,
@@ -1383,8 +1128,7 @@ static int bootctl_main(int argc, char*argv[]) {
break;
}
-finish:
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ return r;
}
int main(int argc, char *argv[]) {
diff --git a/src/bus-proxyd/driver.c b/src/bus-proxyd/driver.c
index 90ddd735dc..4ac955da41 100644
--- a/src/bus-proxyd/driver.c
+++ b/src/bus-proxyd/driver.c
@@ -280,6 +280,7 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
return synthetic_driver_send(m->bus, reply);
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionSELinuxSecurityContext")) {
+ _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -293,7 +294,15 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
if (!(creds->mask & SD_BUS_CREDS_SELINUX_CONTEXT))
return synthetic_reply_method_errno(m, -EOPNOTSUPP, NULL);
- return synthetic_reply_method_return(m, "y", creds->label, strlen(creds->label));
+ r = sd_bus_message_new_method_return(m, &reply);
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
+ r = sd_bus_message_append_array(reply, 'y', creds->label, strlen(creds->label));
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
+ return synthetic_driver_send(m->bus, reply);
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionUnixProcessID")) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
diff --git a/src/console/consoled-manager.c b/src/console/consoled-manager.c
index b288239cae..e560dcf524 100644
--- a/src/console/consoled-manager.c
+++ b/src/console/consoled-manager.c
@@ -21,16 +21,17 @@
#include <errno.h>
#include <stdlib.h>
-#include "consoled.h"
-#include "grdev.h"
-#include "idev.h"
-#include "log.h"
#include "sd-bus.h"
#include "sd-event.h"
#include "sd-login.h"
+#include "log.h"
+#include "signal-util.h"
+#include "util.h"
+#include "consoled.h"
+#include "idev.h"
+#include "grdev.h"
#include "sysview.h"
#include "unifont.h"
-#include "util.h"
int manager_new(Manager **out) {
_cleanup_(manager_freep) Manager *m = NULL;
diff --git a/src/console/consoled.c b/src/console/consoled.c
index 26dd068f5c..9f69e8983f 100644
--- a/src/console/consoled.c
+++ b/src/console/consoled.c
@@ -21,9 +21,10 @@
#include <errno.h>
#include <stdlib.h>
-#include "consoled.h"
-#include "log.h"
#include "sd-daemon.h"
+#include "log.h"
+#include "signal-util.h"
+#include "consoled.h"
int main(int argc, char *argv[]) {
_cleanup_(manager_freep) Manager *m = NULL;
diff --git a/src/core/automount.c b/src/core/automount.c
index 13f80c2abd..d847dc1629 100644
--- a/src/core/automount.c
+++ b/src/core/automount.c
@@ -747,7 +747,7 @@ static int automount_start(Unit *u) {
assert(a);
assert(a->state == AUTOMOUNT_DEAD || a->state == AUTOMOUNT_FAILED);
- if (path_is_mount_point(a->where, false) > 0) {
+ if (path_is_mount_point(a->where, 0) > 0) {
log_unit_error(u, "Path %s is already a mount point, refusing start.", a->where);
return -EEXIST;
}
diff --git a/src/core/busname.c b/src/core/busname.c
index 17b85134e8..11f3b98009 100644
--- a/src/core/busname.c
+++ b/src/core/busname.c
@@ -22,15 +22,16 @@
#include <sys/mman.h>
#include "special.h"
+#include "formats-util.h"
+#include "signal-util.h"
#include "bus-kernel.h"
#include "bus-internal.h"
#include "bus-util.h"
-#include "service.h"
#include "kdbus.h"
#include "bus-policy.h"
+#include "service.h"
#include "dbus-busname.h"
#include "busname.h"
-#include "formats-util.h"
static const UnitActiveState state_translation_table[_BUSNAME_STATE_MAX] = {
[BUSNAME_DEAD] = UNIT_INACTIVE,
diff --git a/src/core/dbus-kill.c b/src/core/dbus-kill.c
index fb29e147cb..3b8116281c 100644
--- a/src/core/dbus-kill.c
+++ b/src/core/dbus-kill.c
@@ -19,9 +19,11 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
+#include "signal-util.h"
+#include "bus-util.h"
+
#include "kill.h"
#include "dbus-kill.h"
-#include "bus-util.h"
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_kill_mode, kill_mode, KillMode);
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
index a4ece2adb5..1892725f91 100644
--- a/src/core/dbus-unit.c
+++ b/src/core/dbus-unit.c
@@ -561,6 +561,8 @@ const sd_bus_vtable bus_unit_vtable[] = {
SD_BUS_PROPERTY("PartOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_PART_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("RequiredBy", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUIRED_BY]), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("RequiredByOverridable", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUIRED_BY_OVERRIDABLE]), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("RequisiteOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUISITE_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("RequisiteOfOverridable", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUISITE_OF_OVERRIDABLE]), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("WantedBy", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_WANTED_BY]), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("BoundBy", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_BOUND_BY]), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ConsistsOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_CONSISTS_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -714,7 +716,7 @@ static int send_new_signal(sd_bus *bus, void *userdata) {
assert(u);
p = unit_dbus_path(u);
- if (!u)
+ if (!p)
return -ENOMEM;
r = sd_bus_message_new_signal(
@@ -791,7 +793,7 @@ static int send_removed_signal(sd_bus *bus, void *userdata) {
assert(u);
p = unit_dbus_path(u);
- if (!u)
+ if (!p)
return -ENOMEM;
r = sd_bus_message_new_signal(
diff --git a/src/core/device.c b/src/core/device.c
index 8eca4c2fa0..e7efcf0f0a 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -292,18 +292,19 @@ static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
static int device_setup_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
_cleanup_free_ char *e = NULL;
- const char *sysfs;
+ const char *sysfs = NULL;
Unit *u = NULL;
bool delete;
int r;
assert(m);
- assert(dev);
assert(path);
- sysfs = udev_device_get_syspath(dev);
- if (!sysfs)
- return 0;
+ if (dev) {
+ sysfs = udev_device_get_syspath(dev);
+ if (!sysfs)
+ return 0;
+ }
r = unit_name_from_path(path, ".device", &e);
if (r < 0)
@@ -312,6 +313,7 @@ static int device_setup_unit(Manager *m, struct udev_device *dev, const char *pa
u = manager_get_unit(m, e);
if (u &&
+ sysfs &&
DEVICE(u)->sysfs &&
!path_equal(DEVICE(u)->sysfs, sysfs)) {
log_unit_debug(u, "Device %s appeared twice with different sysfs paths %s and %s", e, DEVICE(u)->sysfs, sysfs);
@@ -336,17 +338,19 @@ static int device_setup_unit(Manager *m, struct udev_device *dev, const char *pa
/* If this was created via some dependency and has not
* actually been seen yet ->sysfs will not be
* initialized. Hence initialize it if necessary. */
+ if (sysfs) {
+ r = device_set_sysfs(DEVICE(u), sysfs);
+ if (r < 0)
+ goto fail;
- r = device_set_sysfs(DEVICE(u), sysfs);
- if (r < 0)
- goto fail;
+ (void) device_update_description(u, dev, path);
- (void) device_update_description(u, dev, path);
+ /* The additional systemd udev properties we only interpret
+ * for the main object */
+ if (main)
+ (void) device_add_udev_wants(u, dev);
+ }
- /* The additional systemd udev properties we only interpret
- * for the main object */
- if (main)
- (void) device_add_udev_wants(u, dev);
/* Note that this won't dispatch the load queue, the caller
* has to do that if needed and appropriate */
@@ -767,6 +771,9 @@ int device_found_node(Manager *m, const char *node, bool add, DeviceFound found,
assert(m);
assert(node);
+ if (!device_supported())
+ return 0;
+
/* This is called whenever we find a device referenced in
* /proc/swaps or /proc/self/mounts. Such a device might be
* mounted/enabled at a time where udev has not finished
@@ -788,23 +795,16 @@ int device_found_node(Manager *m, const char *node, bool add, DeviceFound found,
* will still have a device node even when the medium
* is not there... */
- if (stat(node, &st) < 0) {
- if (errno == ENOENT)
+ if (stat(node, &st) >= 0) {
+ if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
return 0;
- return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
- }
-
- if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode))
- return 0;
+ dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
+ if (!dev && errno != ENOENT)
+ return log_error_errno(errno, "Failed to get udev device from devnum %u:%u: %m", major(st.st_rdev), minor(st.st_rdev));
- dev = udev_device_new_from_devnum(m->udev, S_ISBLK(st.st_mode) ? 'b' : 'c', st.st_rdev);
- if (!dev) {
- if (errno == ENOENT)
- return 0;
-
- return log_oom();
- }
+ } else if (errno != ENOENT)
+ return log_error_errno(errno, "Failed to stat device node file %s: %m", node);
/* If the device is known in the kernel and newly
* appeared, then we'll create a device unit for it,
diff --git a/src/core/execute.c b/src/core/execute.c
index 97498b23d7..4120493bda 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -49,14 +49,13 @@
#include <sys/apparmor.h>
#endif
+#include "sd-messages.h"
#include "rm-rf.h"
-#include "execute.h"
#include "strv.h"
#include "macro.h"
#include "capability.h"
#include "util.h"
#include "log.h"
-#include "sd-messages.h"
#include "ioprio.h"
#include "securebits.h"
#include "namespace.h"
@@ -79,6 +78,7 @@
#include "formats-util.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
#ifdef HAVE_APPARMOR
#include "apparmor-util.h"
@@ -88,6 +88,8 @@
#include "seccomp-util.h"
#endif
+#include "execute.h"
+
#define IDLE_TIMEOUT_USEC (5*USEC_PER_SEC)
#define IDLE_TIMEOUT2_USEC (1*USEC_PER_SEC)
@@ -1491,7 +1493,7 @@ static int exec_child(
return -errno;
}
- if (context->personality != 0xffffffffUL)
+ if (context->personality != PERSONALITY_INVALID)
if (personality(context->personality) < 0) {
*exit_status = EXIT_PERSONALITY;
return -errno;
@@ -1946,7 +1948,7 @@ void exec_context_init(ExecContext *c) {
c->syslog_level_prefix = true;
c->ignore_sigpipe = true;
c->timer_slack_nsec = NSEC_INFINITY;
- c->personality = 0xffffffffUL;
+ c->personality = PERSONALITY_INVALID;
c->runtime_directory_mode = 0755;
}
@@ -2427,7 +2429,7 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
"%sSELinuxContext: %s%s\n",
prefix, c->selinux_context_ignore ? "-" : "", c->selinux_context);
- if (c->personality != 0xffffffffUL)
+ if (c->personality != PERSONALITY_INVALID)
fprintf(f,
"%sPersonality: %s\n",
prefix, strna(personality_to_string(c->personality)));
diff --git a/src/core/hostname-setup.c b/src/core/hostname-setup.c
index 217f201d05..932ddbf95a 100644
--- a/src/core/hostname-setup.c
+++ b/src/core/hostname-setup.c
@@ -30,35 +30,13 @@
#include "hostname-util.h"
#include "hostname-setup.h"
-static int read_and_strip_hostname(const char *path, char **hn) {
- char *s;
- int r;
-
- assert(path);
- assert(hn);
-
- r = read_one_line_file(path, &s);
- if (r < 0)
- return r;
-
- hostname_cleanup(s, false);
-
- if (isempty(s)) {
- free(s);
- return -ENOENT;
- }
-
- *hn = s;
- return 0;
-}
-
int hostname_setup(void) {
int r;
_cleanup_free_ char *b = NULL;
const char *hn;
bool enoent = false;
- r = read_and_strip_hostname("/etc/hostname", &b);
+ r = read_hostname_config("/etc/hostname", &b);
if (r < 0) {
if (r == -ENOENT)
enoent = true;
diff --git a/src/core/job.c b/src/core/job.c
index 9ad1f735f0..8a047df0c3 100644
--- a/src/core/job.c
+++ b/src/core/job.c
@@ -388,38 +388,38 @@ bool job_type_is_redundant(JobType a, UnitActiveState b) {
}
}
-void job_type_collapse(JobType *t, Unit *u) {
+JobType job_type_collapse(JobType t, Unit *u) {
UnitActiveState s;
- switch (*t) {
+ switch (t) {
case JOB_TRY_RESTART:
s = unit_active_state(u);
if (UNIT_IS_INACTIVE_OR_DEACTIVATING(s))
- *t = JOB_NOP;
- else
- *t = JOB_RESTART;
- break;
+ return JOB_NOP;
+
+ return JOB_RESTART;
case JOB_RELOAD_OR_START:
s = unit_active_state(u);
if (UNIT_IS_INACTIVE_OR_DEACTIVATING(s))
- *t = JOB_START;
- else
- *t = JOB_RELOAD;
- break;
+ return JOB_START;
+
+ return JOB_RELOAD;
default:
- ;
+ return t;
}
}
int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u) {
- JobType t = job_type_lookup_merge(*a, b);
+ JobType t;
+
+ t = job_type_lookup_merge(*a, b);
if (t < 0)
return -EEXIST;
- *a = t;
- job_type_collapse(a, u);
+
+ *a = job_type_collapse(t, u);
return 0;
}
@@ -790,6 +790,24 @@ static void job_log_status_message(Unit *u, JobType t, JobResult result) {
NULL);
}
+static void job_fail_dependencies(Unit *u, UnitDependency d) {
+ Unit *other;
+ Iterator i;
+
+ assert(u);
+
+ SET_FOREACH(other, u->dependencies[d], i) {
+ Job *j = other->job;
+
+ if (!j)
+ continue;
+ if (!IN_SET(j->type, JOB_START, JOB_VERIFY_ACTIVE))
+ continue;
+
+ job_finish_and_invalidate(j, JOB_DEPENDENCY, true);
+ }
+}
+
int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) {
Unit *u;
Unit *other;
@@ -831,37 +849,14 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) {
/* Fail depending jobs on failure */
if (result != JOB_DONE && recursive) {
-
- if (t == JOB_START ||
- t == JOB_VERIFY_ACTIVE) {
-
- SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
- if (other->job &&
- (other->job->type == JOB_START ||
- other->job->type == JOB_VERIFY_ACTIVE))
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
-
- SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
- if (other->job &&
- (other->job->type == JOB_START ||
- other->job->type == JOB_VERIFY_ACTIVE))
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
-
- SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
- if (other->job &&
- !other->job->override &&
- (other->job->type == JOB_START ||
- other->job->type == JOB_VERIFY_ACTIVE))
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
-
- } else if (t == JOB_STOP) {
-
- SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
- if (other->job &&
- (other->job->type == JOB_START ||
- other->job->type == JOB_VERIFY_ACTIVE))
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
- }
+ if (IN_SET(t, JOB_START, JOB_VERIFY_ACTIVE)) {
+ job_fail_dependencies(u, UNIT_REQUIRED_BY);
+ job_fail_dependencies(u, UNIT_REQUISITE_OF);
+ job_fail_dependencies(u, UNIT_BOUND_BY);
+ job_fail_dependencies(u, UNIT_REQUIRED_BY_OVERRIDABLE);
+ job_fail_dependencies(u, UNIT_REQUISITE_OF_OVERRIDABLE);
+ } else if (t == JOB_STOP)
+ job_fail_dependencies(u, UNIT_CONFLICTED_BY);
}
/* Trigger OnFailure dependencies that are not generated by
diff --git a/src/core/job.h b/src/core/job.h
index 9119e4834a..1d1b10f1d3 100644
--- a/src/core/job.h
+++ b/src/core/job.h
@@ -206,7 +206,7 @@ bool job_type_is_redundant(JobType a, UnitActiveState b) _pure_;
/* Collapses a state-dependent job type into a simpler type by observing
* the state of the unit which it is going to be applied to. */
-void job_type_collapse(JobType *t, Unit *u);
+JobType job_type_collapse(JobType t, Unit *u);
int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
diff --git a/src/core/kill.c b/src/core/kill.c
index 60a510eae6..2de71c6bf9 100644
--- a/src/core/kill.c
+++ b/src/core/kill.c
@@ -19,9 +19,9 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
-
-#include "kill.h"
#include "util.h"
+#include "signal-util.h"
+#include "kill.h"
void kill_context_init(KillContext *c) {
assert(c);
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index e1cd72fe98..df5fe6fb32 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -52,6 +52,7 @@
#include "errno-list.h"
#include "af-list.h"
#include "cap-list.h"
+#include "signal-util.h"
#include "bus-internal.h"
#ifdef HAVE_SECCOMP
@@ -609,7 +610,7 @@ int config_parse_exec(
else
skip = strneq(word, "\\;", MAX(l, 1U));
- r = cunescape_length(word + skip, l - skip, 0, &c);
+ r = cunescape_length(word + skip, l - skip, UNESCAPE_RELAX, &c);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to unescape command line, ignoring: %s", rvalue);
r = 0;
@@ -3046,7 +3047,7 @@ int config_parse_personality(
assert(personality);
p = personality_from_string(rvalue);
- if (p == 0xffffffffUL) {
+ if (p == PERSONALITY_INVALID) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
"Failed to parse personality, ignoring: %s", rvalue);
return 0;
diff --git a/src/core/machine-id-setup.c b/src/core/machine-id-setup.c
index e083c5b347..b3d22840cf 100644
--- a/src/core/machine-id-setup.c
+++ b/src/core/machine-id-setup.c
@@ -297,7 +297,7 @@ int machine_id_commit(const char *root) {
etc_machine_id = path_kill_slashes(x);
}
- r = path_is_mount_point(etc_machine_id, false);
+ r = path_is_mount_point(etc_machine_id, 0);
if (r < 0)
return log_error_errno(r, "Failed to determine whether %s is a mount point: %m", etc_machine_id);
if (r == 0) {
diff --git a/src/core/main.c b/src/core/main.c
index c39815b106..674e47e788 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -60,6 +60,10 @@
#include "bus-error.h"
#include "bus-util.h"
#include "selinux-util.h"
+#include "formats-util.h"
+#include "process-util.h"
+#include "terminal-util.h"
+#include "signal-util.h"
#include "manager.h"
#include "dbus-manager.h"
#include "load-fragment.h"
@@ -72,9 +76,6 @@
#include "ima-setup.h"
#include "smack-setup.h"
#include "kmod-setup.h"
-#include "formats-util.h"
-#include "process-util.h"
-#include "terminal-util.h"
static enum {
ACTION_RUN,
@@ -1496,7 +1497,7 @@ int main(int argc, char *argv[]) {
setsid();
/* Move out of the way, so that we won't block unmounts */
- assert_se(chdir("/") == 0);
+ assert_se(chdir("/") == 0);
/* Reset the console, but only if this is really init and we
* are freshly booted */
diff --git a/src/core/manager.c b/src/core/manager.c
index 2fddc44fe3..ae473d05c2 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -40,8 +40,6 @@
#include "sd-daemon.h"
#include "sd-messages.h"
-#include "manager.h"
-#include "transaction.h"
#include "hashmap.h"
#include "macro.h"
#include "strv.h"
@@ -65,14 +63,17 @@
#include "bus-common-errors.h"
#include "bus-error.h"
#include "bus-util.h"
-#include "dbus.h"
-#include "dbus-unit.h"
-#include "dbus-job.h"
-#include "dbus-manager.h"
#include "bus-kernel.h"
#include "time-util.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
+#include "dbus.h"
+#include "dbus-unit.h"
+#include "dbus-job.h"
+#include "dbus-manager.h"
+#include "manager.h"
+#include "transaction.h"
/* Initial delay and the interval for printing status messages about running jobs */
#define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
@@ -1204,7 +1205,7 @@ int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool ove
log_unit_debug(unit, "Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
- job_type_collapse(&type, unit);
+ type = job_type_collapse(type, unit);
tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
if (!tr)
@@ -2703,6 +2704,15 @@ void manager_check_finished(Manager *m) {
assert(m);
+ if (m->n_reloading > 0)
+ return;
+
+ /* Verify that we are actually running currently. Initially
+ * the exit code is set to invalid, and during operation it is
+ * then set to MANAGER_OK */
+ if (m->exit_code != MANAGER_OK)
+ return;
+
if (hashmap_size(m->jobs) > 0) {
if (m->jobs_in_progress_event_source)
diff --git a/src/core/mount-setup.c b/src/core/mount-setup.c
index 23fb0a1e38..c35248eeae 100644
--- a/src/core/mount-setup.c
+++ b/src/core/mount-setup.c
@@ -156,7 +156,7 @@ static int mount_one(const MountPoint *p, bool relabel) {
if (relabel)
label_fix(p->where, true, true);
- r = path_is_mount_point(p->where, true);
+ r = path_is_mount_point(p->where, AT_SYMLINK_FOLLOW);
if (r < 0 && r != -ENOENT)
return r;
if (r > 0)
@@ -373,7 +373,7 @@ int mount_setup(bool loaded_policy) {
/* Create a few default symlinks, which are normally created
* by udevd, but some scripts might need them before we start
* udevd. */
- dev_setup(NULL);
+ dev_setup(NULL, UID_INVALID, GID_INVALID);
/* Mark the root directory as shared in regards to mount
* propagation. The kernel defaults to "private", but we think
diff --git a/src/core/mount.c b/src/core/mount.c
index 8ef3d1755d..ba1dcf1e85 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -1628,7 +1628,10 @@ fail:
}
static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
+ _cleanup_set_free_ Set *around = NULL, *gone = NULL;
Manager *m = userdata;
+ const char *what;
+ Iterator i;
Unit *u;
int r;
@@ -1695,6 +1698,19 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
if (!mount->is_mounted) {
+ /* A mount point is not around right now. It
+ * might be gone, or might never have
+ * existed. */
+
+ if (mount->from_proc_self_mountinfo &&
+ mount->parameters_proc_self_mountinfo.what) {
+
+ /* Remember that this device might just have disappeared */
+ if (set_ensure_allocated(&gone, &string_hash_ops) < 0 ||
+ set_put(gone, mount->parameters_proc_self_mountinfo.what) < 0)
+ log_oom(); /* we don't care too much about OOM here... */
+ }
+
mount->from_proc_self_mountinfo = false;
switch (mount->state) {
@@ -1710,13 +1726,9 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
break;
}
- if (mount->parameters_proc_self_mountinfo.what)
- (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true);
-
-
} else if (mount->just_mounted || mount->just_changed) {
- /* New or changed mount entry */
+ /* A mount point was added or changed */
switch (mount->state) {
@@ -1743,10 +1755,27 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
}
}
+ if (mount->is_mounted &&
+ mount->from_proc_self_mountinfo &&
+ mount->parameters_proc_self_mountinfo.what) {
+
+ if (set_ensure_allocated(&around, &string_hash_ops) < 0 ||
+ set_put(around, mount->parameters_proc_self_mountinfo.what) < 0)
+ log_oom();
+ }
+
/* Reset the flags for later calls */
mount->is_mounted = mount->just_mounted = mount->just_changed = false;
}
+ SET_FOREACH(what, gone, i) {
+ if (set_contains(around, what))
+ continue;
+
+ /* Let the device units know that the device is no longer mounted */
+ (void) device_found_node(m, what, false, DEVICE_FOUND_MOUNT, true);
+ }
+
return 0;
}
diff --git a/src/core/namespace.c b/src/core/namespace.c
index 5b782798c8..01a817bf23 100644
--- a/src/core/namespace.c
+++ b/src/core/namespace.c
@@ -125,22 +125,6 @@ static void drop_duplicates(BindMount *m, unsigned *n) {
*n = t - m;
}
-static int mount_move_root(const char *path) {
- if (chdir(path) < 0)
- return -errno;
-
- if (mount(path, "/", NULL, MS_MOVE, NULL) < 0)
- return -errno;
-
- if (chroot(".") < 0)
- return -errno;
-
- if (chdir("/") < 0)
- return -errno;
-
- return 0;
-}
-
static int mount_dev(BindMount *m) {
static const char devnodes[] =
"/dev/null\0"
@@ -240,7 +224,7 @@ static int mount_dev(BindMount *m) {
}
}
- dev_setup(temporary_mount);
+ dev_setup(temporary_mount, UID_INVALID, GID_INVALID);
/* Create the /dev directory if missing. It is more likely to be
* missing when the service is started with RootDirectory. This is
@@ -515,7 +499,7 @@ int setup_namespace(
if (protect_system != PROTECT_SYSTEM_NO) {
const char *usr_dir, *boot_dir, *etc_dir;
- usr_dir = prefix_roota(root_directory, "/home");
+ usr_dir = prefix_roota(root_directory, "/usr");
boot_dir = prefix_roota(root_directory, "/boot");
boot_dir = strjoina("-", boot_dir);
etc_dir = prefix_roota(root_directory, "/etc");
diff --git a/src/core/service.c b/src/core/service.c
index 07347b99a4..c7e65772ea 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -47,6 +47,7 @@
#include "bus-kernel.h"
#include "formats-util.h"
#include "process-util.h"
+#include "signal-util.h"
static const UnitActiveState state_translation_table[_SERVICE_STATE_MAX] = {
[SERVICE_DEAD] = UNIT_INACTIVE,
diff --git a/src/core/socket.c b/src/core/socket.c
index 17b8a5059d..fc5eb1464a 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -47,8 +47,9 @@
#include "selinux-util.h"
#include "dbus-socket.h"
#include "unit.h"
-#include "socket.h"
#include "formats-util.h"
+#include "signal-util.h"
+#include "socket.h"
static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
[SOCKET_DEAD] = UNIT_INACTIVE,
diff --git a/src/core/swap.c b/src/core/swap.c
index 12ebf84f62..193c8c3767 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -717,8 +717,8 @@ fail:
}
static void swap_enter_activating(Swap *s) {
- _cleanup_free_ char *discard = NULL;
- int r, priority = -1;
+ _cleanup_free_ char *opts = NULL;
+ int r;
assert(s);
@@ -726,13 +726,21 @@ static void swap_enter_activating(Swap *s) {
s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
if (s->from_fragment) {
- fstab_filter_options(s->parameters_fragment.options, "discard\0", NULL, &discard, NULL);
+ int priority = -1;
- priority = s->parameters_fragment.priority;
- if (priority < 0) {
- r = fstab_find_pri(s->parameters_fragment.options, &priority);
+ r = fstab_find_pri(s->parameters_fragment.options, &priority);
+ if (r < 0)
+ log_warning_errno(r, "Failed to parse swap priority \"%s\", ignoring: %m", s->parameters_fragment.options);
+ else if (r == 1 && s->parameters_fragment.priority >= 0)
+ log_warning("Duplicate swap priority configuration by Priority and Options fields.");
+
+ if (r <= 0 && s->parameters_fragment.priority >= 0) {
+ if (s->parameters_fragment.options)
+ r = asprintf(&opts, "%s,pri=%i", s->parameters_fragment.options, s->parameters_fragment.priority);
+ else
+ r = asprintf(&opts, "pri=%i", s->parameters_fragment.priority);
if (r < 0)
- log_notice_errno(r, "Failed to parse swap priority \"%s\", ignoring: %m", s->parameters_fragment.options);
+ goto fail;
}
}
@@ -740,24 +748,9 @@ static void swap_enter_activating(Swap *s) {
if (r < 0)
goto fail;
- if (priority >= 0) {
- char p[DECIMAL_STR_MAX(int)];
-
- sprintf(p, "%i", priority);
- r = exec_command_append(s->control_command, "-p", p, NULL);
- if (r < 0)
- goto fail;
- }
-
- if (discard && !streq(discard, "none")) {
- const char *discard_arg;
-
- if (streq(discard, "all"))
- discard_arg = "--discard";
- else
- discard_arg = strjoina("--discard=", discard);
-
- r = exec_command_append(s->control_command, discard_arg, NULL);
+ if (s->parameters_fragment.options || opts) {
+ r = exec_command_append(s->control_command, "-o",
+ opts ? : s->parameters_fragment.options, NULL);
if (r < 0)
goto fail;
}
diff --git a/src/core/transaction.c b/src/core/transaction.c
index d1f7b7f2bf..090103fbda 100644
--- a/src/core/transaction.c
+++ b/src/core/transaction.c
@@ -861,8 +861,7 @@ int transaction_add_job_and_dependencies(
/* by ? job_type_to_string(by->type) : "NA"); */
if (!IN_SET(unit->load_state, UNIT_LOADED, UNIT_ERROR, UNIT_NOT_FOUND, UNIT_MASKED))
- return sd_bus_error_setf(e, BUS_ERROR_LOAD_FAILED,
- "Unit %s is not loaded properly.", unit->id);
+ return sd_bus_error_setf(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->id);
if (type != JOB_STOP && unit->load_state == UNIT_ERROR) {
if (unit->load_error == -ENOENT || unit->manager->test_run)
@@ -921,9 +920,7 @@ int transaction_add_job_and_dependencies(
r = transaction_add_job_and_dependencies(tr, type, dep, ret, false, override, false, false, ignore_order, e);
if (r < 0) {
log_unit_warning(dep, "Cannot add dependency job for, ignoring: %s", bus_error_message(e, r));
-
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -938,8 +935,7 @@ int transaction_add_job_and_dependencies(
if (r != -EBADR)
goto fail;
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -949,8 +945,7 @@ int transaction_add_job_and_dependencies(
if (r != -EBADR)
goto fail;
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -961,9 +956,7 @@ int transaction_add_job_and_dependencies(
r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, r,
"Cannot add dependency job, ignoring: %s",
bus_error_message(e, r));
-
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -974,9 +967,7 @@ int transaction_add_job_and_dependencies(
r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, r,
"Cannot add dependency job, ignoring: %s",
bus_error_message(e, r));
-
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -986,8 +977,7 @@ int transaction_add_job_and_dependencies(
if (r != -EBADR)
goto fail;
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -998,9 +988,7 @@ int transaction_add_job_and_dependencies(
r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, r,
"Cannot add dependency job, ignoring: %s",
bus_error_message(e, r));
-
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -1010,8 +998,7 @@ int transaction_add_job_and_dependencies(
if (r != -EBADR)
goto fail;
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
@@ -1021,49 +1008,44 @@ int transaction_add_job_and_dependencies(
log_unit_warning(dep,
"Cannot add dependency job, ignoring: %s",
bus_error_message(e, r));
-
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
}
if (type == JOB_STOP || type == JOB_RESTART) {
+ static const UnitDependency propagate_deps[] = {
+ UNIT_REQUIRED_BY,
+ UNIT_REQUISITE_OF,
+ UNIT_BOUND_BY,
+ UNIT_CONSISTS_OF,
+ };
+
+ JobType ptype;
+ unsigned j;
+
+ /* We propagate STOP as STOP, but RESTART only
+ * as TRY_RESTART, in order not to start
+ * dependencies that are not around. */
+ ptype = type == JOB_RESTART ? JOB_TRY_RESTART : type;
+
+ for (j = 0; j < ELEMENTSOF(propagate_deps); j++)
+ SET_FOREACH(dep, ret->unit->dependencies[propagate_deps[j]], i) {
+ JobType nt;
+
+ nt = job_type_collapse(ptype, dep);
+ if (nt == JOB_NOP)
+ continue;
+
+ r = transaction_add_job_and_dependencies(tr, nt, dep, ret, true, override, false, false, ignore_order, e);
+ if (r < 0) {
+ if (r != -EBADR)
+ goto fail;
- SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRED_BY], i) {
- r = transaction_add_job_and_dependencies(tr, type, dep, ret, true, override, false, false, ignore_order, e);
- if (r < 0) {
- if (r != -EBADR)
- goto fail;
-
- if (e)
sd_bus_error_free(e);
+ }
}
- }
-
- SET_FOREACH(dep, ret->unit->dependencies[UNIT_BOUND_BY], i) {
- r = transaction_add_job_and_dependencies(tr, type, dep, ret, true, override, false, false, ignore_order, e);
- if (r < 0) {
- if (r != -EBADR)
- goto fail;
-
- if (e)
- sd_bus_error_free(e);
- }
- }
-
- SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONSISTS_OF], i) {
- r = transaction_add_job_and_dependencies(tr, type, dep, ret, true, override, false, false, ignore_order, e);
- if (r < 0) {
- if (r != -EBADR)
- goto fail;
-
- if (e)
- sd_bus_error_free(e);
- }
- }
-
}
if (type == JOB_RELOAD) {
@@ -1074,9 +1056,7 @@ int transaction_add_job_and_dependencies(
log_unit_warning(dep,
"Cannot add dependency reload job, ignoring: %s",
bus_error_message(e, r));
-
- if (e)
- sd_bus_error_free(e);
+ sd_bus_error_free(e);
}
}
}
diff --git a/src/core/unit.c b/src/core/unit.c
index 1c1d9cf896..e380276d49 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -85,12 +85,13 @@ Unit *unit_new(Manager *m, size_t size) {
u->manager = m;
u->type = _UNIT_TYPE_INVALID;
- u->deserialized_job = _JOB_TYPE_INVALID;
u->default_dependencies = true;
u->unit_file_state = _UNIT_FILE_STATE_INVALID;
u->unit_file_preset = -1;
u->on_failure_job_mode = JOB_REPLACE;
+ RATELIMIT_INIT(u->auto_stop_ratelimit, 10 * USEC_PER_SEC, 16);
+
return u;
}
@@ -1092,6 +1093,8 @@ static int unit_add_target_dependencies(Unit *u) {
static const UnitDependency deps[] = {
UNIT_REQUIRED_BY,
UNIT_REQUIRED_BY_OVERRIDABLE,
+ UNIT_REQUISITE_OF,
+ UNIT_REQUISITE_OF_OVERRIDABLE,
UNIT_WANTED_BY,
UNIT_BOUND_BY
};
@@ -1589,8 +1592,20 @@ bool unit_can_reload(Unit *u) {
}
static void unit_check_unneeded(Unit *u) {
- Iterator i;
+
+ static const UnitDependency needed_dependencies[] = {
+ UNIT_REQUIRED_BY,
+ UNIT_REQUIRED_BY_OVERRIDABLE,
+ UNIT_REQUISITE,
+ UNIT_REQUISITE_OF_OVERRIDABLE,
+ UNIT_WANTED_BY,
+ UNIT_BOUND_BY,
+ };
+
Unit *other;
+ Iterator i;
+ unsigned j;
+ int r;
assert(u);
@@ -1603,32 +1618,32 @@ static void unit_check_unneeded(Unit *u) {
if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
return;
- SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
- if (unit_active_or_pending(other))
- return;
-
- SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
- if (unit_active_or_pending(other))
- return;
+ for (j = 0; j < ELEMENTSOF(needed_dependencies); j++)
+ SET_FOREACH(other, u->dependencies[needed_dependencies[j]], i)
+ if (unit_active_or_pending(other))
+ return;
- SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
- if (unit_active_or_pending(other))
- return;
-
- SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
- if (unit_active_or_pending(other))
- return;
+ /* If stopping a unit fails continously we might enter a stop
+ * loop here, hence stop acting on the service being
+ * unnecessary after a while. */
+ if (!ratelimit_test(&u->auto_stop_ratelimit)) {
+ log_unit_warning(u, "Unit not needed anymore, but not stopping since we tried this too often recently.");
+ return;
+ }
log_unit_info(u, "Unit not needed anymore. Stopping.");
/* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
- manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
+ r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
+ if (r < 0)
+ log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %m");
}
static void unit_check_binds_to(Unit *u) {
bool stop = false;
Unit *other;
Iterator i;
+ int r;
assert(u);
@@ -1652,11 +1667,21 @@ static void unit_check_binds_to(Unit *u) {
if (!stop)
return;
+ /* If stopping a unit fails continously we might enter a stop
+ * loop here, hence stop acting on the service being
+ * unnecessary after a while. */
+ if (!ratelimit_test(&u->auto_stop_ratelimit)) {
+ log_unit_warning(u, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other->id);
+ return;
+ }
+
assert(other);
log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
/* A unit we need to run is gone. Sniff. Let's stop this. */
- manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
+ r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
+ if (r < 0)
+ log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %m");
}
static void retroactively_start_dependencies(Unit *u) {
@@ -2163,13 +2188,15 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen
[UNIT_REQUIRES] = UNIT_REQUIRED_BY,
[UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
[UNIT_WANTS] = UNIT_WANTED_BY,
- [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
- [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
+ [UNIT_REQUISITE] = UNIT_REQUISITE_OF,
+ [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUISITE_OF_OVERRIDABLE,
[UNIT_BINDS_TO] = UNIT_BOUND_BY,
[UNIT_PART_OF] = UNIT_CONSISTS_OF,
- [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
- [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
- [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
+ [UNIT_REQUIRED_BY] = UNIT_REQUIRES,
+ [UNIT_REQUIRED_BY_OVERRIDABLE] = UNIT_REQUIRES_OVERRIDABLE,
+ [UNIT_REQUISITE_OF] = UNIT_REQUISITE,
+ [UNIT_REQUISITE_OF_OVERRIDABLE] = UNIT_REQUISITE_OVERRIDABLE,
+ [UNIT_WANTED_BY] = UNIT_WANTS,
[UNIT_BOUND_BY] = UNIT_BINDS_TO,
[UNIT_CONSISTS_OF] = UNIT_PART_OF,
[UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
@@ -2713,16 +2740,8 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
job_free(j);
return r;
}
- } else {
- /* legacy */
- JobType type;
-
- type = job_type_from_string(v);
- if (type < 0)
- log_unit_debug(u, "Failed to parse job type value: %s", v);
- else
- u->deserialized_job = type;
- }
+ } else /* legacy for pre-44 */
+ log_unit_warning(u, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v);
continue;
} else if (streq(l, "inactive-exit-timestamp")) {
dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
@@ -2871,13 +2890,6 @@ int unit_coldplug(Unit *u) {
r = job_coldplug(u->job);
if (r < 0)
return r;
- } else if (u->deserialized_job >= 0) {
- /* legacy */
- r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
- if (r < 0)
- return r;
-
- u->deserialized_job = _JOB_TYPE_INVALID;
}
return 0;
diff --git a/src/core/unit.h b/src/core/unit.h
index 62257c403e..9491ef64f9 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -166,15 +166,12 @@ struct Unit {
/* Used during GC sweeps */
unsigned gc_marker;
- /* When deserializing, temporarily store the job type for this
- * unit here, if there was a job scheduled.
- * Only for deserializing from a legacy version. New style uses full
- * serialized jobs. */
- int deserialized_job; /* This is actually of type JobType */
-
/* Error code when we didn't manage to load the unit (negative) */
int load_error;
+ /* Make sure we never enter endless loops with the check unneeded logic, or the BindsTo= logic */
+ RateLimit auto_stop_ratelimit;
+
/* Cached unit file state and preset */
UnitFileState unit_file_state;
int unit_file_preset;
@@ -236,7 +233,7 @@ struct Unit {
bool cgroup_subtree_mask_valid:1;
/* Did we already invoke unit_coldplug() for this unit? */
- bool coldplugged;
+ bool coldplugged:1;
};
struct UnitStatusMessageFormats {
diff --git a/src/efi-boot-generator/efi-boot-generator.c b/src/efi-boot-generator/efi-boot-generator.c
index 42b21f57de..e6b15c9bb0 100644
--- a/src/efi-boot-generator/efi-boot-generator.c
+++ b/src/efi-boot-generator/efi-boot-generator.c
@@ -68,7 +68,7 @@ int main(int argc, char *argv[]) {
return EXIT_SUCCESS;
}
- r = path_is_mount_point("/boot", true);
+ r = path_is_mount_point("/boot", AT_SYMLINK_FOLLOW);
if (r > 0) {
log_debug("/boot is already a mount point, exiting.");
return EXIT_SUCCESS;
diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
index 9bbe9ff673..f0e5c5f239 100644
--- a/src/fsck/fsck.c
+++ b/src/fsck/fsck.c
@@ -34,6 +34,7 @@
#include "util.h"
#include "process-util.h"
+#include "signal-util.h"
#include "special.h"
#include "bus-util.h"
#include "bus-error.h"
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 302fad37bb..a88b68e2c0 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -53,10 +53,9 @@ static int add_swap(
bool noauto,
bool nofail) {
- _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL, *filtered = NULL;
+ _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
_cleanup_fclose_ FILE *f = NULL;
- int r, pri = -1;
- const char *opts;
+ int r;
assert(what);
assert(me);
@@ -71,18 +70,6 @@ static int add_swap(
return 0;
}
- opts = me->mnt_opts;
- r = fstab_find_pri(opts, &pri);
- if (r < 0) {
- log_error_errno(r, "Failed to parse priority, ignoring: %m");
-
- /* Remove invalid pri field */
- r = fstab_filter_options(opts, "pri\0", NULL, NULL, &filtered);
- if (r < 0)
- return log_error_errno(r, "Failed to parse options: %m");
- opts = filtered;
- }
-
r = unit_name_from_path(what, ".swap", &name);
if (r < 0)
return log_error_errno(r, "Failed to generate unit name: %m");
@@ -109,20 +96,15 @@ static int add_swap(
"What=%s\n",
what);
- /* Note that we currently pass the priority field twice, once
- * in Priority=, and once in Options= */
- if (pri >= 0)
- fprintf(f, "Priority=%i\n", pri);
-
- if (!isempty(opts) && !streq(opts, "defaults"))
- fprintf(f, "Options=%s\n", opts);
+ if (!isempty(me->mnt_opts) && !streq(me->mnt_opts, "defaults"))
+ fprintf(f, "Options=%s\n", me->mnt_opts);
r = fflush_and_check(f);
if (r < 0)
return log_error_errno(r, "Failed to write unit file %s: %m", unit);
/* use what as where, to have a nicer error message */
- r = generator_write_timeouts(arg_dest, what, what, opts, NULL);
+ r = generator_write_timeouts(arg_dest, what, what, me->mnt_opts, NULL);
if (r < 0)
return r;
diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c
index b192526186..b46e160888 100644
--- a/src/gpt-auto-generator/gpt-auto-generator.c
+++ b/src/gpt-auto-generator/gpt-auto-generator.c
@@ -297,7 +297,7 @@ static int probe_and_add_mount(
assert(where);
assert(description);
- if (path_is_mount_point(where, true) <= 0 &&
+ if (path_is_mount_point(where, AT_SYMLINK_FOLLOW) <= 0 &&
dir_is_empty(where) <= 0) {
log_debug("%s already populated, ignoring.", where);
return 0;
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index ab9ddc706a..7ff3a4e224 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -96,7 +96,7 @@ static int context_read_data(Context *c) {
if (!c->data[PROP_HOSTNAME])
return -ENOMEM;
- r = read_one_line_file("/etc/hostname", &c->data[PROP_STATIC_HOSTNAME]);
+ r = read_hostname_config("/etc/hostname", &c->data[PROP_STATIC_HOSTNAME]);
if (r < 0 && r != -ENOENT)
return r;
diff --git a/src/import/export.c b/src/import/export.c
index 201c5ab356..d4bc88e010 100644
--- a/src/import/export.c
+++ b/src/import/export.c
@@ -23,6 +23,7 @@
#include "sd-event.h"
#include "event-util.h"
+#include "signal-util.h"
#include "verbs.h"
#include "build.h"
#include "machine-image.h"
diff --git a/src/import/import-common.c b/src/import/import-common.c
index aede2f9b36..9711614000 100644
--- a/src/import/import-common.c
+++ b/src/import/import-common.c
@@ -26,6 +26,7 @@
#include "util.h"
#include "btrfs-util.h"
#include "capability.h"
+#include "signal-util.h"
#include "import-common.h"
int import_make_read_only_fd(int fd) {
diff --git a/src/import/import.c b/src/import/import.c
index f3072b3775..fff5a104b1 100644
--- a/src/import/import.c
+++ b/src/import/import.c
@@ -25,6 +25,7 @@
#include "event-util.h"
#include "verbs.h"
#include "build.h"
+#include "signal-util.h"
#include "machine-image.h"
#include "import-util.h"
#include "import-tar.h"
diff --git a/src/import/importd.c b/src/import/importd.c
index 45d1d93343..50566a6e5c 100644
--- a/src/import/importd.c
+++ b/src/import/importd.c
@@ -34,6 +34,7 @@
#include "path-util.h"
#include "import-util.h"
#include "process-util.h"
+#include "signal-util.h"
typedef struct Transfer Transfer;
typedef struct Manager Manager;
diff --git a/src/import/pull-common.c b/src/import/pull-common.c
index 59091ba7cb..d2588d4fa0 100644
--- a/src/import/pull-common.c
+++ b/src/import/pull-common.c
@@ -30,6 +30,7 @@
#include "pull-job.h"
#include "pull-common.h"
#include "process-util.h"
+#include "signal-util.h"
#define FILENAME_ESCAPE "/.#\"\'"
diff --git a/src/import/pull-dkr.c b/src/import/pull-dkr.c
index f89eb88669..d7476dc340 100644
--- a/src/import/pull-dkr.c
+++ b/src/import/pull-dkr.c
@@ -52,6 +52,9 @@ struct DkrPull {
sd_event *event;
CurlGlue *glue;
+ char *index_protocol;
+ char *index_address;
+
char *index_url;
char *image_root;
@@ -62,9 +65,10 @@ struct DkrPull {
PullJob *layer_job;
char *name;
- char *tag;
+ char *reference;
char *id;
+ char *response_digest;
char *response_token;
char **response_registries;
@@ -88,9 +92,9 @@ struct DkrPull {
#define PROTOCOL_PREFIX "https://"
#define HEADER_TOKEN "X-Do" /* the HTTP header for the auth token */ "cker-Token:"
-#define HEADER_REGISTRY "X-Do" /*the HTTP header for the registry */ "cker-Endpoints:"
-
-#define LAYERS_MAX 2048
+#define HEADER_REGISTRY "X-Do" /* the HTTP header for the registry */ "cker-Endpoints:"
+#define HEADER_DIGEST "Do" /* the HTTP header for the manifest digest */ "cker-Content-Digest:"
+#define LAYERS_MAX 127
static void dkr_pull_job_on_finished(PullJob *j);
@@ -118,12 +122,13 @@ DkrPull* dkr_pull_unref(DkrPull *i) {
}
free(i->name);
- free(i->tag);
+ free(i->reference);
free(i->id);
free(i->response_token);
- free(i->response_registries);
strv_free(i->ancestry);
free(i->final_path);
+ free(i->index_address);
+ free(i->index_protocol);
free(i->index_url);
free(i->image_root);
free(i->local);
@@ -417,10 +422,27 @@ static int dkr_pull_add_token(DkrPull *i, PullJob *j) {
return 0;
}
+static int dkr_pull_add_bearer_token(DkrPull *i, PullJob *j) {
+ const char *t = NULL;
+
+ assert(i);
+ assert(j);
+
+ if (i->response_token)
+ t = strjoina("Authorization: Bearer ", i->response_token);
+ else
+ return -EINVAL;
+
+ j->request_header = curl_slist_new("Accept: application/json", t, NULL);
+ if (!j->request_header)
+ return -ENOMEM;
+
+ return 0;
+}
+
static bool dkr_pull_is_done(DkrPull *i) {
assert(i);
assert(i->images_job);
-
if (i->images_job->state != PULL_JOB_DONE)
return false;
@@ -430,7 +452,7 @@ static bool dkr_pull_is_done(DkrPull *i) {
if (!i->ancestry_job || i->ancestry_job->state != PULL_JOB_DONE)
return false;
- if (!i->json_job || i->json_job->state != PULL_JOB_DONE)
+ if (i->json_job && i->json_job->state != PULL_JOB_DONE)
return false;
if (i->layer_job && i->layer_job->state != PULL_JOB_DONE)
@@ -442,8 +464,9 @@ static bool dkr_pull_is_done(DkrPull *i) {
return true;
}
-static int dkr_pull_make_local_copy(DkrPull *i) {
+static int dkr_pull_make_local_copy(DkrPull *i, DkrPullVersion version) {
int r;
+ _cleanup_free_ char *p = NULL;
assert(i);
@@ -456,10 +479,30 @@ static int dkr_pull_make_local_copy(DkrPull *i) {
return log_oom();
}
- r = pull_make_local_copy(i->final_path, i->image_root, i->local, i->force_local);
+ if (version == DKR_PULL_V2) {
+ r = path_get_parent(i->image_root, &p);
+ if (r < 0)
+ return r;
+ }
+
+ r = pull_make_local_copy(i->final_path, p ?: i->image_root, i->local, i->force_local);
if (r < 0)
return r;
+ if (version == DKR_PULL_V2) {
+ char **k = NULL;
+ STRV_FOREACH(k, i->ancestry) {
+ _cleanup_free_ char *d = strjoin(i->image_root, "/.dkr-", *k, NULL);
+ r = btrfs_subvol_remove(d, false);
+ if (r < 0)
+ return r;
+ }
+
+ r = rmdir(i->image_root);
+ if (r < 0)
+ return r;
+ }
+
return 0;
}
@@ -517,6 +560,68 @@ static void dkr_pull_job_on_progress(PullJob *j) {
DKR_DOWNLOADING);
}
+static void dkr_pull_job_on_finished_v2(PullJob *j);
+
+static int dkr_pull_pull_layer_v2(DkrPull *i) {
+ _cleanup_free_ char *path = NULL;
+ const char *url, *layer = NULL;
+ int r;
+
+ assert(i);
+ assert(!i->layer_job);
+ assert(!i->temp_path);
+ assert(!i->final_path);
+
+ for (;;) {
+ layer = dkr_pull_current_layer(i);
+ if (!layer)
+ return 0; /* no more layers */
+
+ path = strjoin(i->image_root, "/.dkr-", layer, NULL);
+ if (!path)
+ return log_oom();
+
+ if (laccess(path, F_OK) < 0) {
+ if (errno == ENOENT)
+ break;
+
+ return log_error_errno(errno, "Failed to check for container: %m");
+ }
+
+ log_info("Layer %s already exists, skipping.", layer);
+
+ i->current_ancestry++;
+
+ free(path);
+ path = NULL;
+ }
+
+ log_info("Pulling layer %s...", layer);
+
+ i->final_path = path;
+ path = NULL;
+
+ url = strjoina(PROTOCOL_PREFIX, i->response_registries[0], "/v2/", i->name, "/blobs/", layer);
+ r = pull_job_new(&i->layer_job, url, i->glue, i);
+ if (r < 0)
+ return log_error_errno(r, "Failed to allocate layer job: %m");
+
+ r = dkr_pull_add_bearer_token(i, i->layer_job);
+ if (r < 0)
+ return log_oom();
+
+ i->layer_job->on_finished = dkr_pull_job_on_finished_v2;
+ i->layer_job->on_open_disk = dkr_pull_job_on_open_disk;
+ i->layer_job->on_progress = dkr_pull_job_on_progress;
+ i->layer_job->grow_machine_directory = i->grow_machine_directory;
+
+ r = pull_job_begin(i->layer_job);
+ if (r < 0)
+ return log_error_errno(r, "Failed to start layer job: %m");
+
+ return 0;
+}
+
static int dkr_pull_pull_layer(DkrPull *i) {
_cleanup_free_ char *path = NULL;
const char *url, *layer = NULL;
@@ -577,6 +682,342 @@ static int dkr_pull_pull_layer(DkrPull *i) {
return 0;
}
+static int dkr_pull_job_on_header(PullJob *j, const char *header, size_t sz) {
+ _cleanup_free_ char *registry = NULL;
+ char *token, *digest;
+ DkrPull *i;
+ int r;
+
+ assert(j);
+ assert(j->userdata);
+
+ i = j->userdata;
+ r = curl_header_strdup(header, sz, HEADER_TOKEN, &token);
+ if (r < 0)
+ return log_oom();
+ if (r > 0) {
+ free(i->response_token);
+ i->response_token = token;
+ return 0;
+ }
+
+ r = curl_header_strdup(header, sz, HEADER_DIGEST, &digest);
+ if (r < 0)
+ return log_oom();
+ if (r > 0) {
+ free(i->response_digest);
+ i->response_digest = digest;
+ return 0;
+ }
+
+ r = curl_header_strdup(header, sz, HEADER_REGISTRY, &registry);
+ if (r < 0)
+ return log_oom();
+ if (r > 0) {
+ char **l, **k;
+
+ l = strv_split(registry, ",");
+ if (!l)
+ return log_oom();
+
+ STRV_FOREACH(k, l) {
+ if (!hostname_is_valid(*k)) {
+ log_error("Registry hostname is not valid.");
+ strv_free(l);
+ return -EBADMSG;
+ }
+ }
+
+ strv_free(i->response_registries);
+ i->response_registries = l;
+ }
+
+ return 0;
+}
+
+static void dkr_pull_job_on_finished_v2(PullJob *j) {
+ DkrPull *i;
+ int r;
+
+ assert(j);
+ assert(j->userdata);
+
+ i = j->userdata;
+ if (j->error != 0) {
+ if (j == i->images_job)
+ log_error_errno(j->error, "Failed to retrieve images list. (Wrong index URL?)");
+ else if (j == i->ancestry_job)
+ log_error_errno(j->error, "Failed to retrieve manifest.");
+ else if (j == i->json_job)
+ log_error_errno(j->error, "Failed to retrieve json data.");
+ else
+ log_error_errno(j->error, "Failed to retrieve layer data.");
+
+ r = j->error;
+ goto finish;
+ }
+
+ if (i->images_job == j) {
+ const char *url;
+
+ assert(!i->tags_job);
+ assert(!i->ancestry_job);
+ assert(!i->json_job);
+ assert(!i->layer_job);
+
+ if (strv_isempty(i->response_registries)) {
+ r = -EBADMSG;
+ log_error("Didn't get registry information.");
+ goto finish;
+ }
+
+ log_info("Index lookup succeeded, directed to registry %s.", i->response_registries[0]);
+ dkr_pull_report_progress(i, DKR_RESOLVING);
+
+ url = strjoina(i->index_protocol, "auth.", i->index_address, "/v2/token/?scope=repository:",
+ i->name, ":pull&service=registry.", i->index_address);
+ r = pull_job_new(&i->tags_job, url, i->glue, i);
+ if (r < 0) {
+ log_error_errno(r, "Failed to allocate tags job: %m");
+ goto finish;
+ }
+
+ i->tags_job->on_finished = dkr_pull_job_on_finished_v2;
+ i->tags_job->on_progress = dkr_pull_job_on_progress;
+
+ r = pull_job_begin(i->tags_job);
+ if (r < 0) {
+ log_error_errno(r, "Failed to start tags job: %m");
+ goto finish;
+ }
+
+ } else if (i->tags_job == j) {
+ const char *url;
+ _cleanup_free_ const char *buf;
+ _cleanup_json_variant_unref_ JsonVariant *doc = NULL;
+ JsonVariant *e = NULL;
+
+ assert(!i->ancestry_job);
+ assert(!i->json_job);
+ assert(!i->layer_job);
+
+ buf = strndup((const char *)j->payload, j->payload_size);
+ if (!buf) {
+ r = -ENOMEM;
+ log_oom();
+ goto finish;
+ }
+
+ r = json_parse(buf, &doc);
+ if (r < 0) {
+ log_error("Unable to parse bearer token\n%s", j->payload);
+ goto finish;
+ }
+
+ e = json_variant_value(doc, "token");
+ if (!e || e->type != JSON_VARIANT_STRING) {
+ r = -EBADMSG;
+ log_error("Invalid JSON format for Bearer token");
+ goto finish;
+ }
+
+ r = free_and_strdup(&i->response_token, json_variant_string(e));
+ if (r < 0) {
+ log_oom();
+ goto finish;
+ }
+
+ url = strjoina(PROTOCOL_PREFIX, i->response_registries[0], "/v2/", i->name, "/manifests/", i->reference);
+ r = pull_job_new(&i->ancestry_job, url, i->glue, i);
+ if (r < 0) {
+ log_error_errno(r, "Failed to allocate ancestry job: %m");
+ goto finish;
+ }
+
+ r = dkr_pull_add_bearer_token(i, i->ancestry_job);
+ if (r < 0)
+ goto finish;
+
+ i->ancestry_job->on_finished = dkr_pull_job_on_finished_v2;
+ i->ancestry_job->on_progress = dkr_pull_job_on_progress;
+ i->ancestry_job->on_header = dkr_pull_job_on_header;
+
+
+ r = pull_job_begin(i->ancestry_job);
+ if (r < 0) {
+ log_error_errno(r, "Failed to start ancestry job: %m");
+ goto finish;
+ }
+
+ } else if (i->ancestry_job == j) {
+
+ _cleanup_json_variant_unref_ JsonVariant *doc = NULL, *compat = NULL;
+ JsonVariant *e = NULL;
+ _cleanup_strv_free_ char **ancestry = NULL;
+ size_t allocated = 0, size = 0;
+ char *path = NULL, **k = NULL;
+
+ r = json_parse((const char *)j->payload, &doc);
+ if (r < 0) {
+ log_error("Invalid JSON Manifest");
+ goto finish;
+ }
+
+ e = json_variant_value(doc, "fsLayers");
+ if (!e || e->type != JSON_VARIANT_ARRAY || e->size == 0) {
+ r = -EBADMSG;
+ goto finish;
+ }
+
+ log_info("JSON manifest with schema v%"PRIi64" for %s parsed!",
+ json_variant_integer(json_variant_value(doc, "schemaVersion")),
+ json_variant_string(json_variant_value(doc, "name")));
+
+ for (unsigned z = 0; z < e->size; z++) {
+ JsonVariant *f = json_variant_element(e, z), *g = NULL;
+ const char *layer;
+ if (f->type != JSON_VARIANT_OBJECT) {
+ r = -EBADMSG;
+ goto finish;
+ }
+
+ g = json_variant_value(f, "blobSum");
+
+ layer = json_variant_string(g);
+ if (!dkr_digest_is_valid(layer)) {
+ r = -EBADMSG;
+ goto finish;
+ }
+
+ if (!GREEDY_REALLOC(ancestry, allocated, size + 2)) {
+ r = -ENOMEM;
+ log_oom();
+ goto finish;
+ }
+
+ ancestry[size] = strdup(layer);
+ if (!ancestry[size]) {
+ r = -ENOMEM;
+ log_oom();
+ goto finish;
+ }
+
+ ancestry[size+1] = NULL;
+ size += 1;
+ }
+
+ e = json_variant_value(doc, "history");
+ if (!e || e->type != JSON_VARIANT_ARRAY) {
+ r = -EBADMSG;
+ goto finish;
+ }
+
+ e = json_variant_element(e, 0);
+ e = json_variant_value(e, "v1Compatibility");
+ r = json_parse(json_variant_string(e), &compat);
+ if (r < 0) {
+ log_error("Invalid v1Compatibility JSON");
+ goto finish;
+ }
+
+ e = json_variant_value(compat, "id");
+
+ strv_free(i->ancestry);
+ i->ancestry = strv_reverse(strv_uniq(ancestry));
+ i->n_ancestry = strv_length(i->ancestry);
+ i->current_ancestry = 0;
+ i->id = strdup(i->ancestry[i->n_ancestry - 1]);
+ if (!i->id) {
+ r = -ENOMEM;
+ log_oom();
+ goto finish;
+ }
+ path = strjoin(i->image_root, "/.dkr-", json_variant_string(e), NULL);
+ if (!path) {
+ r = -ENOMEM;
+ log_oom();
+ goto finish;
+ }
+ free(i->image_root);
+ i->image_root = path;
+ ancestry = NULL;
+
+ log_info("Required layers:\n");
+ STRV_FOREACH(k, i->ancestry)
+ log_info("\t%s", *k);
+ log_info("\nProvenance:\n\tImageID: %s\n\tDigest: %s", json_variant_string(e), i->response_digest);
+
+ dkr_pull_report_progress(i, DKR_DOWNLOADING);
+
+ r = dkr_pull_pull_layer_v2(i);
+ if (r < 0)
+ goto finish;
+
+ } else if (i->layer_job == j) {
+ assert(i->temp_path);
+ assert(i->final_path);
+
+ j->disk_fd = safe_close(j->disk_fd);
+
+ if (i->tar_pid > 0) {
+ r = wait_for_terminate_and_warn("tar", i->tar_pid, true);
+ i->tar_pid = 0;
+ if (r < 0)
+ goto finish;
+ }
+
+ r = aufs_resolve(i->temp_path);
+ if (r < 0) {
+ log_error_errno(r, "Failed to resolve aufs whiteouts: %m");
+ goto finish;
+ }
+
+ r = btrfs_subvol_set_read_only(i->temp_path, true);
+ if (r < 0) {
+ log_error_errno(r, "Failed to mark snapshot read-only: %m");
+ goto finish;
+ }
+
+ if (rename(i->temp_path, i->final_path) < 0) {
+ log_error_errno(errno, "Failed to rename snaphsot: %m");
+ goto finish;
+ }
+
+ log_info("Completed writing to layer %s.", i->final_path);
+
+ i->layer_job = pull_job_unref(i->layer_job);
+ free(i->temp_path);
+ i->temp_path = NULL;
+ free(i->final_path);
+ i->final_path = NULL;
+
+ i->current_ancestry ++;
+ r = dkr_pull_pull_layer_v2(i);
+ if (r < 0)
+ goto finish;
+
+ } else if (i->json_job != j)
+ assert_not_reached("Got finished event for unknown curl object");
+
+ if (!dkr_pull_is_done(i))
+ return;
+
+ dkr_pull_report_progress(i, DKR_COPYING);
+
+ r = dkr_pull_make_local_copy(i, DKR_PULL_V2);
+ if (r < 0)
+ goto finish;
+
+ r = 0;
+
+finish:
+ if (i->on_finished)
+ i->on_finished(i, r, i->userdata);
+ else
+ sd_event_exit(i->event, r);
+
+}
+
static void dkr_pull_job_on_finished(PullJob *j) {
DkrPull *i;
int r;
@@ -618,7 +1059,7 @@ static void dkr_pull_job_on_finished(PullJob *j) {
log_info("Index lookup succeeded, directed to registry %s.", i->response_registries[0]);
dkr_pull_report_progress(i, DKR_RESOLVING);
- url = strjoina(PROTOCOL_PREFIX, i->response_registries[0], "/v1/repositories/", i->name, "/tags/", i->tag);
+ url = strjoina(PROTOCOL_PREFIX, i->response_registries[0], "/v1/repositories/", i->name, "/tags/", i->reference);
r = pull_job_new(&i->tags_job, url, i->glue, i);
if (r < 0) {
log_error_errno(r, "Failed to allocate tags job: %m");
@@ -790,12 +1231,11 @@ static void dkr_pull_job_on_finished(PullJob *j) {
dkr_pull_report_progress(i, DKR_COPYING);
- r = dkr_pull_make_local_copy(i);
+ r = dkr_pull_make_local_copy(i, DKR_PULL_V1);
if (r < 0)
goto finish;
r = 0;
-
finish:
if (i->on_finished)
i->on_finished(i, r, i->userdata);
@@ -803,52 +1243,38 @@ finish:
sd_event_exit(i->event, r);
}
-static int dkr_pull_job_on_header(PullJob *j, const char *header, size_t sz) {
- _cleanup_free_ char *registry = NULL;
- char *token;
- DkrPull *i;
- int r;
-
- assert(j);
- assert(j->userdata);
+static int get_protocol_address(char **protocol, char **address, const char *url) {
+ const char *sep, *dot;
+ _cleanup_free_ char *a = NULL, *p = NULL;
- i = j->userdata;
+ sep = strstr(url, "://");
+ if (!sep)
+ return -EINVAL;
- r = curl_header_strdup(header, sz, HEADER_TOKEN, &token);
- if (r < 0)
- return log_oom();
- if (r > 0) {
- free(i->response_token);
- i->response_token = token;
- return 0;
- }
+ dot = strrchr(url, '.');
+ if (!dot)
+ return -EINVAL;
+ dot--;
- r = curl_header_strdup(header, sz, HEADER_REGISTRY, &registry);
- if (r < 0)
+ p = strndup(url, (sep - url) + 3);
+ if (!p)
return log_oom();
- if (r > 0) {
- char **l, **k;
- l = strv_split(registry, ",");
- if (!l)
- return log_oom();
+ while (dot > (sep + 3) && *dot != '.')
+ dot--;
- STRV_FOREACH(k, l) {
- if (!hostname_is_valid(*k)) {
- log_error("Registry hostname is not valid.");
- strv_free(l);
- return -EBADMSG;
- }
- }
+ a = strdup(dot + 1);
+ if (!a)
+ return log_oom();
- strv_free(i->response_registries);
- i->response_registries = l;
- }
+ *address = a;
+ *protocol = p;
+ a = p = NULL;
return 0;
}
-int dkr_pull_start(DkrPull *i, const char *name, const char *tag, const char *local, bool force_local) {
+int dkr_pull_start(DkrPull *i, const char *name, const char *reference, const char *local, bool force_local, DkrPullVersion version) {
const char *url;
int r;
@@ -857,7 +1283,7 @@ int dkr_pull_start(DkrPull *i, const char *name, const char *tag, const char *lo
if (!dkr_name_is_valid(name))
return -EINVAL;
- if (tag && !dkr_tag_is_valid(tag))
+ if (reference && !dkr_ref_is_valid(reference))
return -EINVAL;
if (local && !machine_name_is_valid(local))
@@ -866,8 +1292,14 @@ int dkr_pull_start(DkrPull *i, const char *name, const char *tag, const char *lo
if (i->images_job)
return -EBUSY;
- if (!tag)
- tag = "latest";
+ if (!reference)
+ reference = "latest";
+
+ free(i->index_protocol);
+ free(i->index_address);
+ r = get_protocol_address(&i->index_protocol, &i->index_address, i->index_url);
+ if (r < 0)
+ return r;
r = free_and_strdup(&i->local, local);
if (r < 0)
@@ -877,7 +1309,7 @@ int dkr_pull_start(DkrPull *i, const char *name, const char *tag, const char *lo
r = free_and_strdup(&i->name, name);
if (r < 0)
return r;
- r = free_and_strdup(&i->tag, tag);
+ r = free_and_strdup(&i->reference, reference);
if (r < 0)
return r;
@@ -891,7 +1323,11 @@ int dkr_pull_start(DkrPull *i, const char *name, const char *tag, const char *lo
if (r < 0)
return r;
- i->images_job->on_finished = dkr_pull_job_on_finished;
+ if (version == DKR_PULL_V1)
+ i->images_job->on_finished = dkr_pull_job_on_finished;
+ else
+ i->images_job->on_finished = dkr_pull_job_on_finished_v2;
+
i->images_job->on_header = dkr_pull_job_on_header;
i->images_job->on_progress = dkr_pull_job_on_progress;
diff --git a/src/import/pull-dkr.h b/src/import/pull-dkr.h
index 4c4b10c7ac..33d18cb394 100644
--- a/src/import/pull-dkr.h
+++ b/src/import/pull-dkr.h
@@ -24,6 +24,7 @@
#include "sd-event.h"
#include "util.h"
+typedef enum { DKR_PULL_V1, DKR_PULL_V2 } DkrPullVersion;
typedef struct DkrPull DkrPull;
typedef void (*DkrPullFinished)(DkrPull *pull, int error, void *userdata);
@@ -33,4 +34,4 @@ DkrPull* dkr_pull_unref(DkrPull *pull);
DEFINE_TRIVIAL_CLEANUP_FUNC(DkrPull*, dkr_pull_unref);
-int dkr_pull_start(DkrPull *pull, const char *name, const char *tag, const char *local, bool force_local);
+int dkr_pull_start(DkrPull *pull, const char *name, const char *tag, const char *local, bool force_local, DkrPullVersion version);
diff --git a/src/import/pull.c b/src/import/pull.c
index ef7b0359a7..eec4583868 100644
--- a/src/import/pull.c
+++ b/src/import/pull.c
@@ -25,6 +25,7 @@
#include "event-util.h"
#include "verbs.h"
#include "build.h"
+#include "signal-util.h"
#include "machine-image.h"
#include "import-util.h"
#include "pull-tar.h"
@@ -227,7 +228,7 @@ static void on_dkr_finished(DkrPull *pull, int error, void *userdata) {
static int pull_dkr(int argc, char *argv[], void *userdata) {
_cleanup_(dkr_pull_unrefp) DkrPull *pull = NULL;
_cleanup_event_unref_ sd_event *event = NULL;
- const char *name, *tag, *local;
+ const char *name, *reference, *local, *digest;
int r;
if (!arg_dkr_index_url) {
@@ -240,13 +241,19 @@ static int pull_dkr(int argc, char *argv[], void *userdata) {
return -EINVAL;
}
- tag = strchr(argv[1], ':');
- if (tag) {
- name = strndupa(argv[1], tag - argv[1]);
- tag++;
+ digest = strchr(argv[1], '@');
+ if (digest) {
+ reference = digest + 1;
+ name = strndupa(argv[1], digest - argv[1]);
+ }
+
+ reference = strchr(argv[1], ':');
+ if (reference) {
+ name = strndupa(argv[1], reference - argv[1]);
+ reference++;
} else {
name = argv[1];
- tag = "latest";
+ reference = "latest";
}
if (!dkr_name_is_valid(name)) {
@@ -254,8 +261,8 @@ static int pull_dkr(int argc, char *argv[], void *userdata) {
return -EINVAL;
}
- if (!dkr_tag_is_valid(tag)) {
- log_error("Tag name '%s' is not valid.", tag);
+ if (!dkr_ref_is_valid(reference)) {
+ log_error("Tag name '%s' is not valid.", reference);
return -EINVAL;
}
@@ -288,9 +295,9 @@ static int pull_dkr(int argc, char *argv[], void *userdata) {
}
}
- log_info("Pulling '%s' with tag '%s', saving as '%s'.", name, tag, local);
+ log_info("Pulling '%s' with reference '%s', saving as '%s'.", name, reference, local);
} else
- log_info("Pulling '%s' with tag '%s'.", name, tag);
+ log_info("Pulling '%s' with reference '%s'.", name, reference);
r = sd_event_default(&event);
if (r < 0)
@@ -304,7 +311,7 @@ static int pull_dkr(int argc, char *argv[], void *userdata) {
if (r < 0)
return log_error_errno(r, "Failed to allocate puller: %m");
- r = dkr_pull_start(pull, name, tag, local, arg_force);
+ r = dkr_pull_start(pull, name, reference, local, arg_force, DKR_PULL_V2);
if (r < 0)
return log_error_errno(r, "Failed to pull image: %m");
diff --git a/src/journal-remote/journal-remote.c b/src/journal-remote/journal-remote.c
index f87a939168..911e2a178b 100644
--- a/src/journal-remote/journal-remote.c
+++ b/src/journal-remote/journal-remote.c
@@ -30,6 +30,7 @@
#include <getopt.h>
#include "sd-daemon.h"
+#include "signal-util.h"
#include "journal-file.h"
#include "journald-native.h"
#include "socket-util.h"
diff --git a/src/journal-remote/journal-upload.c b/src/journal-remote/journal-upload.c
index ddbb8731e2..ddb1ef0396 100644
--- a/src/journal-remote/journal-upload.c
+++ b/src/journal-remote/journal-upload.c
@@ -33,8 +33,9 @@
#include "mkdir.h"
#include "conf-parser.h"
#include "sigbus.h"
-#include "journal-upload.h"
#include "formats-util.h"
+#include "signal-util.h"
+#include "journal-upload.h"
#define PRIV_KEY_FILE CERTIFICATE_ROOT "/private/journal-upload.pem"
#define CERT_FILE CERTIFICATE_ROOT "/certs/journal-upload.pem"
diff --git a/src/journal/coredumpctl.c b/src/journal/coredumpctl.c
index bcb0ff9c39..381bf72776 100644
--- a/src/journal/coredumpctl.c
+++ b/src/journal/coredumpctl.c
@@ -39,6 +39,7 @@
#include "sigbus.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
static enum {
ACTION_NONE,
diff --git a/src/journal/journald-audit.c b/src/journal/journald-audit.c
index 64395e1148..83c3332abf 100644
--- a/src/journal/journald-audit.c
+++ b/src/journal/journald-audit.c
@@ -534,9 +534,14 @@ int server_open_audit(Server *s) {
return 0;
}
- r = bind(s->audit_fd, &sa.sa, sizeof(sa.nl));
- if (r < 0)
- return log_error_errno(errno, "Failed to join audit multicast group: %m");
+ if (bind(s->audit_fd, &sa.sa, sizeof(sa.nl)) < 0) {
+ log_warning_errno(errno,
+ "Failed to join audit multicast group. "
+ "The kernel is probably too old or multicast reading is not supported. "
+ "Ignoring: %m");
+ s->audit_fd = safe_close(s->audit_fd);
+ return 0;
+ }
} else
fd_nonblock(s->audit_fd, 1);
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index b3a4b53080..3353024f4e 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -25,6 +25,10 @@
#include <sys/statvfs.h>
#include <sys/mman.h>
+#ifdef HAVE_SELINUX
+#include <selinux/selinux.h>
+#endif
+
#include <libudev.h>
#include "sd-journal.h"
@@ -43,6 +47,7 @@
#include "formats-util.h"
#include "process-util.h"
#include "hostname-util.h"
+#include "signal-util.h"
#include "journal-internal.h"
#include "journal-vacuum.h"
#include "journal-authenticate.h"
@@ -54,10 +59,6 @@
#include "journald-audit.h"
#include "journald-server.h"
-#ifdef HAVE_SELINUX
-#include <selinux/selinux.h>
-#endif
-
#define USER_JOURNALS_MAX 1024
#define DEFAULT_SYNC_INTERVAL_USEC (5*USEC_PER_MINUTE)
diff --git a/src/kernel-install/90-loaderentry.install b/src/kernel-install/90-loaderentry.install
index d433e00a5c..4c9b1f0327 100644
--- a/src/kernel-install/90-loaderentry.install
+++ b/src/kernel-install/90-loaderentry.install
@@ -43,14 +43,14 @@ fi
declare -a BOOT_OPTIONS
if [[ -f /etc/kernel/cmdline ]]; then
- readarray -t BOOT_OPTIONS < /etc/kernel/cmdline
+ read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
fi
if ! [[ ${BOOT_OPTIONS[*]} ]]; then
- read -a line -r < /proc/cmdline
+ read -r -d '' -a line < /proc/cmdline
for i in "${line[@]}"; do
[[ "${i#initrd=*}" != "$i" ]] && continue
- BOOT_OPTIONS[${#BOOT_OPTIONS[@]}]="$i"
+ BOOT_OPTIONS+=("$i")
done
fi
diff --git a/src/libsystemd-network/dhcp-identifier.c b/src/libsystemd-network/dhcp-identifier.c
index f7a1492363..70c68ad131 100644
--- a/src/libsystemd-network/dhcp-identifier.c
+++ b/src/libsystemd-network/dhcp-identifier.c
@@ -46,8 +46,9 @@ int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len) {
if (r < 0)
return r;
- duid->type = htobe16(DHCP6_DUID_EN);
- duid->en.pen = htobe32(SYSTEMD_PEN);
+ unaligned_write_be16(&duid->type, DHCP6_DUID_EN);
+ unaligned_write_be32(&duid->en.pen, SYSTEMD_PEN);
+
*len = sizeof(duid->type) + sizeof(duid->en);
/* a bit of snake-oil perhaps, but no need to expose the machine-id
@@ -58,7 +59,7 @@ int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len) {
}
-int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, uint32_t *_id) {
+int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, void *_id) {
/* name is a pointer to memory in the udev_device struct, so must
have the same scope */
_cleanup_udev_device_unref_ struct udev_device *device = NULL;
@@ -92,7 +93,7 @@ int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, uint32_t
siphash24((uint8_t*)&id, mac, mac_len, HASH_KEY.bytes);
/* fold into 32 bits */
- *_id = (id & 0xffffffff) ^ (id >> 32);
+ unaligned_write_be32(_id, (id & 0xffffffff) ^ (id >> 32));
return 0;
}
diff --git a/src/libsystemd-network/dhcp-identifier.h b/src/libsystemd-network/dhcp-identifier.h
index 643d4970d5..95117915f4 100644
--- a/src/libsystemd-network/dhcp-identifier.h
+++ b/src/libsystemd-network/dhcp-identifier.h
@@ -24,6 +24,7 @@
#include "macro.h"
#include "sparse-endian.h"
+#include "unaligned.h"
#include "sd-id128.h"
/* RFC 3315 section 9.1:
@@ -61,4 +62,4 @@ struct duid {
} _packed_;
int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len);
-int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, uint32_t *_id);
+int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, void *_id);
diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c
index 4b8763aab0..8a4220621b 100644
--- a/src/libsystemd-network/sd-dhcp-lease.c
+++ b/src/libsystemd-network/sd-dhcp-lease.c
@@ -672,7 +672,7 @@ int sd_dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
if (r >= 0) {
_cleanup_free_ char *client_id_hex;
- client_id_hex = hexmem (client_id, client_id_len);
+ client_id_hex = hexmem(client_id, client_id_len);
if (!client_id_hex) {
r = -ENOMEM;
goto finish;
diff --git a/src/libsystemd-terminal/evcat.c b/src/libsystemd-terminal/evcat.c
index d274225ed0..bfa166c489 100644
--- a/src/libsystemd-terminal/evcat.c
+++ b/src/libsystemd-terminal/evcat.c
@@ -35,19 +35,20 @@
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
-#include <systemd/sd-login.h>
#include <termios.h>
#include <unistd.h>
#include <xkbcommon/xkbcommon.h>
+#include "sd-bus.h"
+#include "sd-event.h"
+#include "sd-login.h"
#include "build.h"
#include "event-util.h"
-#include "idev.h"
#include "macro.h"
+#include "signal-util.h"
+#include "util.h"
+#include "idev.h"
#include "sysview.h"
#include "term-internal.h"
-#include "util.h"
typedef struct Evcat Evcat;
diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c
index 01a70fd320..4cee95f469 100644
--- a/src/libsystemd-terminal/grdev-drm.c
+++ b/src/libsystemd-terminal/grdev-drm.c
@@ -27,8 +27,6 @@
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/types.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
#include <unistd.h>
/* Yuck! DRM headers need system headers included first.. but we have to
@@ -37,12 +35,14 @@
#include <drm_fourcc.h>
#include <drm_mode.h>
-#include "bus-util.h"
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
-#include "grdev.h"
-#include "grdev-internal.h"
#include "macro.h"
#include "util.h"
+#include "bus-util.h"
+#include "grdev.h"
+#include "grdev-internal.h"
#define GRDRM_MAX_TRIES (16)
diff --git a/src/libsystemd-terminal/grdev-internal.h b/src/libsystemd-terminal/grdev-internal.h
index f455dd4172..46d65f0248 100644
--- a/src/libsystemd-terminal/grdev-internal.h
+++ b/src/libsystemd-terminal/grdev-internal.h
@@ -25,12 +25,12 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
-#include "grdev.h"
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
#include "list.h"
#include "util.h"
+#include "grdev.h"
typedef struct grdev_tile grdev_tile;
typedef struct grdev_display_cache grdev_display_cache;
diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c
index feed579295..c386e65982 100644
--- a/src/libsystemd-terminal/grdev.c
+++ b/src/libsystemd-terminal/grdev.c
@@ -22,14 +22,14 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
-#include "grdev.h"
-#include "grdev-internal.h"
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
#include "login-shared.h"
#include "macro.h"
#include "util.h"
+#include "grdev.h"
+#include "grdev-internal.h"
static void pipe_enable(grdev_pipe *pipe);
static void pipe_disable(grdev_pipe *pipe);
diff --git a/src/libsystemd-terminal/grdev.h b/src/libsystemd-terminal/grdev.h
index db2a508fd8..110d24e6d5 100644
--- a/src/libsystemd-terminal/grdev.h
+++ b/src/libsystemd-terminal/grdev.h
@@ -56,8 +56,8 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
+#include "sd-bus.h"
+#include "sd-event.h"
#include "util.h"
typedef struct grdev_fb grdev_fb;
diff --git a/src/libsystemd-terminal/idev-evdev.c b/src/libsystemd-terminal/idev-evdev.c
index 64e703eb67..f1a18b91d3 100644
--- a/src/libsystemd-terminal/idev-evdev.c
+++ b/src/libsystemd-terminal/idev-evdev.c
@@ -24,13 +24,13 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
+#include "sd-bus.h"
+#include "sd-event.h"
+#include "macro.h"
+#include "util.h"
#include "bus-util.h"
#include "idev.h"
#include "idev-internal.h"
-#include "macro.h"
-#include "util.h"
typedef struct idev_evdev idev_evdev;
typedef struct unmanaged_evdev unmanaged_evdev;
diff --git a/src/libsystemd-terminal/idev-internal.h b/src/libsystemd-terminal/idev-internal.h
index a159aef211..a02a16c408 100644
--- a/src/libsystemd-terminal/idev-internal.h
+++ b/src/libsystemd-terminal/idev-internal.h
@@ -26,13 +26,13 @@
#include <linux/input.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
#include <xkbcommon/xkbcommon.h>
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
-#include "idev.h"
#include "list.h"
#include "util.h"
+#include "idev.h"
typedef struct idev_link idev_link;
typedef struct idev_device_vtable idev_device_vtable;
diff --git a/src/libsystemd-terminal/idev-keyboard.c b/src/libsystemd-terminal/idev-keyboard.c
index ef56ee2482..93f49e9458 100644
--- a/src/libsystemd-terminal/idev-keyboard.c
+++ b/src/libsystemd-terminal/idev-keyboard.c
@@ -21,17 +21,17 @@
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-compose.h>
-#include "bus-util.h"
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
+#include "macro.h"
+#include "util.h"
+#include "bus-util.h"
#include "idev.h"
#include "idev-internal.h"
-#include "macro.h"
#include "term-internal.h"
-#include "util.h"
typedef struct kbdtbl kbdtbl;
typedef struct kbdmap kbdmap;
diff --git a/src/libsystemd-terminal/idev.c b/src/libsystemd-terminal/idev.c
index 0ba2b28ab7..b187934977 100644
--- a/src/libsystemd-terminal/idev.c
+++ b/src/libsystemd-terminal/idev.c
@@ -22,14 +22,14 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
-#include "idev.h"
-#include "idev-internal.h"
#include "login-shared.h"
#include "macro.h"
#include "util.h"
+#include "idev.h"
+#include "idev-internal.h"
static void element_open(idev_element *e);
static void element_close(idev_element *e);
diff --git a/src/libsystemd-terminal/idev.h b/src/libsystemd-terminal/idev.h
index 0e846179e6..241677cbbe 100644
--- a/src/libsystemd-terminal/idev.h
+++ b/src/libsystemd-terminal/idev.h
@@ -28,9 +28,9 @@
#include <libudev.h>
#include <linux/input.h>
#include <stdbool.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
#include <xkbcommon/xkbcommon.h>
+#include "sd-bus.h"
+#include "sd-event.h"
typedef struct idev_data idev_data;
typedef struct idev_data_evdev idev_data_evdev;
diff --git a/src/libsystemd-terminal/modeset.c b/src/libsystemd-terminal/modeset.c
index 621d6c4fa3..f3a60e1fb0 100644
--- a/src/libsystemd-terminal/modeset.c
+++ b/src/libsystemd-terminal/modeset.c
@@ -35,18 +35,18 @@
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
-#include <systemd/sd-login.h>
#include <termios.h>
#include <unistd.h>
-
+#include "sd-bus.h"
+#include "sd-event.h"
+#include "sd-login.h"
#include "build.h"
-#include "grdev.h"
#include "macro.h"
-#include "sysview.h"
-#include "util.h"
#include "random-util.h"
+#include "signal-util.h"
+#include "util.h"
+#include "grdev.h"
+#include "sysview.h"
typedef struct Modeset Modeset;
diff --git a/src/libsystemd-terminal/subterm.c b/src/libsystemd-terminal/subterm.c
index 983a2a14ab..d10e2f549f 100644
--- a/src/libsystemd-terminal/subterm.c
+++ b/src/libsystemd-terminal/subterm.c
@@ -34,13 +34,14 @@
#include <string.h>
#include <sys/ioctl.h>
#include <termios.h>
+#include "sd-event.h"
#include "macro.h"
#include "pty.h"
#include "ring.h"
-#include "sd-event.h"
-#include "term-internal.h"
-#include "util.h"
+#include "signal-util.h"
#include "utf8.h"
+#include "util.h"
+#include "term-internal.h"
typedef struct Output Output;
typedef struct Terminal Terminal;
diff --git a/src/libsystemd-terminal/sysview-internal.h b/src/libsystemd-terminal/sysview-internal.h
index f1fd4b5f53..251c8d7300 100644
--- a/src/libsystemd-terminal/sysview-internal.h
+++ b/src/libsystemd-terminal/sysview-internal.h
@@ -25,13 +25,13 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
+#include "sd-bus.h"
+#include "sd-event.h"
#include "hashmap.h"
#include "list.h"
#include "macro.h"
-#include "sysview.h"
#include "util.h"
+#include "sysview.h"
/*
* Devices
diff --git a/src/libsystemd-terminal/sysview.c b/src/libsystemd-terminal/sysview.c
index 1e13167a79..c8bbce43d3 100644
--- a/src/libsystemd-terminal/sysview.c
+++ b/src/libsystemd-terminal/sysview.c
@@ -23,15 +23,15 @@
#include <libudev.h>
#include <stdbool.h>
#include <stdlib.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
-#include <systemd/sd-login.h>
-#include "bus-util.h"
+#include "sd-bus.h"
+#include "sd-event.h"
+#include "sd-login.h"
#include "macro.h"
-#include "sysview.h"
-#include "sysview-internal.h"
#include "udev-util.h"
#include "util.h"
+#include "bus-util.h"
+#include "sysview.h"
+#include "sysview-internal.h"
static int context_raise_session_control(sysview_context *c, sysview_session *session, int error);
diff --git a/src/libsystemd-terminal/sysview.h b/src/libsystemd-terminal/sysview.h
index 71e56e7ebf..a5e7a38df3 100644
--- a/src/libsystemd-terminal/sysview.h
+++ b/src/libsystemd-terminal/sysview.h
@@ -37,8 +37,8 @@
#pragma once
#include <stdbool.h>
-#include <systemd/sd-bus.h>
-#include <systemd/sd-event.h>
+#include "sd-bus.h"
+#include "sd-event.h"
typedef struct sysview_event sysview_event;
typedef struct sysview_device sysview_device;
diff --git a/src/libsystemd/libsystemd.sym.m4 b/src/libsystemd/libsystemd.sym.m4
index b443c3cfba..0b94a87dd6 100644
--- a/src/libsystemd/libsystemd.sym.m4
+++ b/src/libsystemd/libsystemd.sym.m4
@@ -169,8 +169,7 @@ global:
sd_peer_get_user_slice;
} LIBSYSTEMD_219;
-m4_ifdef(`ENABLE_KDBUS',
-LIBSYSTEMD_FUTURE {
+LIBSYSTEMD_221 {
global:
/* sd-bus */
sd_bus_default;
@@ -185,27 +184,36 @@ global:
sd_bus_set_address;
sd_bus_set_fd;
sd_bus_set_exec;
+ sd_bus_get_address;
sd_bus_set_bus_client;
+ sd_bus_is_bus_client;
sd_bus_set_server;
+ sd_bus_is_server;
sd_bus_set_anonymous;
+ sd_bus_is_anonymous;
sd_bus_set_trusted;
+ sd_bus_is_trusted;
sd_bus_set_monitor;
+ sd_bus_is_monitor;
sd_bus_set_description;
+ sd_bus_get_description;
+ sd_bus_negotiate_creds;
+ sd_bus_negotiate_timestamp;
+ sd_bus_negotiate_fds;
+ sd_bus_can_send;
+ sd_bus_get_creds_mask;
sd_bus_set_allow_interactive_authorization;
sd_bus_get_allow_interactive_authorization;
- sd_bus_negotiate_fds;
- sd_bus_negotiate_timestamp;
- sd_bus_negotiate_creds;
sd_bus_start;
sd_bus_close;
sd_bus_try_close;
sd_bus_ref;
sd_bus_unref;
sd_bus_is_open;
- sd_bus_can_send;
sd_bus_get_bus_id;
+ sd_bus_get_scope;
+ sd_bus_get_tid;
sd_bus_get_owner_creds;
- sd_bus_get_description;
sd_bus_send;
sd_bus_send_to;
sd_bus_call;
@@ -217,9 +225,10 @@ global:
sd_bus_process_priority;
sd_bus_wait;
sd_bus_flush;
- sd_bus_get_current_message;
sd_bus_get_current_slot;
- sd_bus_get_tid;
+ sd_bus_get_current_message;
+ sd_bus_get_current_handler;
+ sd_bus_get_current_userdata;
sd_bus_attach_event;
sd_bus_detach_event;
sd_bus_get_event;
@@ -239,6 +248,8 @@ global:
sd_bus_slot_get_description;
sd_bus_slot_set_description;
sd_bus_slot_get_current_message;
+ sd_bus_slot_get_current_handler;
+ sd_bus_slot_get_current_userdata;
sd_bus_message_new_signal;
sd_bus_message_new_method_call;
sd_bus_message_new_method_return;
@@ -248,13 +259,13 @@ global:
sd_bus_message_new_method_errnof;
sd_bus_message_ref;
sd_bus_message_unref;
- sd_bus_message_get_bus;
sd_bus_message_get_type;
sd_bus_message_get_cookie;
sd_bus_message_get_reply_cookie;
+ sd_bus_message_get_priority;
sd_bus_message_get_expect_reply;
sd_bus_message_get_auto_start;
- sd_bus_message_get_priority;
+ sd_bus_message_get_allow_interactive_authorization;
sd_bus_message_get_signature;
sd_bus_message_get_path;
sd_bus_message_get_interface;
@@ -266,13 +277,16 @@ global:
sd_bus_message_get_monotonic_usec;
sd_bus_message_get_realtime_usec;
sd_bus_message_get_seqnum;
+ sd_bus_message_get_bus;
sd_bus_message_get_creds;
- sd_bus_message_is_empty;
sd_bus_message_is_signal;
sd_bus_message_is_method_call;
sd_bus_message_is_method_error;
+ sd_bus_message_is_empty;
+ sd_bus_message_has_signature;
sd_bus_message_set_expect_reply;
sd_bus_message_set_auto_start;
+ sd_bus_message_set_allow_interactive_authorization;
sd_bus_message_set_destination;
sd_bus_message_set_priority;
sd_bus_message_append;
@@ -324,6 +338,7 @@ global:
sd_bus_emit_interfaces_removed_strv;
sd_bus_emit_interfaces_removed;
sd_bus_query_sender_creds;
+ sd_bus_query_sender_privilege;
sd_bus_creds_new_from_pid;
sd_bus_creds_ref;
sd_bus_creds_unref;
@@ -374,6 +389,7 @@ global:
sd_bus_error_copy;
sd_bus_error_is_set;
sd_bus_error_has_name;
+ sd_bus_error_add_map;
sd_bus_path_encode;
sd_bus_path_decode;
sd_bus_track_new;
@@ -401,9 +417,10 @@ global:
sd_event_add_signal;
sd_event_add_child;
sd_event_add_defer;
+ sd_event_add_post;
sd_event_add_exit;
- sd_event_wait;
sd_event_prepare;
+ sd_event_wait;
sd_event_dispatch;
sd_event_run;
sd_event_loop;
@@ -417,6 +434,9 @@ global:
sd_event_get_watchdog;
sd_event_source_ref;
sd_event_source_unref;
+ sd_event_source_get_event;
+ sd_event_source_get_userdata;
+ sd_event_source_set_userdata;
sd_event_source_set_description;
sd_event_source_get_description;
sd_event_source_set_prepare;
@@ -425,8 +445,6 @@ global:
sd_event_source_set_priority;
sd_event_source_get_enabled;
sd_event_source_set_enabled;
- sd_event_source_get_userdata;
- sd_event_source_set_userdata;
sd_event_source_get_io_fd;
sd_event_source_set_io_fd;
sd_event_source_get_io_events;
@@ -439,8 +457,11 @@ global:
sd_event_source_get_time_clock;
sd_event_source_get_signal;
sd_event_source_get_child_pid;
- sd_event_source_get_event;
+} LIBSYSTEMD_220;
+m4_ifdef(`ENABLE_KDBUS',
+LIBSYSTEMD_FUTURE {
+global:
/* sd-utf8 */
sd_utf8_is_valid;
sd_ascii_is_valid;
diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
index fa4c28174d..43ddfc651d 100644
--- a/src/libsystemd/sd-bus/bus-control.c
+++ b/src/libsystemd/sd-bus/bus-control.c
@@ -429,7 +429,7 @@ static int bus_populate_creds_from_items(
c->mask |= SD_BUS_CREDS_PPID;
} else if (item->pids.pid == 1) {
/* The structure doesn't
- * really distuingish the case
+ * really distinguish the case
* where a process has no
* parent and where we don't
* know it because it could
diff --git a/src/libsystemd/sd-bus/bus-creds.c b/src/libsystemd/sd-bus/bus-creds.c
index fed66823c7..4d67619cf8 100644
--- a/src/libsystemd/sd-bus/bus-creds.c
+++ b/src/libsystemd/sd-bus/bus-creds.c
@@ -303,7 +303,7 @@ _public_ int sd_bus_creds_get_ppid(sd_bus_creds *c, pid_t *ppid) {
if (!(c->mask & SD_BUS_CREDS_PPID))
return -ENODATA;
- /* PID 1 has no parent process. Let's distuingish the case of
+ /* PID 1 has no parent process. Let's distinguish the case of
* not knowing and not having a parent process by the returned
* error code. */
if (c->ppid == 0)
@@ -989,7 +989,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
if (missing & SD_BUS_CREDS_EXE) {
r = get_process_exe(pid, &c->exe);
if (r == -ESRCH) {
- /* Unfortunately we cannot really distuingish
+ /* Unfortunately we cannot really distinguish
* the case here where the process does not
* exist, and /proc/$PID/exe being unreadable
* because $PID is a kernel thread. Hence,
@@ -1101,7 +1101,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
}
/* In case only the exe path was to be read we cannot
- * distuingish the case where the exe path was unreadable
+ * distinguish the case where the exe path was unreadable
* because the process was a kernel thread, or when the
* process didn't exist at all. Hence, let's do a final check,
* to be sure. */
diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
index 24b9c4d117..4fffc6581d 100644
--- a/src/libsystemd/sd-bus/bus-socket.c
+++ b/src/libsystemd/sd-bus/bus-socket.c
@@ -24,12 +24,13 @@
#include <unistd.h>
#include <poll.h>
+#include "sd-daemon.h"
#include "util.h"
#include "macro.h"
#include "missing.h"
#include "utf8.h"
-#include "sd-daemon.h"
#include "formats-util.h"
+#include "signal-util.h"
#include "sd-bus.h"
#include "bus-socket.h"
@@ -492,7 +493,7 @@ static int bus_socket_auth_verify(sd_bus *b) {
static int bus_socket_read_auth(sd_bus *b) {
struct msghdr mh;
- struct iovec iov;
+ struct iovec iov = {};
size_t n;
ssize_t k;
int r;
@@ -527,7 +528,6 @@ static int bus_socket_read_auth(sd_bus *b) {
b->rbuffer = p;
- zero(iov);
iov.iov_base = (uint8_t*) b->rbuffer + b->rbuffer_size;
iov.iov_len = n - b->rbuffer_size;
@@ -808,23 +808,21 @@ int bus_socket_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
if (bus->prefer_writev)
k = writev(bus->output_fd, iov, m->n_iovec);
else {
- struct msghdr mh;
- zero(mh);
+ struct msghdr mh = {
+ .msg_iov = iov,
+ .msg_iovlen = m->n_iovec,
+ };
if (m->n_fds > 0) {
struct cmsghdr *control;
- control = alloca(CMSG_SPACE(sizeof(int) * m->n_fds));
- mh.msg_control = control;
+ mh.msg_control = control = alloca(CMSG_SPACE(sizeof(int) * m->n_fds));
+ mh.msg_controllen = control->cmsg_len = CMSG_LEN(sizeof(int) * m->n_fds);
control->cmsg_level = SOL_SOCKET;
control->cmsg_type = SCM_RIGHTS;
- mh.msg_controllen = control->cmsg_len = CMSG_LEN(sizeof(int) * m->n_fds);
memcpy(CMSG_DATA(control), m->fds, sizeof(int) * m->n_fds);
}
- mh.msg_iov = iov;
- mh.msg_iovlen = m->n_iovec;
-
k = sendmsg(bus->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
if (k < 0 && errno == ENOTSOCK) {
bus->prefer_writev = true;
@@ -936,7 +934,7 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) {
int bus_socket_read_message(sd_bus *bus) {
struct msghdr mh;
- struct iovec iov;
+ struct iovec iov = {};
ssize_t k;
size_t need;
int r;
@@ -966,7 +964,6 @@ int bus_socket_read_message(sd_bus *bus) {
bus->rbuffer = b;
- zero(iov);
iov.iov_base = (uint8_t*) bus->rbuffer + bus->rbuffer_size;
iov.iov_len = need - bus->rbuffer_size;
diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c
index 5e375af206..99937799b3 100644
--- a/src/libsystemd/sd-bus/bus-util.c
+++ b/src/libsystemd/sd-bus/bus-util.c
@@ -30,6 +30,7 @@
#include "path-util.h"
#include "missing.h"
#include "set.h"
+#include "signal-util.h"
#include "unit-name.h"
#include "sd-bus.h"
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
index 214b3d04df..edc27aef87 100644
--- a/src/libsystemd/sd-bus/sd-bus.c
+++ b/src/libsystemd/sd-bus/sd-bus.c
@@ -3513,7 +3513,7 @@ _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
return -ENODATA;
}
-int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
+_public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
assert_return(bus, -EINVAL);
assert_return(mask, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
@@ -3522,35 +3522,35 @@ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
return 0;
}
-int sd_bus_is_bus_client(sd_bus *bus) {
+_public_ int sd_bus_is_bus_client(sd_bus *bus) {
assert_return(bus, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
return bus->bus_client;
}
-int sd_bus_is_server(sd_bus *bus) {
+_public_ int sd_bus_is_server(sd_bus *bus) {
assert_return(bus, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
return bus->is_server;
}
-int sd_bus_is_anonymous(sd_bus *bus) {
+_public_ int sd_bus_is_anonymous(sd_bus *bus) {
assert_return(bus, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
return bus->anonymous_auth;
}
-int sd_bus_is_trusted(sd_bus *bus) {
+_public_ int sd_bus_is_trusted(sd_bus *bus) {
assert_return(bus, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
return bus->trusted;
}
-int sd_bus_is_monitor(sd_bus *bus) {
+_public_ int sd_bus_is_monitor(sd_bus *bus) {
assert_return(bus, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c
index 4de36d54e1..3692d46e06 100644
--- a/src/libsystemd/sd-device/device-enumerator.c
+++ b/src/libsystemd/sd-device/device-enumerator.c
@@ -367,11 +367,11 @@ static bool match_sysattr(sd_device_enumerator *enumerator, sd_device *device) {
assert(enumerator);
assert(device);
- HASHMAP_FOREACH_KEY(sysattr, value, enumerator->nomatch_sysattr, i)
+ HASHMAP_FOREACH_KEY(value, sysattr, enumerator->nomatch_sysattr, i)
if (match_sysattr_value(device, sysattr, value))
return false;
- HASHMAP_FOREACH_KEY(sysattr, value, enumerator->match_sysattr, i)
+ HASHMAP_FOREACH_KEY(value, sysattr, enumerator->match_sysattr, i)
if (!match_sysattr_value(device, sysattr, value))
return false;
@@ -389,7 +389,7 @@ static bool match_property(sd_device_enumerator *enumerator, sd_device *device)
if (hashmap_isempty(enumerator->match_property))
return true;
- HASHMAP_FOREACH_KEY(property, value, enumerator->match_property, i) {
+ HASHMAP_FOREACH_KEY(value, property, enumerator->match_property, i) {
const char *property_dev, *value_dev;
FOREACH_DEVICE_PROPERTY(device, property_dev, value_dev) {
@@ -764,9 +764,9 @@ static int parent_crawl_children(sd_device_enumerator *enumerator, const char *p
if (dent->d_type != DT_DIR)
continue;
- k = asprintf(&child, "%s/%s", path, dent->d_name);
- if (k < 0)
- return -errno;
+ child = strjoin(path, "/", dent->d_name, NULL);
+ if (!child)
+ return -ENOMEM;
k = parent_add_child(enumerator, child);
if (k < 0)
diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c
index 3cadedbf4a..2e60433246 100644
--- a/src/libsystemd/sd-device/device-private.c
+++ b/src/libsystemd/sd-device/device-private.c
@@ -636,10 +636,10 @@ int device_new_from_nulstr(sd_device **ret, uint8_t *nulstr, size_t len) {
static int device_update_properties_bufs(sd_device *device) {
const char *val, *prop;
- char **buf_strv = NULL;
- uint8_t *buf_nulstr = NULL;
- size_t allocated_nulstr = 0, allocated_strv = 0;
- size_t nulstr_len = 0, strv_size = 0;
+ _cleanup_free_ char **buf_strv = NULL;
+ _cleanup_free_ uint8_t *buf_nulstr = NULL;
+ size_t allocated_nulstr = 0;
+ size_t nulstr_len = 0, num = 0, i = 0;
assert(device);
@@ -655,20 +655,29 @@ static int device_update_properties_bufs(sd_device *device) {
if (!buf_nulstr)
return -ENOMEM;
- buf_strv = GREEDY_REALLOC0(buf_strv, allocated_strv, strv_size + 2);
- if (!buf_strv)
- return -ENOMEM;
-
- buf_strv[++ strv_size] = (char *)&buf_nulstr[nulstr_len];
strscpyl((char *)buf_nulstr + nulstr_len, len + 1, prop, "=", val, NULL);
nulstr_len += len + 1;
+ ++num;
+ }
+
+ /* build buf_strv from buf_nulstr */
+ buf_strv = new0(char *, num + 1);
+ if (!buf_strv)
+ return -ENOMEM;
+
+ NULSTR_FOREACH(val, (char*) buf_nulstr) {
+ buf_strv[i] = (char *) val;
+ assert(i < num);
+ i++;
}
free(device->properties_nulstr);
- free(device->properties_strv);
device->properties_nulstr = buf_nulstr;
+ buf_nulstr = NULL;
device->properties_nulstr_len = nulstr_len;
+ free(device->properties_strv);
device->properties_strv = buf_strv;
+ buf_strv = NULL;
device->properties_buf_outdated = false;
diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c
index 691b9c6327..97da4a8eea 100644
--- a/src/libsystemd/sd-device/sd-device.c
+++ b/src/libsystemd/sd-device/sd-device.c
@@ -1193,12 +1193,12 @@ int device_get_id_filename(sd_device *device, const char **ret) {
streq(subsystem, "block") ? 'b' : 'c',
major(devnum), minor(devnum));
if (r < 0)
- return -errno;
+ return -ENOMEM;
} else if (ifindex > 0) {
/* use netdev ifindex -- n3 */
r = asprintf(&id, "n%u", ifindex);
if (r < 0)
- return -errno;
+ return -ENOMEM;
} else {
/* use $subsys:$sysname -- pci:0000:00:1f.2
* sysname() has '!' translated, get it from devpath
@@ -1211,7 +1211,7 @@ int device_get_id_filename(sd_device *device, const char **ret) {
r = asprintf(&id, "+%s:%s", subsystem, sysname);
if (r < 0)
- return -errno;
+ return -ENOMEM;
}
device->id_filename = id;
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
index 0dc4680376..cc8bc50c04 100644
--- a/src/libsystemd/sd-event/sd-event.c
+++ b/src/libsystemd/sd-event/sd-event.c
@@ -33,6 +33,7 @@
#include "missing.h"
#include "set.h"
#include "list.h"
+#include "signal-util.h"
#include "sd-event.h"
diff --git a/src/libsystemd/sd-event/test-event.c b/src/libsystemd/sd-event/test-event.c
index 721700be7b..94e98e0077 100644
--- a/src/libsystemd/sd-event/test-event.c
+++ b/src/libsystemd/sd-event/test-event.c
@@ -23,6 +23,7 @@
#include "log.h"
#include "util.h"
#include "macro.h"
+#include "signal-util.h"
static int prepare_handler(sd_event_source *s, void *userdata) {
log_info("preparing %c", PTR_TO_INT(userdata));
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index 4a5a618472..02d240c704 100644
--- a/src/login/loginctl.c
+++ b/src/login/loginctl.c
@@ -43,6 +43,7 @@
#include "verbs.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
static char **arg_property = NULL;
static bool arg_all = false;
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 1f5cf865b1..10a9df0961 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1964,6 +1964,11 @@ static int method_cancel_scheduled_shutdown(sd_bus_message *message, void *userd
m->scheduled_shutdown_type = NULL;
m->scheduled_shutdown_timeout = 0;
+ if (m->unlink_nologin) {
+ (void) unlink("/run/nologin");
+ m->unlink_nologin = false;
+ }
+
if (cancelled) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
const char *tty = NULL;
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index 71bff96728..dc3db9abda 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -320,7 +320,7 @@ static int user_mkdir_runtime_path(User *u) {
} else
p = u->runtime_path;
- if (path_is_mount_point(p, false) <= 0) {
+ if (path_is_mount_point(p, 0) <= 0) {
_cleanup_free_ char *t = NULL;
(void) mkdir(p, 0700);
diff --git a/src/login/logind.c b/src/login/logind.c
index 7520f1345b..00f8dbdab2 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -30,9 +30,10 @@
#include "conf-parser.h"
#include "bus-util.h"
#include "bus-error.h"
-#include "logind.h"
#include "udev-util.h"
#include "formats-util.h"
+#include "signal-util.h"
+#include "logind.h"
static void manager_free(Manager *m);
@@ -170,7 +171,7 @@ static void manager_free(Manager *m) {
udev_unref(m->udev);
if (m->unlink_nologin)
- unlink("/run/nologin");
+ (void) unlink("/run/nologin");
bus_verify_polkit_async_registry_free(m->polkit_registry);
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index b21a33941a..c86c36c2de 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -54,6 +54,7 @@
#include "import-util.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
static char **arg_property = NULL;
static bool arg_all = false;
diff --git a/src/machine/machined.c b/src/machine/machined.c
index 1e862ad8f2..754c770040 100644
--- a/src/machine/machined.c
+++ b/src/machine/machined.c
@@ -28,9 +28,10 @@
#include "bus-util.h"
#include "bus-error.h"
#include "label.h"
+#include "formats-util.h"
+#include "signal-util.h"
#include "machine-image.h"
#include "machined.h"
-#include "formats-util.h"
Manager *manager_new(void) {
Manager *m;
diff --git a/src/network/networkctl.c b/src/network/networkctl.c
index 69b4ab4a5c..3454394977 100644
--- a/src/network/networkctl.c
+++ b/src/network/networkctl.c
@@ -62,7 +62,7 @@ static int link_get_type_string(int iftype, sd_device *d, char **ret) {
assert(ret);
if (iftype == ARPHRD_ETHER && d) {
- const char *devtype, *id = NULL;
+ const char *devtype = NULL, *id = NULL;
/* WLANs have iftype ARPHRD_ETHER, but we want
* to show a more useful type string for
* them */
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 8b0de1f741..f039a2d687 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1010,27 +1010,30 @@ static int link_up(Link *link) {
if (r < 0)
return log_link_error_errno(link, r, "Could not open IFLA_AF_SPEC container: %m");
- r = sd_rtnl_message_open_container(req, AF_INET6);
- if (r < 0)
- return log_link_error_errno(link, r, "Could not open AF_INET6 container: %m");
+ if (socket_ipv6_is_supported()) {
+ /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
+ r = sd_rtnl_message_open_container(req, AF_INET6);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not open AF_INET6 container: %m");
- ipv6ll_mode = link_ipv6ll_enabled(link) ? IN6_ADDR_GEN_MODE_EUI64 : IN6_ADDR_GEN_MODE_NONE;
- r = sd_rtnl_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
- if (r < 0)
- return log_link_error_errno(link, r, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
+ ipv6ll_mode = link_ipv6ll_enabled(link) ? IN6_ADDR_GEN_MODE_EUI64 : IN6_ADDR_GEN_MODE_NONE;
+ r = sd_rtnl_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
+
+ if (!in_addr_is_null(AF_INET6, &link->network->ipv6_token)) {
+ r = sd_rtnl_message_append_in6_addr(req, IFLA_INET6_TOKEN, &link->network->ipv6_token.in6);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not append IFLA_INET6_TOKEN: %m");
+ }
- if (!in_addr_is_null(AF_INET6, &link->network->ipv6_token)) {
- r = sd_rtnl_message_append_in6_addr(req, IFLA_INET6_TOKEN, &link->network->ipv6_token.in6);
+ r = sd_rtnl_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not append IFLA_INET6_TOKEN: %m");
+ return log_link_error_errno(link, r, "Could not close AF_INET6 container: %m");
}
r = sd_rtnl_message_close_container(req);
if (r < 0)
- return log_link_error_errno(link, r, "Could not close AF_INET6 container: %m");
-
- r = sd_rtnl_message_close_container(req);
- if (r < 0)
return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
diff --git a/src/network/networkd-wait-online.c b/src/network/networkd-wait-online.c
index f0ca6def87..6a96f1de55 100644
--- a/src/network/networkd-wait-online.c
+++ b/src/network/networkd-wait-online.c
@@ -21,11 +21,10 @@
#include <getopt.h>
#include "sd-daemon.h"
-
-#include "networkd-wait-online.h"
-
#include "strv.h"
#include "build.h"
+#include "signal-util.h"
+#include "networkd-wait-online.h"
static bool arg_quiet = false;
static usec_t arg_timeout = 120 * USEC_PER_SEC;
diff --git a/src/network/networkd.c b/src/network/networkd.c
index 543a4e4d95..41ec7cf904 100644
--- a/src/network/networkd.c
+++ b/src/network/networkd.c
@@ -19,9 +19,9 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
-#include "capability.h"
#include "sd-daemon.h"
-
+#include "capability.h"
+#include "signal-util.h"
#include "networkd.h"
int main(int argc, char *argv[]) {
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index a38f47dd0a..4211a3d779 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -96,6 +96,7 @@
#include "process-util.h"
#include "terminal-util.h"
#include "hostname-util.h"
+#include "signal-util.h"
#ifdef HAVE_SECCOMP
#include "seccomp-util.h"
@@ -195,7 +196,7 @@ static char **arg_network_macvlan = NULL;
static char **arg_network_ipvlan = NULL;
static bool arg_network_veth = false;
static const char *arg_network_bridge = NULL;
-static unsigned long arg_personality = 0xffffffffLU;
+static unsigned long arg_personality = PERSONALITY_INVALID;
static char *arg_image = NULL;
static Volatile arg_volatile = VOLATILE_NO;
static ExposePort *arg_expose_ports = NULL;
@@ -222,6 +223,8 @@ static void help(void) {
" --uuid=UUID Set a specific machine UUID for the container\n"
" -S --slice=SLICE Place the container in the specified slice\n"
" --property=NAME=VALUE Set scope unit property\n"
+ " --private-users[=UIDBASE[:NUIDS]]\n"
+ " Run within user namespace\n"
" --private-network Disable network in container\n"
" --network-interface=INTERFACE\n"
" Assign an existing network interface to the\n"
@@ -238,8 +241,6 @@ static void help(void) {
" Add a virtual ethernet connection between host\n"
" and container and add it to an existing bridge on\n"
" the host\n"
- " --private-users[=UIDBASE[:NUIDS]]\n"
- " Run within user namespace\n"
" -p --port=[PROTOCOL:]HOSTPORT[:CONTAINERPORT]\n"
" Expose a container IP port on the host\n"
" -Z --selinux-context=SECLABEL\n"
@@ -823,7 +824,7 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_PERSONALITY:
arg_personality = personality_from_string(optarg);
- if (arg_personality == 0xffffffffLU) {
+ if (arg_personality == PERSONALITY_INVALID) {
log_error("Unknown or unsupported personality '%s'.", optarg);
return -EINVAL;
}
@@ -1020,7 +1021,44 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
-static int mount_all(const char *dest) {
+static int tmpfs_patch_options(const char *options, char **ret) {
+ char *buf = NULL;
+
+ if (arg_userns && arg_uid_shift != 0) {
+
+ if (options)
+ (void) asprintf(&buf, "%s,uid=" UID_FMT ",gid=" UID_FMT, options, arg_uid_shift, arg_uid_shift);
+ else
+ (void) asprintf(&buf, "uid=" UID_FMT ",gid=" UID_FMT, arg_uid_shift, arg_uid_shift);
+ if (!buf)
+ return -ENOMEM;
+
+ options = buf;
+ }
+
+#ifdef HAVE_SELINUX
+ if (arg_selinux_apifs_context) {
+ char *t;
+
+ if (options)
+ t = strjoin(options, ",context=\"", arg_selinux_apifs_context, "\"", NULL);
+ else
+ t = strjoin("context=\"", arg_selinux_apifs_context, "\"", NULL);
+ if (!t) {
+ free(buf);
+ return -ENOMEM;
+ }
+
+ free(buf);
+ buf = t;
+ }
+#endif
+
+ *ret = buf;
+ return !!buf;
+}
+
+static int mount_all(const char *dest, bool userns) {
typedef struct MountPoint {
const char *what;
@@ -1029,88 +1067,63 @@ static int mount_all(const char *dest) {
const char *options;
unsigned long flags;
bool fatal;
+ bool userns;
} MountPoint;
static const MountPoint mount_table[] = {
- { "proc", "/proc", "proc", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
- { "/proc/sys", "/proc/sys", NULL, NULL, MS_BIND, true }, /* Bind mount first */
- { NULL, "/proc/sys", NULL, NULL, MS_BIND|MS_RDONLY|MS_REMOUNT, true }, /* Then, make it r/o */
- { "sysfs", "/sys", "sysfs", NULL, MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
- { "tmpfs", "/sys/fs/cgroup", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME, true },
- { "tmpfs", "/dev", "tmpfs", "mode=755", MS_NOSUID|MS_STRICTATIME, true },
- { "devpts", "/dev/pts", "devpts", "newinstance,ptmxmode=0666,mode=620,gid=" STRINGIFY(TTY_GID), MS_NOSUID|MS_NOEXEC, true },
- { "tmpfs", "/dev/shm", "tmpfs", "mode=1777", MS_NOSUID|MS_NODEV|MS_STRICTATIME, true },
- { "tmpfs", "/run", "tmpfs", "mode=755", MS_NOSUID|MS_NODEV|MS_STRICTATIME, true },
- { "tmpfs", "/tmp", "tmpfs", "mode=1777", MS_STRICTATIME, true },
+ { "proc", "/proc", "proc", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV, true, true },
+ { "/proc/sys", "/proc/sys", NULL, NULL, MS_BIND, true, true }, /* Bind mount first */
+ { NULL, "/proc/sys", NULL, NULL, MS_BIND|MS_RDONLY|MS_REMOUNT, true, true }, /* Then, make it r/o */
+ { "sysfs", "/sys", "sysfs", NULL, MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV, true, false },
+ { "tmpfs", "/sys/fs/cgroup", "tmpfs", "mode=755", MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME, true, false },
+ { "tmpfs", "/dev", "tmpfs", "mode=755", MS_NOSUID|MS_STRICTATIME, true, false },
+ { "tmpfs", "/dev/shm", "tmpfs", "mode=1777", MS_NOSUID|MS_NODEV|MS_STRICTATIME, true, false },
+ { "tmpfs", "/run", "tmpfs", "mode=755", MS_NOSUID|MS_NODEV|MS_STRICTATIME, true, false },
+ { "tmpfs", "/tmp", "tmpfs", "mode=1777", MS_STRICTATIME, true, false },
#ifdef HAVE_SELINUX
- { "/sys/fs/selinux", "/sys/fs/selinux", NULL, NULL, MS_BIND, false }, /* Bind mount first */
- { NULL, "/sys/fs/selinux", NULL, NULL, MS_BIND|MS_RDONLY|MS_REMOUNT, false }, /* Then, make it r/o */
+ { "/sys/fs/selinux", "/sys/fs/selinux", NULL, NULL, MS_BIND, false, false }, /* Bind mount first */
+ { NULL, "/sys/fs/selinux", NULL, NULL, MS_BIND|MS_RDONLY|MS_REMOUNT, false, false }, /* Then, make it r/o */
#endif
};
unsigned k;
- int r = 0;
+ int r;
for (k = 0; k < ELEMENTSOF(mount_table); k++) {
_cleanup_free_ char *where = NULL, *options = NULL;
const char *o;
- int t;
- where = strjoin(dest, "/", mount_table[k].where, NULL);
+ if (userns != mount_table[k].userns)
+ continue;
+
+ where = prefix_root(dest, mount_table[k].where);
if (!where)
return log_oom();
- t = path_is_mount_point(where, true);
- if (t < 0 && t != -ENOENT) {
- log_error_errno(t, "Failed to detect whether %s is a mount point: %m", where);
-
- if (r == 0)
- r = t;
-
- continue;
- }
+ r = path_is_mount_point(where, AT_SYMLINK_FOLLOW);
+ if (r < 0 && r != -ENOENT)
+ return log_error_errno(r, "Failed to detect whether %s is a mount point: %m", where);
/* Skip this entry if it is not a remount. */
- if (mount_table[k].what && t > 0)
+ if (mount_table[k].what && r > 0)
continue;
- t = mkdir_p(where, 0755);
- if (t < 0) {
- if (mount_table[k].fatal) {
- log_error_errno(t, "Failed to create directory %s: %m", where);
-
- if (r == 0)
- r = t;
- } else
- log_warning_errno(t, "Failed to create directory %s: %m", where);
+ r = mkdir_p(where, 0755);
+ if (r < 0) {
+ if (mount_table[k].fatal)
+ return log_error_errno(r, "Failed to create directory %s: %m", where);
+ log_warning_errno(r, "Failed to create directory %s: %m", where);
continue;
}
-#ifdef HAVE_SELINUX
- if (arg_selinux_apifs_context &&
- (streq_ptr(mount_table[k].what, "tmpfs") || streq_ptr(mount_table[k].what, "devpts"))) {
- options = strjoin(mount_table[k].options, ",context=\"", arg_selinux_apifs_context, "\"", NULL);
- if (!options)
- return log_oom();
-
- o = options;
- } else
-#endif
- o = mount_table[k].options;
-
- if (arg_userns && arg_uid_shift != UID_INVALID && streq_ptr(mount_table[k].type, "tmpfs")) {
- char *uid_options = NULL;
-
- if (o)
- asprintf(&uid_options, "%s,uid=" UID_FMT ",gid=" UID_FMT, o, arg_uid_shift, arg_uid_shift);
- else
- asprintf(&uid_options, "uid=" UID_FMT ",gid=" UID_FMT, arg_uid_shift, arg_uid_shift);
- if (!uid_options)
+ o = mount_table[k].options;
+ if (streq_ptr(mount_table[k].type, "tmpfs")) {
+ r = tmpfs_patch_options(o, &options);
+ if (r < 0)
return log_oom();
-
- free(options);
- o = options = uid_options;
+ if (r > 0)
+ o = options;
}
if (mount(mount_table[k].what,
@@ -1119,34 +1132,29 @@ static int mount_all(const char *dest) {
mount_table[k].flags,
o) < 0) {
- if (mount_table[k].fatal) {
- log_error_errno(errno, "mount(%s) failed: %m", where);
+ if (mount_table[k].fatal)
+ return log_error_errno(errno, "mount(%s) failed: %m", where);
- if (r == 0)
- r = -errno;
- } else
- log_warning_errno(errno, "mount(%s) failed: %m", where);
+ log_warning_errno(errno, "mount(%s) failed, ignoring: %m", where);
}
}
- return r;
+ return 0;
}
static int mount_bind(const char *dest, CustomMount *m) {
struct stat source_st, dest_st;
- char *where;
+ const char *where;
int r;
- assert(dest);
assert(m);
if (stat(m->source, &source_st) < 0)
return log_error_errno(errno, "Failed to stat %s: %m", m->source);
- where = strjoina(dest, m->destination);
+ where = prefix_roota(dest, m->destination);
- r = stat(where, &dest_st);
- if (r >= 0) {
+ if (stat(where, &dest_st) >= 0) {
if (S_ISDIR(source_st.st_mode) && !S_ISDIR(dest_st.st_mode)) {
log_error("Cannot bind mount directory %s on file %s.", m->source, where);
return -EINVAL;
@@ -1190,19 +1198,25 @@ static int mount_bind(const char *dest, CustomMount *m) {
}
static int mount_tmpfs(const char *dest, CustomMount *m) {
- char *where;
+ const char *where, *options;
+ _cleanup_free_ char *buf = NULL;
int r;
assert(dest);
assert(m);
- where = strjoina(dest, m->destination);
+ where = prefix_roota(dest, m->destination);
- r = mkdir_label(where, 0755);
+ r = mkdir_p_label(where, 0755);
if (r < 0 && r != -EEXIST)
return log_error_errno(r, "Creating mount point for tmpfs %s failed: %m", where);
- if (mount("tmpfs", where, "tmpfs", MS_NODEV|MS_STRICTATIME, m->options) < 0)
+ r = tmpfs_patch_options(m->options, &buf);
+ if (r < 0)
+ return log_oom();
+ options = r > 0 ? buf : m->options;
+
+ if (mount("tmpfs", where, "tmpfs", MS_NODEV|MS_STRICTATIME, options) < 0)
return log_error_errno(errno, "tmpfs mount to %s failed: %m", where);
return 0;
@@ -1210,13 +1224,13 @@ static int mount_tmpfs(const char *dest, CustomMount *m) {
static int mount_overlay(const char *dest, CustomMount *m) {
_cleanup_free_ char *lower = NULL;
- char *where, *options;
+ const char *where, *options;
int r;
assert(dest);
assert(m);
- where = strjoina(dest, m->destination);
+ where = prefix_roota(dest, m->destination);
r = mkdir_label(where, 0755);
if (r < 0 && r != -EEXIST)
@@ -1227,7 +1241,6 @@ static int mount_overlay(const char *dest, CustomMount *m) {
strv_reverse(m->lower);
lower = strv_join(m->lower, ":");
strv_reverse(m->lower);
-
if (!lower)
return log_oom();
@@ -1286,7 +1299,7 @@ static int mount_cgroup_hierarchy(const char *dest, const char *controller, cons
to = strjoina(dest, "/sys/fs/cgroup/", hierarchy);
- r = path_is_mount_point(to, false);
+ r = path_is_mount_point(to, 0);
if (r < 0 && r != -ENOENT)
return log_error_errno(r, "Failed to determine if %s is mounted already: %m", to);
if (r > 0)
@@ -1310,8 +1323,7 @@ static int mount_cgroup_hierarchy(const char *dest, const char *controller, cons
static int mount_cgroup(const char *dest) {
_cleanup_set_free_free_ Set *controllers = NULL;
- _cleanup_free_ char *own_cgroup_path = NULL;
- const char *cgroup_root, *systemd_root, *systemd_own;
+ const char *cgroup_root;
int r;
controllers = set_new(&string_hash_ops);
@@ -1322,10 +1334,6 @@ static int mount_cgroup(const char *dest) {
if (r < 0)
return log_error_errno(r, "Failed to determine cgroup controllers: %m");
- r = cg_pid_get_path(NULL, 0, &own_cgroup_path);
- if (r < 0)
- return log_error_errno(r, "Failed to determine our own cgroup path: %m");
-
for (;;) {
_cleanup_free_ char *controller = NULL, *origin = NULL, *combined = NULL;
@@ -1333,7 +1341,7 @@ static int mount_cgroup(const char *dest) {
if (!controller)
break;
- origin = strappend("/sys/fs/cgroup/", controller);
+ origin = prefix_root("/sys/fs/cgroup/", controller);
if (!origin)
return log_oom();
@@ -1350,7 +1358,7 @@ static int mount_cgroup(const char *dest) {
else {
_cleanup_free_ char *target = NULL;
- target = strjoin(dest, "/sys/fs/cgroup/", controller, NULL);
+ target = prefix_root(dest, origin);
if (!target)
return log_oom();
@@ -1379,25 +1387,82 @@ static int mount_cgroup(const char *dest) {
if (r < 0)
return r;
+ cgroup_root = prefix_roota(dest, "/sys/fs/cgroup");
+ if (mount(NULL, cgroup_root, NULL, MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME|MS_RDONLY, "mode=755") < 0)
+ return log_error_errno(errno, "Failed to remount %s read-only: %m", cgroup_root);
+
+ return 0;
+}
+
+static int mount_systemd_cgroup_writable(const char *dest) {
+ _cleanup_free_ char *own_cgroup_path = NULL;
+ const char *systemd_root, *systemd_own;
+ int r;
+
+ assert(dest);
+
+ r = cg_pid_get_path(NULL, 0, &own_cgroup_path);
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine our own cgroup path: %m");
+
/* Make our own cgroup a (writable) bind mount */
systemd_own = strjoina(dest, "/sys/fs/cgroup/systemd", own_cgroup_path);
if (mount(systemd_own, systemd_own, NULL, MS_BIND, NULL) < 0)
return log_error_errno(errno, "Failed to turn %s into a bind mount: %m", own_cgroup_path);
/* And then remount the systemd cgroup root read-only */
- systemd_root = strjoina(dest, "/sys/fs/cgroup/systemd");
+ systemd_root = prefix_roota(dest, "/sys/fs/cgroup/systemd");
if (mount(NULL, systemd_root, NULL, MS_BIND|MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_RDONLY, NULL) < 0)
return log_error_errno(errno, "Failed to mount cgroup root read-only: %m");
- cgroup_root = strjoina(dest, "/sys/fs/cgroup");
- if (mount(NULL, cgroup_root, NULL, MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME|MS_RDONLY, "mode=755") < 0)
- return log_error_errno(errno, "Failed to remount %s read-only: %m", cgroup_root);
+ return 0;
+}
+
+static int userns_lchown(const char *p, uid_t uid, gid_t gid) {
+ assert(p);
+
+ if (!arg_userns)
+ return 0;
+
+ if (uid == UID_INVALID && gid == GID_INVALID)
+ return 0;
+
+ if (uid != UID_INVALID) {
+ uid += arg_uid_shift;
+
+ if (uid < arg_uid_shift || uid >= arg_uid_shift + arg_uid_range)
+ return -EOVERFLOW;
+ }
+
+ if (gid != GID_INVALID) {
+ gid += (gid_t) arg_uid_shift;
+
+ if (gid < (gid_t) arg_uid_shift || gid >= (gid_t) (arg_uid_shift + arg_uid_range))
+ return -EOVERFLOW;
+ }
+
+ if (lchown(p, uid, gid) < 0)
+ return -errno;
return 0;
}
+static int userns_mkdir(const char *root, const char *path, mode_t mode, uid_t uid, gid_t gid) {
+ const char *q;
+
+ q = prefix_roota(root, path);
+ if (mkdir(q, mode) < 0) {
+ if (errno == EEXIST)
+ return 0;
+ return -errno;
+ }
+
+ return userns_lchown(q, uid, gid);
+}
+
static int setup_timezone(const char *dest) {
- _cleanup_free_ char *where = NULL, *p = NULL, *q = NULL, *check = NULL, *what = NULL;
+ _cleanup_free_ char *p = NULL, *q = NULL;
+ const char *where, *check, *what;
char *z, *y;
int r;
@@ -1418,10 +1483,7 @@ static int setup_timezone(const char *dest) {
return 0;
}
- where = strappend(dest, "/etc/localtime");
- if (!where)
- return log_oom();
-
+ where = prefix_roota(dest, "/etc/localtime");
r = readlink_malloc(where, &q);
if (r >= 0) {
y = path_startswith(q, "../usr/share/zoneinfo/");
@@ -1433,43 +1495,34 @@ static int setup_timezone(const char *dest) {
return 0;
}
- check = strjoin(dest, "/usr/share/zoneinfo/", z, NULL);
- if (!check)
- return log_oom();
-
- if (access(check, F_OK) < 0) {
+ check = strjoina("/usr/share/zoneinfo/", z);
+ check = prefix_root(dest, check);
+ if (laccess(check, F_OK) < 0) {
log_warning("Timezone %s does not exist in container, not updating container timezone.", z);
return 0;
}
- what = strappend("../usr/share/zoneinfo/", z);
- if (!what)
- return log_oom();
-
- r = mkdir_parents(where, 0755);
- if (r < 0) {
- log_error_errno(r, "Failed to create directory for timezone info %s in container: %m", where);
-
- return 0;
- }
-
r = unlink(where);
if (r < 0 && errno != ENOENT) {
log_error_errno(errno, "Failed to remove existing timezone info %s in container: %m", where);
-
return 0;
}
+ what = strjoina("../usr/share/zoneinfo/", z);
if (symlink(what, where) < 0) {
log_error_errno(errno, "Failed to correct timezone of container: %m");
return 0;
}
+ r = userns_lchown(where, 0, 0);
+ if (r < 0)
+ return log_warning_errno(r, "Failed to chown /etc/localtime: %m");
+
return 0;
}
static int setup_resolv_conf(const char *dest) {
- _cleanup_free_ char *where = NULL;
+ const char *where = NULL;
int r;
assert(dest);
@@ -1478,31 +1531,24 @@ static int setup_resolv_conf(const char *dest) {
return 0;
/* Fix resolv.conf, if possible */
- where = strappend(dest, "/etc/resolv.conf");
- if (!where)
- return log_oom();
-
- /* We don't really care for the results of this really. If it
- * fails, it fails, but meh... */
- r = mkdir_parents(where, 0755);
- if (r < 0) {
- log_warning_errno(r, "Failed to create parent directory for resolv.conf %s: %m", where);
-
- return 0;
- }
+ where = prefix_roota(dest, "/etc/resolv.conf");
r = copy_file("/etc/resolv.conf", where, O_TRUNC|O_NOFOLLOW, 0644, 0);
if (r < 0) {
log_warning_errno(r, "Failed to copy /etc/resolv.conf to %s: %m", where);
-
return 0;
}
+ r = userns_lchown(where, 0, 0);
+ if (r < 0)
+ log_warning_errno(r, "Failed to chown /etc/resolv.conf: %m");
+
return 0;
}
static int setup_volatile_state(const char *directory) {
- const char *p;
+ _cleanup_free_ char *buf = NULL;
+ const char *p, *options;
int r;
assert(directory);
@@ -1517,12 +1563,19 @@ static int setup_volatile_state(const char *directory) {
if (r < 0)
return log_error_errno(r, "Failed to remount %s read-only: %m", directory);
- p = strjoina(directory, "/var");
+ p = prefix_roota(directory, "/var");
r = mkdir(p, 0755);
if (r < 0 && errno != EEXIST)
return log_error_errno(errno, "Failed to create %s: %m", directory);
- if (mount("tmpfs", p, "tmpfs", MS_STRICTATIME, "mode=755") < 0)
+ options = "mode=755";
+ r = tmpfs_patch_options(options, &buf);
+ if (r < 0)
+ return log_oom();
+ if (r > 0)
+ options = buf;
+
+ if (mount("tmpfs", p, "tmpfs", MS_STRICTATIME, options) < 0)
return log_error_errno(errno, "Failed to mount tmpfs to /var: %m");
return 0;
@@ -1531,7 +1584,8 @@ static int setup_volatile_state(const char *directory) {
static int setup_volatile(const char *directory) {
bool tmpfs_mounted = false, bind_mounted = false;
char template[] = "/tmp/nspawn-volatile-XXXXXX";
- const char *f, *t;
+ _cleanup_free_ char *buf = NULL;
+ const char *f, *t, *options;
int r;
assert(directory);
@@ -1545,27 +1599,31 @@ static int setup_volatile(const char *directory) {
if (!mkdtemp(template))
return log_error_errno(errno, "Failed to create temporary directory: %m");
- if (mount("tmpfs", template, "tmpfs", MS_STRICTATIME, "mode=755") < 0) {
- log_error_errno(errno, "Failed to mount tmpfs for root directory: %m");
- r = -errno;
+ options = "mode=755";
+ r = tmpfs_patch_options(options, &buf);
+ if (r < 0)
+ return log_oom();
+ if (r > 0)
+ options = buf;
+
+ if (mount("tmpfs", template, "tmpfs", MS_STRICTATIME, options) < 0) {
+ r = log_error_errno(errno, "Failed to mount tmpfs for root directory: %m");
goto fail;
}
tmpfs_mounted = true;
- f = strjoina(directory, "/usr");
- t = strjoina(template, "/usr");
+ f = prefix_roota(directory, "/usr");
+ t = prefix_roota(template, "/usr");
r = mkdir(t, 0755);
if (r < 0 && errno != EEXIST) {
- log_error_errno(errno, "Failed to create %s: %m", t);
- r = -errno;
+ r = log_error_errno(errno, "Failed to create %s: %m", t);
goto fail;
}
if (mount(f, t, NULL, MS_BIND|MS_REC, NULL) < 0) {
- log_error_errno(errno, "Failed to create /usr bind mount: %m");
- r = -errno;
+ r = log_error_errno(errno, "Failed to create /usr bind mount: %m");
goto fail;
}
@@ -1578,25 +1636,26 @@ static int setup_volatile(const char *directory) {
}
if (mount(template, directory, NULL, MS_MOVE, NULL) < 0) {
- log_error_errno(errno, "Failed to move root mount: %m");
- r = -errno;
+ r = log_error_errno(errno, "Failed to move root mount: %m");
goto fail;
}
- rmdir(template);
+ (void) rmdir(template);
return 0;
fail:
if (bind_mounted)
- umount(t);
+ (void) umount(t);
+
if (tmpfs_mounted)
- umount(template);
- rmdir(template);
+ (void) umount(template);
+ (void) rmdir(template);
return r;
}
static char* id128_format_as_uuid(sd_id128_t id, char s[37]) {
+ assert(s);
snprintf(s, 37,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
@@ -1606,23 +1665,19 @@ static char* id128_format_as_uuid(sd_id128_t id, char s[37]) {
}
static int setup_boot_id(const char *dest) {
- _cleanup_free_ char *from = NULL, *to = NULL;
+ const char *from, *to;
sd_id128_t rnd = {};
char as_uuid[37];
int r;
- assert(dest);
-
if (arg_share_system)
return 0;
/* Generate a new randomized boot ID, so that each boot-up of
* the container gets a new one */
- from = strappend(dest, "/dev/proc-sys-kernel-random-boot-id");
- to = strappend(dest, "/proc/sys/kernel/random/boot_id");
- if (!from || !to)
- return log_oom();
+ from = prefix_roota(dest, "/run/proc-sys-kernel-random-boot-id");
+ to = prefix_roota(dest, "/proc/sys/kernel/random/boot_id");
r = sd_id128_randomize(&rnd);
if (r < 0)
@@ -1634,10 +1689,9 @@ static int setup_boot_id(const char *dest) {
if (r < 0)
return log_error_errno(r, "Failed to write boot id: %m");
- if (mount(from, to, NULL, MS_BIND, NULL) < 0) {
- log_error_errno(errno, "Failed to bind mount boot id: %m");
- r = -errno;
- } else if (mount(from, to, NULL, MS_BIND|MS_REMOUNT|MS_RDONLY, NULL))
+ if (mount(from, to, NULL, MS_BIND, NULL) < 0)
+ r = log_error_errno(errno, "Failed to bind mount boot id: %m");
+ else if (mount(NULL, to, NULL, MS_BIND|MS_REMOUNT|MS_RDONLY|MS_NOSUID|MS_NODEV, NULL) < 0)
log_warning_errno(errno, "Failed to make boot id read-only: %m");
unlink(from);
@@ -1663,14 +1717,16 @@ static int copy_devnodes(const char *dest) {
u = umask(0000);
+ /* Create /dev/net, so that we can create /dev/net/tun in it */
+ if (userns_mkdir(dest, "/dev/net", 0755, 0, 0) < 0)
+ return log_error_errno(r, "Failed to create /dev/net directory: %m");
+
NULSTR_FOREACH(d, devnodes) {
_cleanup_free_ char *from = NULL, *to = NULL;
struct stat st;
from = strappend("/dev/", d);
- to = strjoin(dest, "/dev/", d, NULL);
- if (!from || !to)
- return log_oom();
+ to = prefix_root(dest, from);
if (stat(from, &st) < 0) {
@@ -1679,16 +1735,10 @@ static int copy_devnodes(const char *dest) {
} else if (!S_ISCHR(st.st_mode) && !S_ISBLK(st.st_mode)) {
- log_error("%s is not a char or block device, cannot copy", from);
+ log_error("%s is not a char or block device, cannot copy.", from);
return -EIO;
} else {
- r = mkdir_parents(to, 0775);
- if (r < 0) {
- log_error_errno(r, "Failed to create parent directory of %s: %m", to);
- return -r;
- }
-
if (mknod(to, st.st_mode, st.st_rdev) < 0) {
if (errno != EPERM)
return log_error_errno(errno, "mknod(%s) failed: %m", to);
@@ -1702,28 +1752,56 @@ static int copy_devnodes(const char *dest) {
return log_error_errno(errno, "Both mknod and bind mount (%s) failed: %m", to);
}
- if (arg_userns && arg_uid_shift != UID_INVALID)
- if (lchown(to, arg_uid_shift, arg_uid_shift) < 0)
- return log_error_errno(errno, "chown() of device node %s failed: %m", to);
+ r = userns_lchown(to, 0, 0);
+ if (r < 0)
+ return log_error_errno(r, "chown() of device node %s failed: %m", to);
}
}
return r;
}
-static int setup_ptmx(const char *dest) {
- _cleanup_free_ char *p = NULL;
+static int setup_pts(const char *dest) {
+ _cleanup_free_ char *options = NULL;
+ const char *p;
+
+#ifdef HAVE_SELINUX
+ if (arg_selinux_apifs_context)
+ (void) asprintf(&options,
+ "newinstance,ptmxmode=0666,mode=620,uid=" UID_FMT ",gid=" GID_FMT ",context=\"%s\"",
+ arg_uid_shift,
+ arg_uid_shift + TTY_GID,
+ arg_selinux_apifs_context);
+ else
+#endif
+ (void) asprintf(&options,
+ "newinstance,ptmxmode=0666,mode=620,uid=" UID_FMT ",gid=" GID_FMT,
+ arg_uid_shift,
+ arg_uid_shift + TTY_GID);
- p = strappend(dest, "/dev/ptmx");
- if (!p)
+ if (!options)
return log_oom();
+ /* Mount /dev/pts itself */
+ p = prefix_roota(dest, "/dev/pts");
+ if (mkdir(p, 0755) < 0)
+ return log_error_errno(errno, "Failed to create /dev/pts: %m");
+ if (mount("devpts", p, "devpts", MS_NOSUID|MS_NOEXEC, options) < 0)
+ return log_error_errno(errno, "Failed to mount /dev/pts: %m");
+ if (userns_lchown(p, 0, 0) < 0)
+ return log_error_errno(errno, "Failed to chown /dev/pts: %m");
+
+ /* Create /dev/ptmx symlink */
+ p = prefix_roota(dest, "/dev/ptmx");
if (symlink("pts/ptmx", p) < 0)
return log_error_errno(errno, "Failed to create /dev/ptmx symlink: %m");
+ if (userns_lchown(p, 0, 0) < 0)
+ return log_error_errno(errno, "Failed to chown /dev/ptmx: %m");
- if (arg_userns && arg_uid_shift != UID_INVALID)
- if (lchown(p, arg_uid_shift, arg_uid_shift) < 0)
- return log_error_errno(errno, "lchown() of symlink %s failed: %m", p);
+ /* And fix /dev/pts/ptmx ownership */
+ p = prefix_roota(dest, "/dev/pts/ptmx");
+ if (userns_lchown(p, 0, 0) < 0)
+ return log_error_errno(errno, "Failed to chown /dev/pts/ptmx: %m");
return 0;
}
@@ -1738,7 +1816,7 @@ static int setup_dev_console(const char *dest, const char *console) {
u = umask(0000);
- r = chmod_and_chown(console, 0600, 0, 0);
+ r = chmod_and_chown(console, 0600, arg_uid_shift, arg_uid_shift);
if (r < 0)
return log_error_errno(r, "Failed to correct access mode for TTY: %m");
@@ -1746,7 +1824,7 @@ static int setup_dev_console(const char *dest, const char *console) {
* ptys can only exist on pts file systems. To have something
* to bind mount things on we create a empty regular file. */
- to = strjoina(dest, "/dev/console");
+ to = prefix_roota(dest, "/dev/console");
r = touch(to);
if (r < 0)
return log_error_errno(r, "touch() for /dev/console failed: %m");
@@ -1758,9 +1836,9 @@ static int setup_dev_console(const char *dest, const char *console) {
}
static int setup_kmsg(const char *dest, int kmsg_socket) {
- _cleanup_free_ char *from = NULL, *to = NULL;
+ const char *from, *to;
_cleanup_umask_ mode_t u;
- int r, fd, k;
+ int fd, k;
union {
struct cmsghdr cmsghdr;
uint8_t buf[CMSG_SPACE(sizeof(int))];
@@ -1771,29 +1849,22 @@ static int setup_kmsg(const char *dest, int kmsg_socket) {
};
struct cmsghdr *cmsg;
- assert(dest);
assert(kmsg_socket >= 0);
u = umask(0000);
- /* We create the kmsg FIFO as /dev/kmsg, but immediately
+ /* We create the kmsg FIFO as /run/kmsg, but immediately
* delete it after bind mounting it to /proc/kmsg. While FIFOs
* on the reading side behave very similar to /proc/kmsg,
* their writing side behaves differently from /dev/kmsg in
* that writing blocks when nothing is reading. In order to
* avoid any problems with containers deadlocking due to this
* we simply make /dev/kmsg unavailable to the container. */
- if (asprintf(&from, "%s/dev/kmsg", dest) < 0 ||
- asprintf(&to, "%s/proc/kmsg", dest) < 0)
- return log_oom();
+ from = prefix_roota(dest, "/run/kmsg");
+ to = prefix_roota(dest, "/proc/kmsg");
if (mkfifo(from, 0600) < 0)
- return log_error_errno(errno, "mkfifo() for /dev/kmsg failed: %m");
-
- r = chmod_and_chown(from, 0600, 0, 0);
- if (r < 0)
- return log_error_errno(r, "Failed to correct access mode for /dev/kmsg: %m");
-
+ return log_error_errno(errno, "mkfifo() for /run/kmsg failed: %m");
if (mount(from, to, NULL, MS_BIND, NULL) < 0)
return log_error_errno(errno, "Bind mount for /proc/kmsg failed: %m");
@@ -1817,8 +1888,9 @@ static int setup_kmsg(const char *dest, int kmsg_socket) {
if (k < 0)
return log_error_errno(errno, "Failed to send FIFO fd: %m");
- /* And now make the FIFO unavailable as /dev/kmsg... */
- unlink(from);
+ /* And now make the FIFO unavailable as /run/kmsg... */
+ (void) unlink(from);
+
return 0;
}
@@ -1842,7 +1914,7 @@ static int send_rtnl(int send_fd) {
fd = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_ROUTE);
if (fd < 0)
- return log_error_errno(errno, "failed to allocate container netlink: %m");
+ return log_error_errno(errno, "Failed to allocate container netlink: %m");
cmsg = CMSG_FIRSTHDR(&mh);
cmsg->cmsg_level = SOL_SOCKET;
@@ -2027,7 +2099,8 @@ static int setup_hostname(void) {
static int setup_journal(const char *directory) {
sd_id128_t machine_id, this_id;
- _cleanup_free_ char *p = NULL, *b = NULL, *q = NULL, *d = NULL;
+ _cleanup_free_ char *b = NULL, *d = NULL;
+ const char *etc_machine_id, *p, *q;
char *id;
int r;
@@ -2035,15 +2108,13 @@ static int setup_journal(const char *directory) {
if (arg_ephemeral)
return 0;
- p = strappend(directory, "/etc/machine-id");
- if (!p)
- return log_oom();
+ etc_machine_id = prefix_roota(directory, "/etc/machine-id");
- r = read_one_line_file(p, &b);
+ r = read_one_line_file(etc_machine_id, &b);
if (r == -ENOENT && arg_link_journal == LINK_AUTO)
return 0;
else if (r < 0)
- return log_error_errno(r, "Failed to read machine ID from %s: %m", p);
+ return log_error_errno(r, "Failed to read machine ID from %s: %m", etc_machine_id);
id = strstrip(b);
if (isempty(id) && arg_link_journal == LINK_AUTO)
@@ -2052,7 +2123,7 @@ static int setup_journal(const char *directory) {
/* Verify validity */
r = sd_id128_from_string(id, &machine_id);
if (r < 0)
- return log_error_errno(r, "Failed to parse machine ID from %s: %m", p);
+ return log_error_errno(r, "Failed to parse machine ID from %s: %m", etc_machine_id);
r = sd_id128_get_machine(&this_id);
if (r < 0)
@@ -2069,13 +2140,22 @@ static int setup_journal(const char *directory) {
if (arg_link_journal == LINK_NO)
return 0;
- free(p);
- p = strappend("/var/log/journal/", id);
- q = strjoin(directory, "/var/log/journal/", id, NULL);
- if (!p || !q)
- return log_oom();
+ r = userns_mkdir(directory, "/var", 0755, 0, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create /var: %m");
+
+ r = userns_mkdir(directory, "/var/log", 0755, 0, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create /var/log: %m");
+
+ r = userns_mkdir(directory, "/var/log/journal", 0755, 0, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create /var/log/journal: %m");
+
+ p = strjoina("/var/log/journal/", id);
+ q = prefix_roota(directory, p);
- if (path_is_mount_point(p, false) > 0) {
+ if (path_is_mount_point(p, 0) > 0) {
if (arg_link_journal != LINK_AUTO) {
log_error("%s: already a mount point, refusing to use for journal", p);
return -EEXIST;
@@ -2084,7 +2164,7 @@ static int setup_journal(const char *directory) {
return 0;
}
- if (path_is_mount_point(q, false) > 0) {
+ if (path_is_mount_point(q, 0) > 0) {
if (arg_link_journal != LINK_AUTO) {
log_error("%s: already a mount point, refusing to use for journal", q);
return -EEXIST;
@@ -2099,7 +2179,7 @@ static int setup_journal(const char *directory) {
arg_link_journal == LINK_AUTO) &&
path_equal(d, q)) {
- r = mkdir_p(q, 0755);
+ r = userns_mkdir(directory, p, 0755, 0, 0);
if (r < 0)
log_warning_errno(errno, "Failed to create directory %s: %m", q);
return 0;
@@ -2137,7 +2217,7 @@ static int setup_journal(const char *directory) {
}
}
- r = mkdir_p(q, 0755);
+ r = userns_mkdir(directory, p, 0755, 0, 0);
if (r < 0)
log_warning_errno(errno, "Failed to create directory %s: %m", q);
return 0;
@@ -2163,7 +2243,7 @@ static int setup_journal(const char *directory) {
if (dir_is_empty(q) == 0)
log_warning("%s is not empty, proceeding anyway.", q);
- r = mkdir_p(q, 0755);
+ r = userns_mkdir(directory, p, 0755, 0, 0);
if (r < 0) {
log_error_errno(errno, "Failed to create %s: %m", q);
return r;
@@ -2548,7 +2628,7 @@ static int setup_veth(pid_t pid, char iface_name[IFNAMSIZ], int *ifi) {
r = sd_rtnl_call(rtnl, m, 0, NULL);
if (r < 0)
- return log_error_errno(r, "Failed to add new veth interfaces: %m");
+ return log_error_errno(r, "Failed to add new veth interfaces (host0, %s): %m", iface_name);
i = (int) if_nametoindex(iface_name);
if (i <= 0)
@@ -2853,15 +2933,16 @@ static int setup_seccomp(void) {
uint64_t capability;
int syscall_num;
} blacklist[] = {
- { CAP_SYS_RAWIO, SCMP_SYS(iopl)},
- { CAP_SYS_RAWIO, SCMP_SYS(ioperm)},
- { CAP_SYS_BOOT, SCMP_SYS(kexec_load)},
- { CAP_SYS_ADMIN, SCMP_SYS(swapon)},
- { CAP_SYS_ADMIN, SCMP_SYS(swapoff)},
- { CAP_SYS_ADMIN, SCMP_SYS(open_by_handle_at)},
- { CAP_SYS_MODULE, SCMP_SYS(init_module)},
- { CAP_SYS_MODULE, SCMP_SYS(finit_module)},
- { CAP_SYS_MODULE, SCMP_SYS(delete_module)},
+ { CAP_SYS_RAWIO, SCMP_SYS(iopl) },
+ { CAP_SYS_RAWIO, SCMP_SYS(ioperm) },
+ { CAP_SYS_BOOT, SCMP_SYS(kexec_load) },
+ { CAP_SYS_ADMIN, SCMP_SYS(swapon) },
+ { CAP_SYS_ADMIN, SCMP_SYS(swapoff) },
+ { CAP_SYS_ADMIN, SCMP_SYS(open_by_handle_at) },
+ { CAP_SYS_MODULE, SCMP_SYS(init_module) },
+ { CAP_SYS_MODULE, SCMP_SYS(finit_module) },
+ { CAP_SYS_MODULE, SCMP_SYS(delete_module) },
+ { CAP_SYSLOG, SCMP_SYS(syslog) },
};
scmp_filter_ctx seccomp;
@@ -2941,10 +3022,16 @@ static int setup_propagate(const char *root) {
p = strjoina("/run/systemd/nspawn/propagate/", arg_machine);
(void) mkdir_p(p, 0600);
- q = strjoina(root, "/run/systemd/nspawn/incoming");
- mkdir_parents(q, 0755);
- mkdir_p(q, 0600);
+ if (userns_mkdir(root, "/run/systemd", 0755, 0, 0) < 0)
+ return log_error_errno(errno, "Failed to create /run/systemd: %m");
+ if (userns_mkdir(root, "/run/systemd/nspawn", 0755, 0, 0) < 0)
+ return log_error_errno(errno, "Failed to create /run/systemd/nspawn: %m");
+
+ if (userns_mkdir(root, "/run/systemd/nspawn/incoming", 0600, 0, 0) < 0)
+ return log_error_errno(errno, "Failed to create /run/systemd/nspawn/incoming: %m");
+
+ q = prefix_roota(root, "/run/systemd/nspawn/incoming");
if (mount(p, q, NULL, MS_BIND, NULL) < 0)
return log_error_errno(errno, "Failed to install propagation bind mount.");
@@ -3603,14 +3690,9 @@ static int change_uid_gid(char **_home) {
if (!arg_user || streq(arg_user, "root") || streq(arg_user, "0")) {
/* Reset everything fully to 0, just in case */
- if (setgroups(0, NULL) < 0)
- return log_error_errno(errno, "setgroups() failed: %m");
-
- if (setresgid(0, 0, 0) < 0)
- return log_error_errno(errno, "setregid() failed: %m");
-
- if (setresuid(0, 0, 0) < 0)
- return log_error_errno(errno, "setreuid() failed: %m");
+ r = reset_uid_gid();
+ if (r < 0)
+ return log_error_errno(r, "Failed to become root: %m");
*_home = NULL;
return 0;
@@ -3754,9 +3836,9 @@ static int change_uid_gid(char **_home) {
if (r < 0 && r != -EEXIST)
return log_error_errno(r, "Failed to make home directory: %m");
- fchown(STDIN_FILENO, uid, gid);
- fchown(STDOUT_FILENO, uid, gid);
- fchown(STDERR_FILENO, uid, gid);
+ (void) fchown(STDIN_FILENO, uid, gid);
+ (void) fchown(STDOUT_FILENO, uid, gid);
+ (void) fchown(STDERR_FILENO, uid, gid);
if (setgroups(n_uids, uids) < 0)
return log_error_errno(errno, "Failed to set auxiliary groups: %m");
@@ -3925,23 +4007,25 @@ static int determine_names(void) {
return 0;
}
-static int determine_uid_shift(void) {
+static int determine_uid_shift(const char *directory) {
int r;
- if (!arg_userns)
+ if (!arg_userns) {
+ arg_uid_shift = 0;
return 0;
+ }
if (arg_uid_shift == UID_INVALID) {
struct stat st;
- r = stat(arg_directory, &st);
+ r = stat(directory, &st);
if (r < 0)
- return log_error_errno(errno, "Failed to determine UID base of %s: %m", arg_directory);
+ return log_error_errno(errno, "Failed to determine UID base of %s: %m", directory);
arg_uid_shift = st.st_uid & UINT32_C(0xffff0000);
if (arg_uid_shift != (st.st_gid & UINT32_C(0xffff0000))) {
- log_error("UID and GID base of %s don't match.", arg_directory);
+ log_error("UID and GID base of %s don't match.", directory);
return -EINVAL;
}
@@ -3957,6 +4041,413 @@ static int determine_uid_shift(void) {
return 0;
}
+static int inner_child(
+ Barrier *barrier,
+ const char *directory,
+ bool secondary,
+ int kmsg_socket,
+ int rtnl_socket,
+ FDSet *fds,
+ int argc,
+ char *argv[]) {
+
+ _cleanup_free_ char *home = NULL;
+ unsigned n_env = 2;
+ const char *envp[] = {
+ "PATH=" DEFAULT_PATH_SPLIT_USR,
+ "container=systemd-nspawn", /* LXC sets container=lxc, so follow the scheme here */
+ NULL, /* TERM */
+ NULL, /* HOME */
+ NULL, /* USER */
+ NULL, /* LOGNAME */
+ NULL, /* container_uuid */
+ NULL, /* LISTEN_FDS */
+ NULL, /* LISTEN_PID */
+ NULL
+ };
+
+ _cleanup_strv_free_ char **env_use = NULL;
+ int r;
+
+ assert(barrier);
+ assert(directory);
+ assert(kmsg_socket >= 0);
+
+ if (arg_userns) {
+ /* Tell the parent, that it now can write the UID map. */
+ (void) barrier_place(barrier); /* #1 */
+
+ /* Wait until the parent wrote the UID map */
+ if (!barrier_place_and_sync(barrier)) { /* #2 */
+ log_error("Parent died too early");
+ return -ESRCH;
+ }
+ }
+
+ r = mount_all(NULL, true);
+ if (r < 0)
+ return r;
+
+ /* Wait until we are cgroup-ified, so that we
+ * can mount the right cgroup path writable */
+ if (!barrier_place_and_sync(barrier)) { /* #3 */
+ log_error("Parent died too early");
+ return -ESRCH;
+ }
+
+ r = mount_systemd_cgroup_writable("");
+ if (r < 0)
+ return r;
+
+ r = reset_uid_gid();
+ if (r < 0)
+ return log_error_errno(r, "Couldn't become new root: %m");
+
+ r = setup_boot_id(NULL);
+ if (r < 0)
+ return r;
+
+ r = setup_kmsg(NULL, kmsg_socket);
+ if (r < 0)
+ return r;
+ kmsg_socket = safe_close(kmsg_socket);
+
+ umask(0022);
+
+ if (setsid() < 0)
+ return log_error_errno(errno, "setsid() failed: %m");
+
+ if (arg_private_network)
+ loopback_setup();
+
+ r = send_rtnl(rtnl_socket);
+ if (r < 0)
+ return r;
+ rtnl_socket = safe_close(rtnl_socket);
+
+ if (drop_capabilities() < 0)
+ return log_error_errno(errno, "drop_capabilities() failed: %m");
+
+ setup_hostname();
+
+ if (arg_personality != PERSONALITY_INVALID) {
+ if (personality(arg_personality) < 0)
+ return log_error_errno(errno, "personality() failed: %m");
+ } else if (secondary) {
+ if (personality(PER_LINUX32) < 0)
+ return log_error_errno(errno, "personality() failed: %m");
+ }
+
+#ifdef HAVE_SELINUX
+ if (arg_selinux_context)
+ if (setexeccon((security_context_t) arg_selinux_context) < 0)
+ return log_error_errno(errno, "setexeccon(\"%s\") failed: %m", arg_selinux_context);
+#endif
+
+ r = change_uid_gid(&home);
+ if (r < 0)
+ return r;
+
+ envp[n_env] = strv_find_prefix(environ, "TERM=");
+ if (envp[n_env])
+ n_env ++;
+
+ if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
+ (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
+ (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0))
+ return log_oom();
+
+ if (!sd_id128_equal(arg_uuid, SD_ID128_NULL)) {
+ char as_uuid[37];
+
+ if (asprintf((char**)(envp + n_env++), "container_uuid=%s", id128_format_as_uuid(arg_uuid, as_uuid)) < 0)
+ return log_oom();
+ }
+
+ if (fdset_size(fds) > 0) {
+ r = fdset_cloexec(fds, false);
+ if (r < 0)
+ return log_error_errno(r, "Failed to unset O_CLOEXEC for file descriptors.");
+
+ if ((asprintf((char **)(envp + n_env++), "LISTEN_FDS=%u", fdset_size(fds)) < 0) ||
+ (asprintf((char **)(envp + n_env++), "LISTEN_PID=1") < 0))
+ return log_oom();
+ }
+
+ env_use = strv_env_merge(2, envp, arg_setenv);
+ if (!env_use)
+ return log_oom();
+
+ /* Let the parent know that we are ready and
+ * wait until the parent is ready with the
+ * setup, too... */
+ if (!barrier_place_and_sync(barrier)) { /* #4 */
+ log_error("Parent died too early");
+ return -ESRCH;
+ }
+
+ /* Now, explicitly close the log, so that we
+ * then can close all remaining fds. Closing
+ * the log explicitly first has the benefit
+ * that the logging subsystem knows about it,
+ * and is thus ready to be reopened should we
+ * need it again. Note that the other fds
+ * closed here are at least the locking and
+ * barrier fds. */
+ log_close();
+ (void) fdset_close_others(fds);
+
+ if (arg_boot) {
+ char **a;
+ size_t m;
+
+ /* Automatically search for the init system */
+
+ m = 1 + argc - optind;
+ a = newa(char*, m + 1);
+ memcpy(a + 1, argv + optind, m * sizeof(char*));
+
+ a[0] = (char*) "/usr/lib/systemd/systemd";
+ execve(a[0], a, env_use);
+
+ a[0] = (char*) "/lib/systemd/systemd";
+ execve(a[0], a, env_use);
+
+ a[0] = (char*) "/sbin/init";
+ execve(a[0], a, env_use);
+ } else if (argc > optind)
+ execvpe(argv[optind], argv + optind, env_use);
+ else {
+ chdir(home ? home : "/root");
+ execle("/bin/bash", "-bash", NULL, env_use);
+ execle("/bin/sh", "-sh", NULL, env_use);
+ }
+
+ (void) log_open();
+ return log_error_errno(errno, "execv() failed: %m");
+}
+
+static int outer_child(
+ Barrier *barrier,
+ const char *directory,
+ const char *console,
+ const char *root_device, bool root_device_rw,
+ const char *home_device, bool home_device_rw,
+ const char *srv_device, bool srv_device_rw,
+ bool interactive,
+ bool secondary,
+ int pid_socket,
+ int kmsg_socket,
+ int rtnl_socket,
+ FDSet *fds,
+ int argc,
+ char *argv[]) {
+
+ pid_t pid;
+ ssize_t l;
+ int r;
+
+ assert(barrier);
+ assert(directory);
+ assert(console);
+ assert(pid_socket >= 0);
+ assert(kmsg_socket >= 0);
+
+ if (prctl(PR_SET_PDEATHSIG, SIGKILL) < 0)
+ return log_error_errno(errno, "PR_SET_PDEATHSIG failed: %m");
+
+ if (interactive) {
+ close_nointr(STDIN_FILENO);
+ close_nointr(STDOUT_FILENO);
+ close_nointr(STDERR_FILENO);
+
+ r = open_terminal(console, O_RDWR);
+ if (r != STDIN_FILENO) {
+ if (r >= 0) {
+ safe_close(r);
+ r = -EINVAL;
+ }
+
+ return log_error_errno(r, "Failed to open console: %m");
+ }
+
+ if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO ||
+ dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO)
+ return log_error_errno(errno, "Failed to duplicate console: %m");
+ }
+
+ r = reset_audit_loginuid();
+ if (r < 0)
+ return r;
+
+ /* Mark everything as slave, so that we still
+ * receive mounts from the real root, but don't
+ * propagate mounts to the real root. */
+ if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
+ return log_error_errno(errno, "MS_SLAVE|MS_REC failed: %m");
+
+ r = mount_devices(directory,
+ root_device, root_device_rw,
+ home_device, home_device_rw,
+ srv_device, srv_device_rw);
+ if (r < 0)
+ return r;
+
+ r = determine_uid_shift(directory);
+ if (r < 0)
+ return r;
+
+ /* Turn directory into bind mount */
+ if (mount(directory, directory, NULL, MS_BIND|MS_REC, NULL) < 0)
+ return log_error_errno(errno, "Failed to make bind mount: %m");
+
+ r = setup_volatile(directory);
+ if (r < 0)
+ return r;
+
+ r = setup_volatile_state(directory);
+ if (r < 0)
+ return r;
+
+ r = base_filesystem_create(directory, arg_uid_shift, (gid_t) arg_uid_shift);
+ if (r < 0)
+ return r;
+
+ if (arg_read_only) {
+ r = bind_remount_recursive(directory, true);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make tree read-only: %m");
+ }
+
+ r = mount_all(directory, false);
+ if (r < 0)
+ return r;
+
+ if (copy_devnodes(directory) < 0)
+ return r;
+
+ dev_setup(directory, arg_uid_shift, arg_uid_shift);
+
+ if (setup_pts(directory) < 0)
+ return r;
+
+ r = setup_propagate(directory);
+ if (r < 0)
+ return r;
+
+ r = setup_dev_console(directory, console);
+ if (r < 0)
+ return r;
+
+ r = setup_seccomp();
+ if (r < 0)
+ return r;
+
+ r = setup_timezone(directory);
+ if (r < 0)
+ return r;
+
+ r = setup_resolv_conf(directory);
+ if (r < 0)
+ return r;
+
+ r = setup_journal(directory);
+ if (r < 0)
+ return r;
+
+ r = mount_custom(directory);
+ if (r < 0)
+ return r;
+
+ r = mount_cgroup(directory);
+ if (r < 0)
+ return r;
+
+ r = mount_move_root(directory);
+ if (r < 0)
+ return log_error_errno(r, "Failed to move root directory: %m");
+
+ pid = raw_clone(SIGCHLD|CLONE_NEWNS|
+ (arg_share_system ? 0 : CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS) |
+ (arg_private_network ? CLONE_NEWNET : 0) |
+ (arg_userns ? CLONE_NEWUSER : 0),
+ NULL);
+ if (pid < 0)
+ return log_error_errno(errno, "Failed to fork inner child: %m");
+
+ if (pid == 0) {
+ pid_socket = safe_close(pid_socket);
+
+ /* The inner child has all namespaces that are
+ * requested, so that we all are owned by the user if
+ * user namespaces are turned on. */
+
+ r = inner_child(barrier, directory, secondary, kmsg_socket, rtnl_socket, fds, argc, argv);
+ if (r < 0)
+ _exit(EXIT_FAILURE);
+
+ _exit(EXIT_SUCCESS);
+ }
+
+ l = send(pid_socket, &pid, sizeof(pid), MSG_NOSIGNAL);
+ if (l < 0)
+ return log_error_errno(errno, "Failed to send PID: %m");
+ if (l != sizeof(pid)) {
+ log_error("Short write while sending PID.");
+ return -EIO;
+ }
+
+ pid_socket = safe_close(pid_socket);
+
+ return 0;
+}
+
+static int setup_uid_map(pid_t pid) {
+ char uid_map[strlen("/proc//uid_map") + DECIMAL_STR_MAX(uid_t) + 1], line[DECIMAL_STR_MAX(uid_t)*3+3+1];
+ int r;
+
+ assert(pid > 1);
+
+ xsprintf(uid_map, "/proc/" PID_FMT "/uid_map", pid);
+ xsprintf(line, UID_FMT " " UID_FMT " " UID_FMT "\n", 0, arg_uid_shift, arg_uid_range);
+ r = write_string_file(uid_map, line);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write UID map: %m");
+
+ /* We always assign the same UID and GID ranges */
+ xsprintf(uid_map, "/proc/" PID_FMT "/gid_map", pid);
+ r = write_string_file(uid_map, line);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write GID map: %m");
+
+ return 0;
+}
+
+static int chown_cgroup(pid_t pid) {
+ _cleanup_free_ char *path = NULL, *fs = NULL;
+ _cleanup_close_ int fd = -1;
+ const char *fn;
+ int r;
+
+ r = cg_pid_get_path(NULL, pid, &path);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get container cgroup path: %m");
+
+ r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, path, NULL, &fs);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get file system path for container cgroup: %m");
+
+ fd = open(fs, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open %s: %m", fs);
+
+ FOREACH_STRING(fn, ".", "tasks", "notify_on_release", "cgroup.procs", "cgroup.clone_children")
+ if (fchownat(fd, fn, arg_uid_shift, arg_uid_shift, 0) < 0)
+ log_warning_errno(errno, "Failed to chown() cgroup file %s, ignoring: %m", fn);
+
+ return 0;
+}
+
int main(int argc, char *argv[]) {
_cleanup_free_ char *device_path = NULL, *root_device = NULL, *home_device = NULL, *srv_device = NULL, *console = NULL;
@@ -4017,7 +4508,7 @@ int main(int argc, char *argv[]) {
* the specified is not a mount point we
* create the new snapshot in the parent
* directory, just next to it. */
- r = path_is_mount_point(arg_directory, false);
+ r = path_is_mount_point(arg_directory, 0);
if (r < 0) {
log_error_errno(r, "Failed to determine whether directory %s is mount point: %m", arg_directory);
goto finish;
@@ -4136,15 +4627,13 @@ int main(int argc, char *argv[]) {
goto finish;
}
- r = determine_uid_shift();
- if (r < 0)
- goto finish;
-
r = custom_mounts_prepare();
if (r < 0)
goto finish;
- interactive = isatty(STDIN_FILENO) > 0 && isatty(STDOUT_FILENO) > 0;
+ interactive =
+ isatty(STDIN_FILENO) > 0 &&
+ isatty(STDOUT_FILENO) > 0;
master = posix_openpt(O_RDWR|O_NOCTTY|O_CLOEXEC|O_NDELAY);
if (master < 0) {
@@ -4174,14 +4663,25 @@ int main(int argc, char *argv[]) {
assert_se(sigemptyset(&mask_chld) == 0);
assert_se(sigaddset(&mask_chld, SIGCHLD) == 0);
+ if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0) {
+ r = log_error_errno(errno, "Failed to become subreaper: %m");
+ goto finish;
+ }
+
for (;;) {
- _cleanup_close_pair_ int kmsg_socket_pair[2] = { -1, -1 }, rtnl_socket_pair[2] = { -1, -1 };
+ _cleanup_close_pair_ int kmsg_socket_pair[2] = { -1, -1 }, rtnl_socket_pair[2] = { -1, -1 }, pid_socket_pair[2] = { -1, -1 };
ContainerStatus container_status;
_cleanup_(barrier_destroy) Barrier barrier = BARRIER_NULL;
- struct sigaction sa = {
+ static const struct sigaction sa = {
.sa_handler = nop_handler,
.sa_flags = SA_NOCLDSTOP,
};
+ int ifi = 0;
+ ssize_t l;
+ _cleanup_event_unref_ sd_event *event = NULL;
+ _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
+ _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
+ char last_char = 0;
r = barrier_create(&barrier);
if (r < 0) {
@@ -4199,6 +4699,11 @@ int main(int argc, char *argv[]) {
goto finish;
}
+ if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, pid_socket_pair) < 0) {
+ r = log_error_errno(errno, "Failed to create pid socket pair: %m");
+ goto finish;
+ }
+
/* Child can be killed before execv(), so handle SIGCHLD
* in order to interrupt parent's blocking calls and
* give it a chance to call wait() and terminate. */
@@ -4214,9 +4719,7 @@ int main(int argc, char *argv[]) {
goto finish;
}
- pid = raw_clone(SIGCHLD|CLONE_NEWNS|
- (arg_share_system ? 0 : CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS)|
- (arg_private_network ? CLONE_NEWNET : 0), NULL);
+ pid = raw_clone(SIGCHLD|CLONE_NEWNS, NULL);
if (pid < 0) {
if (errno == EINVAL)
r = log_error_errno(errno, "clone() failed, do you have namespace support enabled in your kernel? (You need UTS, IPC, PID and NET namespacing built in): %m");
@@ -4227,471 +4730,191 @@ int main(int argc, char *argv[]) {
}
if (pid == 0) {
- /* child */
- _cleanup_free_ char *home = NULL;
- unsigned n_env = 2;
- const char *envp[] = {
- "PATH=" DEFAULT_PATH_SPLIT_USR,
- "container=systemd-nspawn", /* LXC sets container=lxc, so follow the scheme here */
- NULL, /* TERM */
- NULL, /* HOME */
- NULL, /* USER */
- NULL, /* LOGNAME */
- NULL, /* container_uuid */
- NULL, /* LISTEN_FDS */
- NULL, /* LISTEN_PID */
- NULL
- };
- char **env_use;
-
+ /* The outer child only has a file system namespace. */
barrier_set_role(&barrier, BARRIER_CHILD);
- envp[n_env] = strv_find_prefix(environ, "TERM=");
- if (envp[n_env])
- n_env ++;
-
master = safe_close(master);
kmsg_socket_pair[0] = safe_close(kmsg_socket_pair[0]);
rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]);
+ pid_socket_pair[0] = safe_close(pid_socket_pair[0]);
reset_all_signal_handlers();
reset_signal_mask();
- if (interactive) {
- close_nointr(STDIN_FILENO);
- close_nointr(STDOUT_FILENO);
- close_nointr(STDERR_FILENO);
-
- r = open_terminal(console, O_RDWR);
- if (r != STDIN_FILENO) {
- if (r >= 0) {
- safe_close(r);
- r = -EINVAL;
- }
-
- log_error_errno(r, "Failed to open console: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO ||
- dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO) {
- log_error_errno(errno, "Failed to duplicate console: %m");
- _exit(EXIT_FAILURE);
- }
- }
-
- if (setsid() < 0) {
- log_error_errno(errno, "setsid() failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (reset_audit_loginuid() < 0)
- _exit(EXIT_FAILURE);
-
- if (prctl(PR_SET_PDEATHSIG, SIGKILL) < 0) {
- log_error_errno(errno, "PR_SET_PDEATHSIG failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (arg_private_network)
- loopback_setup();
-
- /* Mark everything as slave, so that we still
- * receive mounts from the real root, but don't
- * propagate mounts to the real root. */
- if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) {
- log_error_errno(errno, "MS_SLAVE|MS_REC failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (mount_devices(arg_directory,
- root_device, root_device_rw,
- home_device, home_device_rw,
- srv_device, srv_device_rw) < 0)
- _exit(EXIT_FAILURE);
-
- /* Turn directory into bind mount */
- if (mount(arg_directory, arg_directory, NULL, MS_BIND|MS_REC, NULL) < 0) {
- log_error_errno(errno, "Failed to make bind mount: %m");
- _exit(EXIT_FAILURE);
- }
-
- r = setup_volatile(arg_directory);
- if (r < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_volatile_state(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- r = base_filesystem_create(arg_directory);
- if (r < 0)
- _exit(EXIT_FAILURE);
-
- if (arg_read_only) {
- r = bind_remount_recursive(arg_directory, true);
- if (r < 0) {
- log_error_errno(r, "Failed to make tree read-only: %m");
- _exit(EXIT_FAILURE);
- }
- }
-
- if (mount_all(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (copy_devnodes(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_ptmx(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- dev_setup(arg_directory);
-
- if (setup_propagate(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_seccomp() < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_dev_console(arg_directory, console) < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_kmsg(arg_directory, kmsg_socket_pair[1]) < 0)
- _exit(EXIT_FAILURE);
- kmsg_socket_pair[1] = safe_close(kmsg_socket_pair[1]);
-
- if (send_rtnl(rtnl_socket_pair[1]) < 0)
- _exit(EXIT_FAILURE);
- rtnl_socket_pair[1] = safe_close(rtnl_socket_pair[1]);
-
- /* Tell the parent that we are ready, and that
- * it can cgroupify us to that we lack access
- * to certain devices and resources. */
- (void) barrier_place(&barrier); /* #1 */
-
- if (setup_boot_id(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_timezone(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_resolv_conf(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (setup_journal(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (mount_custom(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- /* Wait until we are cgroup-ified, so that we
- * can mount the right cgroup path writable */
- (void) barrier_place_and_sync(&barrier); /* #2 */
-
- if (mount_cgroup(arg_directory) < 0)
- _exit(EXIT_FAILURE);
-
- if (chdir(arg_directory) < 0) {
- log_error_errno(errno, "chdir(%s) failed: %m", arg_directory);
- _exit(EXIT_FAILURE);
- }
-
- if (mount(arg_directory, "/", NULL, MS_MOVE, NULL) < 0) {
- log_error_errno(errno, "mount(MS_MOVE) failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (chroot(".") < 0) {
- log_error_errno(errno, "chroot() failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (chdir("/") < 0) {
- log_error_errno(errno, "chdir() failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- if (arg_userns) {
- if (unshare(CLONE_NEWUSER) < 0) {
- log_error_errno(errno, "unshare(CLONE_NEWUSER) failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- /* Tell the parent, that it now can
- * write the UID map. */
- (void) barrier_place(&barrier); /* #3 */
-
- /* Wait until the parent wrote the UID
- * map */
- (void) barrier_place_and_sync(&barrier); /* #4 */
- }
-
- umask(0022);
-
- if (drop_capabilities() < 0) {
- log_error_errno(errno, "drop_capabilities() failed: %m");
- _exit(EXIT_FAILURE);
- }
-
- setup_hostname();
-
- if (arg_personality != 0xffffffffLU) {
- if (personality(arg_personality) < 0) {
- log_error_errno(errno, "personality() failed: %m");
- _exit(EXIT_FAILURE);
- }
- } else if (secondary) {
- if (personality(PER_LINUX32) < 0) {
- log_error_errno(errno, "personality() failed: %m");
- _exit(EXIT_FAILURE);
- }
- }
-
-#ifdef HAVE_SELINUX
- if (arg_selinux_context)
- if (setexeccon((security_context_t) arg_selinux_context) < 0) {
- log_error_errno(errno, "setexeccon(\"%s\") failed: %m", arg_selinux_context);
- _exit(EXIT_FAILURE);
- }
-#endif
-
- r = change_uid_gid(&home);
+ r = outer_child(&barrier,
+ arg_directory,
+ console,
+ root_device, root_device_rw,
+ home_device, home_device_rw,
+ srv_device, srv_device_rw,
+ interactive,
+ secondary,
+ pid_socket_pair[1],
+ kmsg_socket_pair[1],
+ rtnl_socket_pair[1],
+ fds,
+ argc, argv);
if (r < 0)
_exit(EXIT_FAILURE);
- if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) ||
- (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) ||
- (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) {
- log_oom();
- _exit(EXIT_FAILURE);
- }
-
- if (!sd_id128_equal(arg_uuid, SD_ID128_NULL)) {
- char as_uuid[37];
-
- if (asprintf((char**)(envp + n_env++), "container_uuid=%s", id128_format_as_uuid(arg_uuid, as_uuid)) < 0) {
- log_oom();
- _exit(EXIT_FAILURE);
- }
- }
-
- if (fdset_size(fds) > 0) {
- r = fdset_cloexec(fds, false);
- if (r < 0) {
- log_error_errno(r, "Failed to unset O_CLOEXEC for file descriptors.");
- _exit(EXIT_FAILURE);
- }
-
- if ((asprintf((char **)(envp + n_env++), "LISTEN_FDS=%u", n_fd_passed) < 0) ||
- (asprintf((char **)(envp + n_env++), "LISTEN_PID=1") < 0)) {
- log_oom();
- _exit(EXIT_FAILURE);
- }
- }
-
- if (!strv_isempty(arg_setenv)) {
- char **n;
-
- n = strv_env_merge(2, envp, arg_setenv);
- if (!n) {
- log_oom();
- _exit(EXIT_FAILURE);
- }
-
- env_use = n;
- } else
- env_use = (char**) envp;
-
- /* Let the parent know that we are ready and
- * wait until the parent is ready with the
- * setup, too... */
- (void) barrier_place_and_sync(&barrier); /* #5 */
-
- /* Now, explicitly close the log, so that we
- * then can close all remaining fds. Closing
- * the log explicitly first has the benefit
- * that the logging subsystem knows about it,
- * and is thus ready to be reopened should we
- * need it again. Note that the other fds
- * closed here are at least the locking and
- * barrier fds. */
- log_close();
- (void) fdset_close_others(fds);
-
- if (arg_boot) {
- char **a;
- size_t l;
-
- /* Automatically search for the init system */
-
- l = 1 + argc - optind;
- a = newa(char*, l + 1);
- memcpy(a + 1, argv + optind, l * sizeof(char*));
-
- a[0] = (char*) "/usr/lib/systemd/systemd";
- execve(a[0], a, env_use);
-
- a[0] = (char*) "/lib/systemd/systemd";
- execve(a[0], a, env_use);
-
- a[0] = (char*) "/sbin/init";
- execve(a[0], a, env_use);
- } else if (argc > optind)
- execvpe(argv[optind], argv + optind, env_use);
- else {
- chdir(home ? home : "/root");
- execle("/bin/bash", "-bash", NULL, env_use);
- execle("/bin/sh", "-sh", NULL, env_use);
- }
-
- (void) log_open();
- log_error_errno(errno, "execv() failed: %m");
- _exit(EXIT_FAILURE);
+ _exit(EXIT_SUCCESS);
}
barrier_set_role(&barrier, BARRIER_PARENT);
+
fdset_free(fds);
fds = NULL;
kmsg_socket_pair[1] = safe_close(kmsg_socket_pair[1]);
rtnl_socket_pair[1] = safe_close(rtnl_socket_pair[1]);
+ pid_socket_pair[1] = safe_close(pid_socket_pair[1]);
- (void) barrier_place(&barrier); /* #1 */
+ /* Wait for the outer child. */
+ r = wait_for_terminate_and_warn("namespace helper", pid, NULL);
+ if (r < 0)
+ goto finish;
+ if (r != 0) {
+ r = -EIO;
+ goto finish;
+ }
+ pid = 0;
- /* Wait for the most basic Child-setup to be done,
- * before we add hardware to it, and place it in a
- * cgroup. */
- if (barrier_sync(&barrier)) { /* #1 */
- int ifi = 0;
+ /* And now retrieve the PID of the inner child. */
+ l = recv(pid_socket_pair[0], &pid, sizeof(pid), 0);
+ if (l < 0) {
+ r = log_error_errno(errno, "Failed to read inner child PID: %m");
+ goto finish;
+ }
+ if (l != sizeof(pid)) {
+ log_error("Short read while reading inner child PID: %m");
+ r = EIO;
+ goto finish;
+ }
- r = move_network_interfaces(pid);
- if (r < 0)
- goto finish;
+ log_debug("Init process invoked as PID " PID_FMT, pid);
- r = setup_veth(pid, veth_name, &ifi);
- if (r < 0)
+ if (arg_userns) {
+ if (!barrier_place_and_sync(&barrier)) { /* #1 */
+ log_error("Child died too early.");
+ r = -ESRCH;
goto finish;
+ }
- r = setup_bridge(veth_name, &ifi);
+ r = setup_uid_map(pid);
if (r < 0)
goto finish;
- r = setup_macvlan(pid);
- if (r < 0)
- goto finish;
+ (void) barrier_place(&barrier); /* #2 */
+ }
- r = setup_ipvlan(pid);
- if (r < 0)
- goto finish;
+ r = move_network_interfaces(pid);
+ if (r < 0)
+ goto finish;
- r = register_machine(pid, ifi);
- if (r < 0)
- goto finish;
+ r = setup_veth(pid, veth_name, &ifi);
+ if (r < 0)
+ goto finish;
- /* Notify the child that the parent is ready with all
- * its setup, and that the child can now hand over
- * control to the code to run inside the container. */
- (void) barrier_place(&barrier); /* #2 */
+ r = setup_bridge(veth_name, &ifi);
+ if (r < 0)
+ goto finish;
- if (arg_userns) {
- char uid_map[strlen("/proc//uid_map") + DECIMAL_STR_MAX(uid_t) + 1], line[DECIMAL_STR_MAX(uid_t)*3+3+1];
+ r = setup_macvlan(pid);
+ if (r < 0)
+ goto finish;
- (void) barrier_place_and_sync(&barrier); /* #3 */
+ r = setup_ipvlan(pid);
+ if (r < 0)
+ goto finish;
- xsprintf(uid_map, "/proc/" PID_FMT "/uid_map", pid);
- xsprintf(line, UID_FMT " " UID_FMT " " UID_FMT "\n", 0, arg_uid_shift, arg_uid_range);
- r = write_string_file(uid_map, line);
- if (r < 0) {
- log_error_errno(r, "Failed to write UID map: %m");
- goto finish;
- }
+ r = register_machine(pid, ifi);
+ if (r < 0)
+ goto finish;
- /* We always assign the same UID and GID ranges */
- xsprintf(uid_map, "/proc/" PID_FMT "/gid_map", pid);
- r = write_string_file(uid_map, line);
- if (r < 0) {
- log_error_errno(r, "Failed to write GID map: %m");
- goto finish;
- }
+ r = chown_cgroup(pid);
+ if (r < 0)
+ goto finish;
- (void) barrier_place(&barrier); /* #4 */
- }
+ /* Notify the child that the parent is ready with all
+ * its setup (including cgroup-ification), and that
+ * the child can now hand over control to the code to
+ * run inside the container. */
+ (void) barrier_place(&barrier); /* #3 */
- /* Block SIGCHLD here, before notifying child.
- * process_pty() will handle it with the other signals. */
- r = sigprocmask(SIG_BLOCK, &mask_chld, NULL);
- if (r < 0)
- goto finish;
+ /* Block SIGCHLD here, before notifying child.
+ * process_pty() will handle it with the other signals. */
+ assert_se(sigprocmask(SIG_BLOCK, &mask_chld, NULL) >= 0);
- /* Reset signal to default */
- r = default_signals(SIGCHLD, -1);
- if (r < 0)
- goto finish;
+ /* Reset signal to default */
+ r = default_signals(SIGCHLD, -1);
+ if (r < 0) {
+ log_error_errno(r, "Failed to reset SIGCHLD: %m");
+ goto finish;
+ }
- /* Let the child know that we are ready and wait that the child is completely ready now. */
- if (barrier_place_and_sync(&barrier)) { /* #5 */
- _cleanup_event_unref_ sd_event *event = NULL;
- _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
- _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
- char last_char = 0;
+ /* Let the child know that we are ready and wait that the child is completely ready now. */
+ if (!barrier_place_and_sync(&barrier)) { /* #5 */
+ log_error("Client died too early.");
+ r = -ESRCH;
+ goto finish;
+ }
- sd_notifyf(false,
- "READY=1\n"
- "STATUS=Container running.\n"
- "X_NSPAWN_LEADER_PID=" PID_FMT, pid);
+ sd_notifyf(false,
+ "READY=1\n"
+ "STATUS=Container running.\n"
+ "X_NSPAWN_LEADER_PID=" PID_FMT, pid);
- r = sd_event_new(&event);
- if (r < 0) {
- log_error_errno(r, "Failed to get default event source: %m");
- goto finish;
- }
+ r = sd_event_new(&event);
+ if (r < 0) {
+ log_error_errno(r, "Failed to get default event source: %m");
+ goto finish;
+ }
- if (arg_kill_signal > 0) {
- /* Try to kill the init system on SIGINT or SIGTERM */
- sd_event_add_signal(event, NULL, SIGINT, on_orderly_shutdown, UINT32_TO_PTR(pid));
- sd_event_add_signal(event, NULL, SIGTERM, on_orderly_shutdown, UINT32_TO_PTR(pid));
- } else {
- /* Immediately exit */
- sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
- sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
- }
+ if (arg_kill_signal > 0) {
+ /* Try to kill the init system on SIGINT or SIGTERM */
+ sd_event_add_signal(event, NULL, SIGINT, on_orderly_shutdown, UINT32_TO_PTR(pid));
+ sd_event_add_signal(event, NULL, SIGTERM, on_orderly_shutdown, UINT32_TO_PTR(pid));
+ } else {
+ /* Immediately exit */
+ sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
+ sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
+ }
- /* simply exit on sigchld */
- sd_event_add_signal(event, NULL, SIGCHLD, NULL, NULL);
+ /* simply exit on sigchld */
+ sd_event_add_signal(event, NULL, SIGCHLD, NULL, NULL);
- if (arg_expose_ports) {
- r = watch_rtnl(event, rtnl_socket_pair[0], &exposed, &rtnl);
- if (r < 0)
- goto finish;
+ if (arg_expose_ports) {
+ r = watch_rtnl(event, rtnl_socket_pair[0], &exposed, &rtnl);
+ if (r < 0)
+ goto finish;
- (void) expose_ports(rtnl, &exposed);
- }
+ (void) expose_ports(rtnl, &exposed);
+ }
- rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]);
+ rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]);
- r = pty_forward_new(event, master, true, !interactive, &forward);
- if (r < 0) {
- log_error_errno(r, "Failed to create PTY forwarder: %m");
- goto finish;
- }
+ r = pty_forward_new(event, master, true, !interactive, &forward);
+ if (r < 0) {
+ log_error_errno(r, "Failed to create PTY forwarder: %m");
+ goto finish;
+ }
- r = sd_event_loop(event);
- if (r < 0) {
- log_error_errno(r, "Failed to run event loop: %m");
- goto finish;
- }
+ r = sd_event_loop(event);
+ if (r < 0) {
+ log_error_errno(r, "Failed to run event loop: %m");
+ goto finish;
+ }
- pty_forward_get_last_char(forward, &last_char);
+ pty_forward_get_last_char(forward, &last_char);
- forward = pty_forward_free(forward);
+ forward = pty_forward_free(forward);
- if (!arg_quiet && last_char != '\n')
- putc('\n', stdout);
+ if (!arg_quiet && last_char != '\n')
+ putc('\n', stdout);
- /* Kill if it is not dead yet anyway */
- terminate_machine(pid);
- }
- }
+ /* Kill if it is not dead yet anyway */
+ terminate_machine(pid);
/* Normally redundant, but better safe than sorry */
kill(pid, SIGKILL);
@@ -4737,11 +4960,11 @@ finish:
"STOPPING=1\n"
"STATUS=Terminating...");
- loop_remove(loop_nr, &image_fd);
-
if (pid > 0)
kill(pid, SIGKILL);
+ loop_remove(loop_nr, &image_fd);
+
if (remove_subvol && arg_directory) {
int k;
diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c
index a09531b26f..e701fc9fae 100644
--- a/src/remount-fs/remount-fs.c
+++ b/src/remount-fs/remount-fs.c
@@ -29,6 +29,7 @@
#include "log.h"
#include "util.h"
#include "path-util.h"
+#include "signal-util.h"
#include "mount-setup.h"
#include "exit-status.h"
diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c
index 271247ca3f..e283d8a749 100644
--- a/src/resolve/resolved.c
+++ b/src/resolve/resolved.c
@@ -24,6 +24,7 @@
#include "mkdir.h"
#include "capability.h"
#include "selinux-util.h"
+#include "signal-util.h"
#include "resolved-manager.h"
#include "resolved-conf.h"
diff --git a/src/run/run.c b/src/run/run.c
index fcd6b06f7d..5b9f31c4aa 100644
--- a/src/run/run.c
+++ b/src/run/run.c
@@ -35,6 +35,7 @@
#include "calendarspec.h"
#include "ptyfwd.h"
#include "formats-util.h"
+#include "signal-util.h"
static bool arg_scope = false;
static bool arg_remain_after_exit = false;
diff --git a/src/shared/architecture.c b/src/shared/architecture.c
index 884abdd3ea..8e72e7a36a 100644
--- a/src/shared/architecture.c
+++ b/src/shared/architecture.c
@@ -35,7 +35,7 @@ int uname_architecture(void) {
* 1:1. Instead we try to clean it up and break down the
* confusion on x86 and arm in particular.
*
- * We do not try to distuingish CPUs not CPU features, but
+ * We do not try to distinguish CPUs not CPU features, but
* actual architectures, i.e. that have genuinely different
* code. */
diff --git a/src/shared/architecture.h b/src/shared/architecture.h
index cb82418a5e..f5bbf65a90 100644
--- a/src/shared/architecture.h
+++ b/src/shared/architecture.h
@@ -27,7 +27,7 @@
/* A cleaned up architecture definition. We don't want to get lost in
* processor features, models, generations or even ABIs. Hence we
- * focus on general family, and distuignish word width and
+ * focus on general family, and distinguish word width and
* endianness. */
enum {
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index a3a2e51bb9..ef3788be68 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -37,7 +37,7 @@
#include "strv.h"
#include "random-util.h"
#include "terminal-util.h"
-
+#include "signal-util.h"
#include "ask-password-api.h"
static void backspace_chars(int ttyfd, size_t p) {
diff --git a/src/shared/base-filesystem.c b/src/shared/base-filesystem.c
index 11e0947407..ab6fc171b0 100644
--- a/src/shared/base-filesystem.c
+++ b/src/shared/base-filesystem.c
@@ -41,13 +41,16 @@ static const BaseFilesystem table[] = {
{ "lib", 0, "usr/lib\0", NULL },
{ "root", 0755, NULL, NULL },
{ "sbin", 0, "usr/sbin\0", NULL },
+ { "usr", 0755, NULL, NULL },
+ { "var", 0755, NULL, NULL },
+ { "etc", 0755, NULL, NULL },
#if defined(__i386__) || defined(__x86_64__)
{ "lib64", 0, "usr/lib/x86_64-linux-gnu\0"
"usr/lib64\0", "ld-linux-x86-64.so.2" },
#endif
};
-int base_filesystem_create(const char *root) {
+int base_filesystem_create(const char *root, uid_t uid, gid_t gid) {
_cleanup_close_ int fd = -1;
unsigned i;
int r = 0;
@@ -90,6 +93,12 @@ int base_filesystem_create(const char *root) {
r = symlinkat(target, fd, table[i].dir);
if (r < 0 && errno != EEXIST)
return log_error_errno(errno, "Failed to create symlink at %s/%s: %m", root, table[i].dir);
+
+ if (uid != UID_INVALID || gid != UID_INVALID) {
+ if (fchownat(fd, table[i].dir, uid, gid, AT_SYMLINK_NOFOLLOW) < 0)
+ return log_error_errno(errno, "Failed to chown symlink at %s/%s: %m", root, table[i].dir);
+ }
+
continue;
}
@@ -97,6 +106,11 @@ int base_filesystem_create(const char *root) {
r = mkdirat(fd, table[i].dir, table[i].mode);
if (r < 0 && errno != EEXIST)
return log_error_errno(errno, "Failed to create directory at %s/%s: %m", root, table[i].dir);
+
+ if (uid != UID_INVALID || gid != UID_INVALID) {
+ if (fchownat(fd, table[i].dir, uid, gid, AT_SYMLINK_NOFOLLOW) < 0)
+ return log_error_errno(errno, "Failed to chown directory at %s/%s: %m", root, table[i].dir);
+ }
}
return 0;
diff --git a/src/shared/base-filesystem.h b/src/shared/base-filesystem.h
index 03201f7083..39a496090f 100644
--- a/src/shared/base-filesystem.h
+++ b/src/shared/base-filesystem.h
@@ -21,4 +21,6 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
-int base_filesystem_create(const char *root);
+#include <sys/types.h>
+
+int base_filesystem_create(const char *root, uid_t uid, gid_t gid);
diff --git a/src/shared/capability.h b/src/shared/capability.h
index 8260ae1a81..4eb5c2a835 100644
--- a/src/shared/capability.h
+++ b/src/shared/capability.h
@@ -31,7 +31,7 @@ int have_effective_cap(int value);
int capability_bounding_set_drop(uint64_t drop, bool right_now);
int capability_bounding_set_drop_usermode(uint64_t drop);
-int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilites);
+int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilities);
int drop_capability(cap_value_t cv);
diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c
index c0b0ca4cf2..9988e5c574 100644
--- a/src/shared/cgroup-util.c
+++ b/src/shared/cgroup-util.c
@@ -489,7 +489,7 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
if (_unlikely_(!good)) {
int r;
- r = path_is_mount_point("/sys/fs/cgroup", false);
+ r = path_is_mount_point("/sys/fs/cgroup", 0);
if (r < 0)
return r;
if (r == 0)
diff --git a/src/shared/condition.c b/src/shared/condition.c
index 9f2574c2f6..24871b0dae 100644
--- a/src/shared/condition.c
+++ b/src/shared/condition.c
@@ -349,7 +349,7 @@ static int condition_test_path_is_mount_point(Condition *c) {
assert(c->parameter);
assert(c->type == CONDITION_PATH_IS_MOUNT_POINT);
- return path_is_mount_point(c->parameter, true) > 0;
+ return path_is_mount_point(c->parameter, AT_SYMLINK_FOLLOW) > 0;
}
static int condition_test_path_is_read_write(Condition *c) {
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index 2c855157a9..7370c786f9 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -444,7 +444,7 @@ int config_parse_many(const char *conf_file,
if (r < 0) \
log_syntax(unit, LOG_ERR, filename, line, -r, \
"Failed to parse %s value, ignoring: %s", \
- #vartype, rvalue); \
+ #type, rvalue); \
\
return 0; \
}
diff --git a/src/shared/dev-setup.c b/src/shared/dev-setup.c
index cb15da8a5d..25ad918b85 100644
--- a/src/shared/dev-setup.c
+++ b/src/shared/dev-setup.c
@@ -23,13 +23,12 @@
#include <stdlib.h>
#include <unistd.h>
-#include "dev-setup.h"
#include "util.h"
#include "label.h"
+#include "path-util.h"
+#include "dev-setup.h"
-int dev_setup(const char *prefix) {
- const char *j, *k;
-
+int dev_setup(const char *prefix, uid_t uid, gid_t gid) {
static const char symlinks[] =
"-/proc/kcore\0" "/dev/core\0"
"/proc/self/fd\0" "/dev/fd\0"
@@ -37,7 +36,13 @@ int dev_setup(const char *prefix) {
"/proc/self/fd/1\0" "/dev/stdout\0"
"/proc/self/fd/2\0" "/dev/stderr\0";
+ const char *j, *k;
+ int r;
+
NULSTR_FOREACH_PAIR(j, k, symlinks) {
+ _cleanup_free_ char *link_name = NULL;
+ const char *n;
+
if (j[0] == '-') {
j++;
@@ -46,15 +51,21 @@ int dev_setup(const char *prefix) {
}
if (prefix) {
- _cleanup_free_ char *link_name = NULL;
-
- link_name = strjoin(prefix, "/", k, NULL);
+ link_name = prefix_root(prefix, k);
if (!link_name)
return -ENOMEM;
- symlink_label(j, link_name);
+ n = link_name;
} else
- symlink_label(j, k);
+ n = k;
+
+ r = symlink_label(j, n);
+ if (r < 0)
+ log_debug_errno(r, "Failed to symlink %s to %s: %m", j, n);
+
+ if (uid != UID_INVALID || gid != GID_INVALID)
+ if (lchown(n, uid, gid) < 0)
+ log_debug_errno(errno, "Failed to chown %s: %m", n);
}
return 0;
diff --git a/src/shared/dev-setup.h b/src/shared/dev-setup.h
index d41b6eefba..ab2748db7f 100644
--- a/src/shared/dev-setup.h
+++ b/src/shared/dev-setup.h
@@ -21,4 +21,6 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
-int dev_setup(const char *pathprefix);
+#include <sys/types.h>
+
+int dev_setup(const char *prefix, uid_t uid, gid_t gid);
diff --git a/src/shared/fdset.c b/src/shared/fdset.c
index 31849272bd..6101b628ec 100644
--- a/src/shared/fdset.c
+++ b/src/shared/fdset.c
@@ -32,7 +32,7 @@
#define MAKE_SET(s) ((Set*) s)
#define MAKE_FDSET(s) ((FDSet*) s)
-/* Make sure we can distuingish fd 0 and NULL */
+/* Make sure we can distinguish fd 0 and NULL */
#define FD_TO_PTR(fd) INT_TO_PTR((fd)+1)
#define PTR_TO_FD(p) (PTR_TO_INT(p)-1)
diff --git a/src/shared/generator.c b/src/shared/generator.c
index 81284995f5..807569a1b8 100644
--- a/src/shared/generator.c
+++ b/src/shared/generator.c
@@ -61,7 +61,7 @@ static int write_fsck_sysroot_service(const char *dir, const char *what) {
"[Service]\n"
"Type=oneshot\n"
"RemainAfterExit=yes\n"
- "ExecStart=/usr/lib/systemd/systemd-fsck %2$s\n"
+ "ExecStart=" SYSTEMD_FSCK_PATH " %2$s\n"
"TimeoutSec=0\n",
program_invocation_short_name,
what,
diff --git a/src/shared/hostname-util.c b/src/shared/hostname-util.c
index 2998fdf2c7..e336f269fa 100644
--- a/src/shared/hostname-util.c
+++ b/src/shared/hostname-util.c
@@ -158,3 +158,36 @@ int sethostname_idempotent(const char *s) {
return 1;
}
+
+int read_hostname_config(const char *path, char **hostname) {
+ _cleanup_fclose_ FILE *f = NULL;
+ char l[LINE_MAX];
+ char *name = NULL;
+
+ assert(path);
+ assert(hostname);
+
+ f = fopen(path, "re");
+ if (!f)
+ return -errno;
+
+ /* may have comments, ignore them */
+ FOREACH_LINE(l, f, return -errno) {
+ truncate_nl(l);
+ if (l[0] != '\0' && l[0] != '#') {
+ /* found line with value */
+ name = hostname_cleanup(l, false);
+ name = strdup(name);
+ if (!name)
+ return -ENOMEM;
+ break;
+ }
+ }
+
+ if (!name)
+ /* no non-empty line found */
+ return -ENOENT;
+
+ *hostname = name;
+ return 0;
+}
diff --git a/src/shared/hostname-util.h b/src/shared/hostname-util.h
index f2821c3078..0c4763cf5a 100644
--- a/src/shared/hostname-util.h
+++ b/src/shared/hostname-util.h
@@ -35,3 +35,5 @@ char* hostname_cleanup(char *s, bool lowercase);
bool is_localhost(const char *hostname);
int sethostname_idempotent(const char *s);
+
+int read_hostname_config(const char *path, char **hostname);
diff --git a/src/shared/import-util.c b/src/shared/import-util.c
index 660d92ac5d..001a8a37e8 100644
--- a/src/shared/import-util.c
+++ b/src/shared/import-util.c
@@ -150,6 +150,27 @@ int raw_strip_suffixes(const char *p, char **ret) {
return 0;
}
+bool dkr_digest_is_valid(const char *digest) {
+ /* 7 chars for prefix, 64 chars for the digest itself */
+ if (strlen(digest) != 71)
+ return false;
+
+ return startswith(digest, "sha256:") && in_charset(digest + 7, "0123456789abcdef");
+}
+
+bool dkr_ref_is_valid(const char *ref) {
+ const char *colon;
+
+ if (isempty(ref))
+ return false;
+
+ colon = strchr(ref, ':');
+ if (!colon)
+ return filename_is_valid(ref);
+
+ return dkr_digest_is_valid(ref);
+}
+
bool dkr_name_is_valid(const char *name) {
const char *slash, *p;
diff --git a/src/shared/import-util.h b/src/shared/import-util.h
index ff155b0ff2..7bf7d4ca40 100644
--- a/src/shared/import-util.h
+++ b/src/shared/import-util.h
@@ -44,4 +44,6 @@ int raw_strip_suffixes(const char *name, char **ret);
bool dkr_name_is_valid(const char *name);
bool dkr_id_is_valid(const char *id);
+bool dkr_ref_is_valid(const char *ref);
+bool dkr_digest_is_valid(const char *digest);
#define dkr_tag_is_valid(tag) filename_is_valid(tag)
diff --git a/src/shared/json.c b/src/shared/json.c
index 45c8ecedb3..be40a0d203 100644
--- a/src/shared/json.c
+++ b/src/shared/json.c
@@ -21,17 +21,178 @@
#include <sys/types.h>
#include <math.h>
-
#include "macro.h"
-#include "util.h"
#include "utf8.h"
#include "json.h"
-enum {
- STATE_NULL,
- STATE_VALUE,
- STATE_VALUE_POST,
-};
+int json_variant_new(JsonVariant **ret, JsonVariantType type) {
+ JsonVariant *v;
+
+ v = new0(JsonVariant, 1);
+ if (!v)
+ return -ENOMEM;
+ v->type = type;
+ *ret = v;
+ return 0;
+}
+
+static int json_variant_deep_copy(JsonVariant *ret, JsonVariant *variant) {
+ int r;
+
+ assert(ret);
+ assert(variant);
+
+ ret->type = variant->type;
+ ret->size = variant->size;
+
+ if (variant->type == JSON_VARIANT_STRING) {
+ ret->string = memdup(variant->string, variant->size+1);
+ if (!ret->string)
+ return -ENOMEM;
+ } else if (variant->type == JSON_VARIANT_ARRAY || variant->type == JSON_VARIANT_OBJECT) {
+ size_t i;
+
+ ret->objects = new0(JsonVariant, variant->size);
+ if (!ret->objects)
+ return -ENOMEM;
+
+ for (i = 0; i < variant->size; ++i) {
+ r = json_variant_deep_copy(&ret->objects[i], &variant->objects[i]);
+ if (r < 0)
+ return r;
+ }
+ } else
+ ret->value = variant->value;
+
+ return 0;
+}
+
+static JsonVariant *json_object_unref(JsonVariant *variant);
+
+static JsonVariant *json_variant_unref_inner(JsonVariant *variant) {
+ if (!variant)
+ return NULL;
+
+ if (variant->type == JSON_VARIANT_ARRAY || variant->type == JSON_VARIANT_OBJECT)
+ return json_object_unref(variant);
+ else if (variant->type == JSON_VARIANT_STRING)
+ free(variant->string);
+
+ return NULL;
+}
+
+static JsonVariant *json_raw_unref(JsonVariant *variant, size_t size) {
+ if (!variant)
+ return NULL;
+
+ for (size_t i = 0; i < size; ++i)
+ json_variant_unref_inner(&variant[i]);
+
+ free(variant);
+ return NULL;
+}
+
+static JsonVariant *json_object_unref(JsonVariant *variant) {
+ size_t i;
+
+ assert(variant);
+
+ if (!variant->objects)
+ return NULL;
+
+ for (i = 0; i < variant->size; ++i)
+ json_variant_unref_inner(&variant->objects[i]);
+
+ free(variant->objects);
+ return NULL;
+}
+
+static JsonVariant **json_variant_array_unref(JsonVariant **variant) {
+ size_t i = 0;
+ JsonVariant *p = NULL;
+
+ if (!variant)
+ return NULL;
+
+ while((p = (variant[i++])) != NULL) {
+ if (p->type == JSON_VARIANT_STRING)
+ free(p->string);
+ free(p);
+ }
+
+ free(variant);
+
+ return NULL;
+}
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(JsonVariant **, json_variant_array_unref);
+
+JsonVariant *json_variant_unref(JsonVariant *variant) {
+ if (!variant)
+ return NULL;
+
+ if (variant->type == JSON_VARIANT_ARRAY || variant->type == JSON_VARIANT_OBJECT)
+ json_object_unref(variant);
+ else if (variant->type == JSON_VARIANT_STRING)
+ free(variant->string);
+
+ free(variant);
+
+ return NULL;
+}
+
+char *json_variant_string(JsonVariant *variant){
+ assert(variant);
+ assert(variant->type == JSON_VARIANT_STRING);
+
+ return variant->string;
+}
+
+bool json_variant_bool(JsonVariant *variant) {
+ assert(variant);
+ assert(variant->type == JSON_VARIANT_BOOLEAN);
+
+ return variant->value.boolean;
+}
+
+intmax_t json_variant_integer(JsonVariant *variant) {
+ assert(variant);
+ assert(variant->type == JSON_VARIANT_INTEGER);
+
+ return variant->value.integer;
+}
+
+double json_variant_real(JsonVariant *variant) {
+ assert(variant);
+ assert(variant->type == JSON_VARIANT_REAL);
+
+ return variant->value.real;
+}
+
+JsonVariant *json_variant_element(JsonVariant *variant, unsigned index) {
+ assert(variant);
+ assert(variant->type == JSON_VARIANT_ARRAY || variant->type == JSON_VARIANT_OBJECT);
+ assert(index < variant->size);
+ assert(variant->objects);
+
+ return &variant->objects[index];
+}
+
+JsonVariant *json_variant_value(JsonVariant *variant, const char *key) {
+ size_t i;
+
+ assert(variant);
+ assert(variant->type == JSON_VARIANT_OBJECT);
+ assert(variant->objects);
+
+ for (i = 0; i < variant->size; i += 2) {
+ JsonVariant *p = &variant->objects[i];
+ if (p->type == JSON_VARIANT_STRING && streq(key, p->string))
+ return &variant->objects[i + 1];
+ }
+
+ return NULL;
+}
static void inc_lines(unsigned *line, const char *s, size_t n) {
const char *p = s;
@@ -285,9 +446,6 @@ static int json_parse_number(const char **p, union json_value *ret) {
} while (strchr("0123456789", *c) && *c != 0);
}
- if (*c != 0)
- return -EINVAL;
-
*p = c;
if (is_double) {
@@ -310,6 +468,12 @@ int json_tokenize(
int t;
int r;
+ enum {
+ STATE_NULL,
+ STATE_VALUE,
+ STATE_VALUE_POST,
+ };
+
assert(p);
assert(*p);
assert(ret_string);
@@ -443,3 +607,260 @@ int json_tokenize(
}
}
+
+static bool json_is_value(JsonVariant *var) {
+ assert(var);
+
+ return var->type != JSON_VARIANT_CONTROL;
+}
+
+static int json_scoped_parse(JsonVariant **tokens, size_t *i, size_t n, JsonVariant *scope) {
+ bool arr = scope->type == JSON_VARIANT_ARRAY;
+ int terminator = arr ? JSON_ARRAY_CLOSE : JSON_OBJECT_CLOSE;
+ size_t allocated = 0, size = 0;
+ JsonVariant *key = NULL, *value = NULL, *var = NULL, *items = NULL;
+ enum {
+ STATE_KEY,
+ STATE_COLON,
+ STATE_COMMA,
+ STATE_VALUE
+ } state = arr ? STATE_VALUE : STATE_KEY;
+
+ assert(tokens);
+ assert(i);
+ assert(scope);
+
+ while((var = *i < n ? tokens[(*i)++] : NULL) != NULL) {
+ bool stopper;
+ int r;
+
+ stopper = !json_is_value(var) && var->value.integer == terminator;
+
+ if (stopper) {
+ if (state != STATE_COMMA && size > 0)
+ goto error;
+
+ goto out;
+ }
+
+ if (state == STATE_KEY) {
+ if (var->type != JSON_VARIANT_STRING)
+ goto error;
+ else {
+ key = var;
+ state = STATE_COLON;
+ }
+ }
+ else if (state == STATE_COLON) {
+ if (key == NULL)
+ goto error;
+
+ if (json_is_value(var))
+ goto error;
+
+ if (var->value.integer != JSON_COLON)
+ goto error;
+
+ state = STATE_VALUE;
+ }
+ else if (state == STATE_VALUE) {
+ _cleanup_json_variant_unref_ JsonVariant *v = NULL;
+ size_t toadd = arr ? 1 : 2;
+
+ if (!json_is_value(var)) {
+ int type = (var->value.integer == JSON_ARRAY_OPEN) ? JSON_VARIANT_ARRAY : JSON_VARIANT_OBJECT;
+
+ r = json_variant_new(&v, type);
+ if (r < 0)
+ goto error;
+
+ r = json_scoped_parse(tokens, i, n, v);
+ if (r < 0)
+ goto error;
+
+ value = v;
+ }
+ else
+ value = var;
+
+ if(!GREEDY_REALLOC(items, allocated, size + toadd))
+ goto error;
+
+ if (arr) {
+ r = json_variant_deep_copy(&items[size], value);
+ if (r < 0)
+ goto error;
+ } else {
+ r = json_variant_deep_copy(&items[size], key);
+ if (r < 0)
+ goto error;
+
+ r = json_variant_deep_copy(&items[size+1], value);
+ if (r < 0)
+ goto error;
+ }
+
+ size += toadd;
+ state = STATE_COMMA;
+ }
+ else if (state == STATE_COMMA) {
+ if (json_is_value(var))
+ goto error;
+
+ if (var->value.integer != JSON_COMMA)
+ goto error;
+
+ key = NULL;
+ value = NULL;
+
+ state = arr ? STATE_VALUE : STATE_KEY;
+ }
+ }
+
+error:
+ json_raw_unref(items, size);
+ return -EBADMSG;
+
+out:
+ scope->size = size;
+ scope->objects = items;
+
+ return scope->type;
+}
+
+static int json_parse_tokens(JsonVariant **tokens, size_t ntokens, JsonVariant **rv) {
+ size_t it = 0;
+ int r;
+ JsonVariant *e;
+ _cleanup_json_variant_unref_ JsonVariant *p = NULL;
+
+ assert(tokens);
+ assert(ntokens);
+
+ e = tokens[it++];
+ r = json_variant_new(&p, JSON_VARIANT_OBJECT);
+ if (r < 0)
+ return r;
+
+ if (e->type != JSON_VARIANT_CONTROL && e->value.integer != JSON_OBJECT_OPEN)
+ return -EBADMSG;
+
+ r = json_scoped_parse(tokens, &it, ntokens, p);
+ if (r < 0)
+ return r;
+
+ *rv = p;
+ p = NULL;
+
+ return 0;
+}
+
+static int json_tokens(const char *string, size_t size, JsonVariant ***tokens, size_t *n) {
+ _cleanup_free_ char *buf = NULL;
+ _cleanup_(json_variant_array_unrefp) JsonVariant **items = NULL;
+ union json_value v = {};
+ void *json_state = NULL;
+ const char *p;
+ int t, r;
+ size_t allocated = 0, s = 0;
+
+ assert(string);
+ assert(n);
+
+ if (size <= 0)
+ return -EBADMSG;
+
+ buf = strndup(string, size);
+ if (!buf)
+ return -ENOMEM;
+
+ p = buf;
+ for (;;) {
+ _cleanup_json_variant_unref_ JsonVariant *var = NULL;
+ _cleanup_free_ char *rstr = NULL;
+
+ t = json_tokenize(&p, &rstr, &v, &json_state, NULL);
+
+ if (t < 0)
+ return t;
+ else if (t == JSON_END)
+ break;
+
+ if (t <= JSON_ARRAY_CLOSE) {
+ r = json_variant_new(&var, JSON_VARIANT_CONTROL);
+ if (r < 0)
+ return r;
+ var->value.integer = t;
+ } else {
+ switch (t) {
+ case JSON_STRING:
+ r = json_variant_new(&var, JSON_VARIANT_STRING);
+ if (r < 0)
+ return r;
+ var->size = strlen(rstr);
+ var->string = strdup(rstr);
+ if (!var->string) {
+ return -ENOMEM;
+ }
+ break;
+ case JSON_INTEGER:
+ r = json_variant_new(&var, JSON_VARIANT_INTEGER);
+ if (r < 0)
+ return r;
+ var->value = v;
+ break;
+ case JSON_REAL:
+ r = json_variant_new(&var, JSON_VARIANT_REAL);
+ if (r < 0)
+ return r;
+ var->value = v;
+ break;
+ case JSON_BOOLEAN:
+ r = json_variant_new(&var, JSON_VARIANT_BOOLEAN);
+ if (r < 0)
+ return r;
+ var->value = v;
+ break;
+ case JSON_NULL:
+ r = json_variant_new(&var, JSON_VARIANT_NULL);
+ if (r < 0)
+ return r;
+ break;
+ }
+ }
+
+ if (!GREEDY_REALLOC(items, allocated, s+2))
+ return -ENOMEM;
+
+ items[s++] = var;
+ items[s] = NULL;
+ var = NULL;
+ }
+
+ *n = s;
+ *tokens = items;
+ items = NULL;
+
+ return 0;
+}
+
+int json_parse(const char *string, JsonVariant **rv) {
+ _cleanup_(json_variant_array_unrefp) JsonVariant **s = NULL;
+ JsonVariant *v = NULL;
+ size_t n = 0;
+ int r;
+
+ assert(string);
+ assert(rv);
+
+ r = json_tokens(string, strlen(string), &s, &n);
+ if (r < 0)
+ return r;
+
+ r = json_parse_tokens(s, n, &v);
+ if (r < 0)
+ return r;
+
+ *rv = v;
+ return 0;
+}
diff --git a/src/shared/json.h b/src/shared/json.h
index 55976d513b..e0b4d810b5 100644
--- a/src/shared/json.h
+++ b/src/shared/json.h
@@ -22,6 +22,7 @@
***/
#include <stdbool.h>
+#include "util.h"
enum {
JSON_END,
@@ -38,12 +39,50 @@ enum {
JSON_NULL,
};
+typedef enum {
+ JSON_VARIANT_CONTROL,
+ JSON_VARIANT_STRING,
+ JSON_VARIANT_INTEGER,
+ JSON_VARIANT_BOOLEAN,
+ JSON_VARIANT_REAL,
+ JSON_VARIANT_ARRAY,
+ JSON_VARIANT_OBJECT,
+ JSON_VARIANT_NULL
+} JsonVariantType;
+
union json_value {
bool boolean;
double real;
intmax_t integer;
};
+typedef struct JsonVariant {
+ JsonVariantType type;
+ size_t size;
+ union {
+ char *string;
+ struct JsonVariant *objects;
+ union json_value value;
+ };
+} JsonVariant;
+
+int json_variant_new(JsonVariant **ret, JsonVariantType type);
+JsonVariant *json_variant_unref(JsonVariant *v);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(JsonVariant *, json_variant_unref);
+#define _cleanup_json_variant_unref_ _cleanup_(json_variant_unrefp)
+
+char *json_variant_string(JsonVariant *v);
+bool json_variant_bool(JsonVariant *v);
+intmax_t json_variant_integer(JsonVariant *v);
+double json_variant_real(JsonVariant *v);
+
+JsonVariant *json_variant_element(JsonVariant *v, unsigned index);
+JsonVariant *json_variant_value(JsonVariant *v, const char *key);
+
#define JSON_VALUE_NULL ((union json_value) {})
int json_tokenize(const char **p, char **ret_string, union json_value *ret_value, void **state, unsigned *line);
+
+int json_parse(const char *string, JsonVariant **rv);
+int json_parse_measure(const char *string, size_t *size);
diff --git a/src/shared/log.c b/src/shared/log.c
index 6168a2955d..b96afc4de4 100644
--- a/src/shared/log.c
+++ b/src/shared/log.c
@@ -38,6 +38,7 @@
#include "formats-util.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
#define SNDBUF_SIZE (8*1024*1024)
diff --git a/src/shared/machine-pool.c b/src/shared/machine-pool.c
index 9920d150ab..d27931cb4a 100644
--- a/src/shared/machine-pool.c
+++ b/src/shared/machine-pool.c
@@ -30,6 +30,7 @@
#include "mkdir.h"
#include "btrfs-util.h"
#include "path-util.h"
+#include "signal-util.h"
#include "machine-pool.h"
#define VAR_LIB_MACHINES_SIZE_START (1024UL*1024UL*500UL)
@@ -198,7 +199,7 @@ int setup_machine_directory(uint64_t size, sd_bus_error *error) {
return 0;
}
- if (path_is_mount_point("/var/lib/machines", true) > 0 ||
+ if (path_is_mount_point("/var/lib/machines", AT_SYMLINK_FOLLOW) > 0 ||
dir_is_empty("/var/lib/machines") == 0)
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "/var/lib/machines is not a btrfs file system. Operation is not supported on legacy file systems.");
diff --git a/src/shared/missing.h b/src/shared/missing.h
index 8ca6f8edb6..9194009491 100644
--- a/src/shared/missing.h
+++ b/src/shared/missing.h
@@ -713,7 +713,7 @@ static inline int setns(int fd, int nstype) {
#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1)
#endif
-#if !HAVE_DECL_IFLA_VXLAN_LOCAL6
+#if !HAVE_DECL_IFLA_VXLAN_REMCSUM_NOPARTIAL
#define IFLA_VXLAN_UNSPEC 0
#define IFLA_VXLAN_ID 1
#define IFLA_VXLAN_GROUP 2
@@ -732,7 +732,14 @@ static inline int setns(int fd, int nstype) {
#define IFLA_VXLAN_PORT 15
#define IFLA_VXLAN_GROUP6 16
#define IFLA_VXLAN_LOCAL6 17
-#define __IFLA_VXLAN_MAX 18
+#define IFLA_VXLAN_UDP_CSUM 18
+#define IFLA_VXLAN_UDP_ZERO_CSUM6_TX 19
+#define IFLA_VXLAN_UDP_ZERO_CSUM6_RX 20
+#define IFLA_VXLAN_REMCSUM_TX 21
+#define IFLA_VXLAN_REMCSUM_RX 22
+#define IFLA_VXLAN_GBP 23
+#define IFLA_VXLAN_REMCSUM_NOPARTIAL 24
+#define __IFLA_VXLAN_MAX 25
#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)
#endif
diff --git a/src/shared/path-util.c b/src/shared/path-util.c
index 7090989fcb..be50a1865d 100644
--- a/src/shared/path-util.c
+++ b/src/shared/path-util.c
@@ -509,7 +509,7 @@ static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *mnt_id
return safe_atoi(p, mnt_id);
}
-int fd_is_mount_point(int fd) {
+int fd_is_mount_point(int fd, const char *filename, int flags) {
union file_handle_union h = FILE_HANDLE_INIT, h_parent = FILE_HANDLE_INIT;
int mount_id = -1, mount_id_parent = -1;
bool nosupp = false, check_st_dev = true;
@@ -517,6 +517,7 @@ int fd_is_mount_point(int fd) {
int r;
assert(fd >= 0);
+ assert(filename);
/* First we will try the name_to_handle_at() syscall, which
* tells us the mount id and an opaque file "handle". It is
@@ -541,7 +542,7 @@ int fd_is_mount_point(int fd) {
* subvolumes have different st_dev, even though they aren't
* real mounts of their own. */
- r = name_to_handle_at(fd, "", &h.handle, &mount_id, AT_EMPTY_PATH);
+ r = name_to_handle_at(fd, filename, &h.handle, &mount_id, flags);
if (r < 0) {
if (errno == ENOSYS)
/* This kernel does not support name_to_handle_at()
@@ -558,7 +559,7 @@ int fd_is_mount_point(int fd) {
return -errno;
}
- r = name_to_handle_at(fd, "..", &h_parent.handle, &mount_id_parent, 0);
+ r = name_to_handle_at(fd, "", &h_parent.handle, &mount_id_parent, AT_EMPTY_PATH);
if (r < 0) {
if (errno == EOPNOTSUPP) {
if (nosupp)
@@ -593,13 +594,13 @@ int fd_is_mount_point(int fd) {
return mount_id != mount_id_parent;
fallback_fdinfo:
- r = fd_fdinfo_mnt_id(fd, "", AT_EMPTY_PATH, &mount_id);
+ r = fd_fdinfo_mnt_id(fd, filename, flags, &mount_id);
if (r == -EOPNOTSUPP)
goto fallback_fstat;
if (r < 0)
return r;
- r = fd_fdinfo_mnt_id(fd, "..", 0, &mount_id_parent);
+ r = fd_fdinfo_mnt_id(fd, "", AT_EMPTY_PATH, &mount_id_parent);
if (r < 0)
return r;
@@ -615,10 +616,16 @@ fallback_fdinfo:
check_st_dev = false;
fallback_fstat:
- if (fstatat(fd, "", &a, AT_EMPTY_PATH) < 0)
+ /* yay for fstatat() taking a different set of flags than the other
+ * _at() above */
+ if (flags & AT_SYMLINK_FOLLOW)
+ flags &= ~AT_SYMLINK_FOLLOW;
+ else
+ flags |= AT_SYMLINK_NOFOLLOW;
+ if (fstatat(fd, filename, &a, flags) < 0)
return -errno;
- if (fstatat(fd, "..", &b, 0) < 0)
+ if (fstatat(fd, "", &b, AT_EMPTY_PATH) < 0)
return -errno;
/* A directory with same device and inode as its parent? Must
@@ -630,19 +637,26 @@ fallback_fstat:
return check_st_dev && (a.st_dev != b.st_dev);
}
-int path_is_mount_point(const char *t, bool allow_symlink) {
+/* flags can be AT_SYMLINK_FOLLOW or 0 */
+int path_is_mount_point(const char *t, int flags) {
_cleanup_close_ int fd = -1;
+ _cleanup_free_ char *parent = NULL;
+ int r;
assert(t);
if (path_equal(t, "/"))
return 1;
- fd = openat(AT_FDCWD, t, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|(allow_symlink ? 0 : O_PATH));
+ r = path_get_parent(t, &parent);
+ if (r < 0)
+ return r;
+
+ fd = openat(AT_FDCWD, parent, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_PATH);
if (fd < 0)
return -errno;
- return fd_is_mount_point(fd);
+ return fd_is_mount_point(fd, basename(t), flags);
}
int path_is_read_only_fs(const char *path) {
diff --git a/src/shared/path-util.h b/src/shared/path-util.h
index 4f45cfd2b7..1eac89c51b 100644
--- a/src/shared/path-util.h
+++ b/src/shared/path-util.h
@@ -53,8 +53,8 @@ char** path_strv_make_absolute_cwd(char **l);
char** path_strv_resolve(char **l, const char *prefix);
char** path_strv_resolve_uniq(char **l, const char *prefix);
-int fd_is_mount_point(int fd);
-int path_is_mount_point(const char *path, bool allow_symlink);
+int fd_is_mount_point(int fd, const char *filename, int flags);
+int path_is_mount_point(const char *path, int flags);
int path_is_read_only_fs(const char *path);
int path_is_os_tree(const char *path);
diff --git a/src/shared/process-util.c b/src/shared/process-util.c
index 92a69f50e7..cfc876567d 100644
--- a/src/shared/process-util.c
+++ b/src/shared/process-util.c
@@ -28,10 +28,11 @@
#include <signal.h>
#include <ctype.h>
-#include "process-util.h"
#include "fileio.h"
#include "util.h"
#include "log.h"
+#include "signal-util.h"
+#include "process-util.h"
int get_process_state(pid_t pid) {
const char *p;
diff --git a/src/shared/pty.c b/src/shared/pty.c
index 0f80f4863b..119d66e9a2 100644
--- a/src/shared/pty.c
+++ b/src/shared/pty.c
@@ -57,9 +57,10 @@
#include "barrier.h"
#include "macro.h"
-#include "pty.h"
#include "ring.h"
#include "util.h"
+#include "signal-util.h"
+#include "pty.h"
#define PTY_BUFSIZE 4096
diff --git a/src/shared/random-util.c b/src/shared/random-util.c
index 88f5182508..b230044f50 100644
--- a/src/shared/random-util.c
+++ b/src/shared/random-util.c
@@ -23,7 +23,9 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
+#ifdef HAVE_SYS_AUXV_H
#include <sys/auxv.h>
+#endif
#include <linux/random.h>
#include "random-util.h"
diff --git a/src/shared/rm-rf.c b/src/shared/rm-rf.c
index a89e8afc2a..bafd483be2 100644
--- a/src/shared/rm-rf.c
+++ b/src/shared/rm-rf.c
@@ -103,7 +103,7 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
}
/* Stop at mount points */
- r = fd_is_mount_point(subdir_fd);
+ r = fd_is_mount_point(fd, de->d_name, 0);
if (r < 0) {
if (ret == 0 && r != -ENOENT)
ret = r;
diff --git a/src/shared/signal-util.c b/src/shared/signal-util.c
new file mode 100644
index 0000000000..9a2973b6fd
--- /dev/null
+++ b/src/shared/signal-util.c
@@ -0,0 +1,228 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright 2015 Lennart Poettering
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "util.h"
+#include "signal-util.h"
+
+int reset_all_signal_handlers(void) {
+ int sig, r = 0;
+
+ for (sig = 1; sig < _NSIG; sig++) {
+ static const struct sigaction sa = {
+ .sa_handler = SIG_DFL,
+ .sa_flags = SA_RESTART,
+ };
+
+ /* These two cannot be caught... */
+ if (sig == SIGKILL || sig == SIGSTOP)
+ continue;
+
+ /* On Linux the first two RT signals are reserved by
+ * glibc, and sigaction() will return EINVAL for them. */
+ if ((sigaction(sig, &sa, NULL) < 0))
+ if (errno != EINVAL && r == 0)
+ r = -errno;
+ }
+
+ return r;
+}
+
+int reset_signal_mask(void) {
+ sigset_t ss;
+
+ if (sigemptyset(&ss) < 0)
+ return -errno;
+
+ if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0)
+ return -errno;
+
+ return 0;
+}
+
+int sigaction_many(const struct sigaction *sa, ...) {
+ va_list ap;
+ int r = 0, sig;
+
+ va_start(ap, sa);
+ while ((sig = va_arg(ap, int)) > 0)
+ if (sigaction(sig, sa, NULL) < 0)
+ r = -errno;
+ va_end(ap);
+
+ return r;
+}
+
+int ignore_signals(int sig, ...) {
+ static const struct sigaction sa = {
+ .sa_handler = SIG_IGN,
+ .sa_flags = SA_RESTART,
+ };
+ va_list ap;
+ int r = 0;
+
+ if (sigaction(sig, &sa, NULL) < 0)
+ r = -errno;
+
+ va_start(ap, sig);
+ while ((sig = va_arg(ap, int)) > 0)
+ if (sigaction(sig, &sa, NULL) < 0)
+ r = -errno;
+ va_end(ap);
+
+ return r;
+}
+
+int default_signals(int sig, ...) {
+ static const struct sigaction sa = {
+ .sa_handler = SIG_DFL,
+ .sa_flags = SA_RESTART,
+ };
+ va_list ap;
+ int r = 0;
+
+ if (sigaction(sig, &sa, NULL) < 0)
+ r = -errno;
+
+ va_start(ap, sig);
+ while ((sig = va_arg(ap, int)) > 0)
+ if (sigaction(sig, &sa, NULL) < 0)
+ r = -errno;
+ va_end(ap);
+
+ return r;
+}
+
+void sigset_add_many(sigset_t *ss, ...) {
+ va_list ap;
+ int sig;
+
+ assert(ss);
+
+ va_start(ap, ss);
+ while ((sig = va_arg(ap, int)) > 0)
+ assert_se(sigaddset(ss, sig) == 0);
+ va_end(ap);
+}
+
+int sigprocmask_many(int how, ...) {
+ va_list ap;
+ sigset_t ss;
+ int sig;
+
+ assert_se(sigemptyset(&ss) == 0);
+
+ va_start(ap, how);
+ while ((sig = va_arg(ap, int)) > 0)
+ assert_se(sigaddset(&ss, sig) == 0);
+ va_end(ap);
+
+ if (sigprocmask(how, &ss, NULL) < 0)
+ return -errno;
+
+ return 0;
+}
+
+static const char *const __signal_table[] = {
+ [SIGHUP] = "HUP",
+ [SIGINT] = "INT",
+ [SIGQUIT] = "QUIT",
+ [SIGILL] = "ILL",
+ [SIGTRAP] = "TRAP",
+ [SIGABRT] = "ABRT",
+ [SIGBUS] = "BUS",
+ [SIGFPE] = "FPE",
+ [SIGKILL] = "KILL",
+ [SIGUSR1] = "USR1",
+ [SIGSEGV] = "SEGV",
+ [SIGUSR2] = "USR2",
+ [SIGPIPE] = "PIPE",
+ [SIGALRM] = "ALRM",
+ [SIGTERM] = "TERM",
+#ifdef SIGSTKFLT
+ [SIGSTKFLT] = "STKFLT", /* Linux on SPARC doesn't know SIGSTKFLT */
+#endif
+ [SIGCHLD] = "CHLD",
+ [SIGCONT] = "CONT",
+ [SIGSTOP] = "STOP",
+ [SIGTSTP] = "TSTP",
+ [SIGTTIN] = "TTIN",
+ [SIGTTOU] = "TTOU",
+ [SIGURG] = "URG",
+ [SIGXCPU] = "XCPU",
+ [SIGXFSZ] = "XFSZ",
+ [SIGVTALRM] = "VTALRM",
+ [SIGPROF] = "PROF",
+ [SIGWINCH] = "WINCH",
+ [SIGIO] = "IO",
+ [SIGPWR] = "PWR",
+ [SIGSYS] = "SYS"
+};
+
+DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
+
+const char *signal_to_string(int signo) {
+ static thread_local char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
+ const char *name;
+
+ name = __signal_to_string(signo);
+ if (name)
+ return name;
+
+ if (signo >= SIGRTMIN && signo <= SIGRTMAX)
+ snprintf(buf, sizeof(buf), "RTMIN+%d", signo - SIGRTMIN);
+ else
+ snprintf(buf, sizeof(buf), "%d", signo);
+
+ return buf;
+}
+
+int signal_from_string(const char *s) {
+ int signo;
+ int offset = 0;
+ unsigned u;
+
+ signo = __signal_from_string(s);
+ if (signo > 0)
+ return signo;
+
+ if (startswith(s, "RTMIN+")) {
+ s += 6;
+ offset = SIGRTMIN;
+ }
+ if (safe_atou(s, &u) >= 0) {
+ signo = (int) u + offset;
+ if (signo > 0 && signo < _NSIG)
+ return signo;
+ }
+ return -EINVAL;
+}
+
+int signal_from_string_try_harder(const char *s) {
+ int signo;
+ assert(s);
+
+ signo = signal_from_string(s);
+ if (signo <= 0)
+ if (startswith(s, "SIG"))
+ return signal_from_string(s+3);
+
+ return signo;
+}
diff --git a/src/shared/signal-util.h b/src/shared/signal-util.h
new file mode 100644
index 0000000000..ddf64cda76
--- /dev/null
+++ b/src/shared/signal-util.h
@@ -0,0 +1,41 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+#pragma once
+
+/***
+ This file is part of systemd.
+
+ Copyright 2010-2015 Lennart Poettering
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <signal.h>
+
+#include "macro.h"
+
+int reset_all_signal_handlers(void);
+int reset_signal_mask(void);
+
+int ignore_signals(int sig, ...);
+int default_signals(int sig, ...);
+int sigaction_many(const struct sigaction *sa, ...);
+
+void sigset_add_many(sigset_t *ss, ...);
+int sigprocmask_many(int how, ...);
+
+const char *signal_to_string(int i) _const_;
+int signal_from_string(const char *s) _pure_;
+
+int signal_from_string_try_harder(const char *s);
diff --git a/src/shared/switch-root.c b/src/shared/switch-root.c
index ae3839de16..b12189cd10 100644
--- a/src/shared/switch-root.c
+++ b/src/shared/switch-root.c
@@ -105,7 +105,7 @@ int switch_root(const char *new_root, const char *oldroot, bool detach_oldroot,
* to look like. They might even boot, if they are RO and
* don't have the FS layout. Just ignore the error and
* switch_root() nevertheless. */
- (void) base_filesystem_create(new_root);
+ (void) base_filesystem_create(new_root, UID_INVALID, GID_INVALID);
if (chdir(new_root) < 0)
return log_error_errno(errno, "Failed to change directory to %s: %m", new_root);
diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c
index b23e47a2e6..bf52463d81 100644
--- a/src/shared/unit-name.c
+++ b/src/shared/unit-name.c
@@ -812,6 +812,8 @@ static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
[UNIT_PART_OF] = "PartOf",
[UNIT_REQUIRED_BY] = "RequiredBy",
[UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
+ [UNIT_REQUISITE_OF] = "RequisiteOf",
+ [UNIT_REQUISITE_OF_OVERRIDABLE] = "RequisiteOfOverridable",
[UNIT_WANTED_BY] = "WantedBy",
[UNIT_BOUND_BY] = "BoundBy",
[UNIT_CONSISTS_OF] = "ConsistsOf",
diff --git a/src/shared/unit-name.h b/src/shared/unit-name.h
index c2f31e3f90..b2043d0870 100644
--- a/src/shared/unit-name.h
+++ b/src/shared/unit-name.h
@@ -71,8 +71,10 @@ enum UnitDependency {
UNIT_PART_OF,
/* Inverse of the above */
- UNIT_REQUIRED_BY, /* inverse of 'requires' and 'requisite' is 'required_by' */
- UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' and 'requisite_overridable' is 'soft_required_by' */
+ UNIT_REQUIRED_BY, /* inverse of 'requires' is 'required_by' */
+ UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' is 'required_by_overridable' */
+ UNIT_REQUISITE_OF, /* inverse of 'requisite' is 'requisite_of' */
+ UNIT_REQUISITE_OF_OVERRIDABLE,/* inverse of 'requisite_overridable' is 'requisite_of_overridable' */
UNIT_WANTED_BY, /* inverse of 'wants' */
UNIT_BOUND_BY, /* inverse of 'binds_to' */
UNIT_CONSISTS_OF, /* inverse of 'part_of' */
diff --git a/src/shared/util.c b/src/shared/util.c
index da6343f4c4..8a6107969a 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -93,6 +93,7 @@
#include "random-util.h"
#include "terminal-util.h"
#include "hostname-util.h"
+#include "signal-util.h"
/* Put this test here for a lack of better place */
assert_cc(EAGAIN == EWOULDBLOCK);
@@ -148,6 +149,27 @@ char* endswith(const char *s, const char *postfix) {
return (char*) s + sl - pl;
}
+char* endswith_no_case(const char *s, const char *postfix) {
+ size_t sl, pl;
+
+ assert(s);
+ assert(postfix);
+
+ sl = strlen(s);
+ pl = strlen(postfix);
+
+ if (pl == 0)
+ return (char*) s + sl;
+
+ if (sl < pl)
+ return NULL;
+
+ if (strcasecmp(s + sl - pl, postfix) != 0)
+ return NULL;
+
+ return (char*) s + sl - pl;
+}
+
char* first_word(const char *s, const char *word) {
size_t sl, wl;
const char *p;
@@ -750,41 +772,6 @@ int readlink_and_canonicalize(const char *p, char **r) {
return 0;
}
-int reset_all_signal_handlers(void) {
- int sig, r = 0;
-
- for (sig = 1; sig < _NSIG; sig++) {
- struct sigaction sa = {
- .sa_handler = SIG_DFL,
- .sa_flags = SA_RESTART,
- };
-
- /* These two cannot be caught... */
- if (sig == SIGKILL || sig == SIGSTOP)
- continue;
-
- /* On Linux the first two RT signals are reserved by
- * glibc, and sigaction() will return EINVAL for them. */
- if ((sigaction(sig, &sa, NULL) < 0))
- if (errno != EINVAL && r == 0)
- r = -errno;
- }
-
- return r;
-}
-
-int reset_signal_mask(void) {
- sigset_t ss;
-
- if (sigemptyset(&ss) < 0)
- return -errno;
-
- if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0)
- return -errno;
-
- return 0;
-}
-
char *strstrip(char *s) {
char *e;
@@ -1540,59 +1527,6 @@ int flush_fd(int fd) {
}
}
-int sigaction_many(const struct sigaction *sa, ...) {
- va_list ap;
- int r = 0, sig;
-
- va_start(ap, sa);
- while ((sig = va_arg(ap, int)) > 0)
- if (sigaction(sig, sa, NULL) < 0)
- r = -errno;
- va_end(ap);
-
- return r;
-}
-
-int ignore_signals(int sig, ...) {
- struct sigaction sa = {
- .sa_handler = SIG_IGN,
- .sa_flags = SA_RESTART,
- };
- va_list ap;
- int r = 0;
-
- if (sigaction(sig, &sa, NULL) < 0)
- r = -errno;
-
- va_start(ap, sig);
- while ((sig = va_arg(ap, int)) > 0)
- if (sigaction(sig, &sa, NULL) < 0)
- r = -errno;
- va_end(ap);
-
- return r;
-}
-
-int default_signals(int sig, ...) {
- struct sigaction sa = {
- .sa_handler = SIG_DFL,
- .sa_flags = SA_RESTART,
- };
- va_list ap;
- int r = 0;
-
- if (sigaction(sig, &sa, NULL) < 0)
- r = -errno;
-
- va_start(ap, sig);
- while ((sig = va_arg(ap, int)) > 0)
- if (sigaction(sig, &sa, NULL) < 0)
- r = -errno;
- va_end(ap);
-
- return r;
-}
-
void safe_close_pair(int p[]) {
assert(p);
@@ -1697,7 +1631,7 @@ int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
int parse_size(const char *t, off_t base, off_t *size) {
- /* Soo, sometimes we want to parse IEC binary suffxies, and
+ /* Soo, sometimes we want to parse IEC binary suffixes, and
* sometimes SI decimal suffixes. This function can parse
* both. Which one is the right way depends on the
* context. Wikipedia suggests that SI is customary for
@@ -1906,35 +1840,6 @@ void rename_process(const char name[8]) {
}
}
-void sigset_add_many(sigset_t *ss, ...) {
- va_list ap;
- int sig;
-
- assert(ss);
-
- va_start(ap, ss);
- while ((sig = va_arg(ap, int)) > 0)
- assert_se(sigaddset(ss, sig) == 0);
- va_end(ap);
-}
-
-int sigprocmask_many(int how, ...) {
- va_list ap;
- sigset_t ss;
- int sig;
-
- assert_se(sigemptyset(&ss) == 0);
-
- va_start(ap, how);
- while ((sig = va_arg(ap, int)) > 0)
- assert_se(sigaddset(&ss, sig) == 0);
- va_end(ap);
-
- if (sigprocmask(how, &ss, NULL) < 0)
- return -errno;
-
- return 0;
-}
char *lookup_uid(uid_t uid) {
long bufsize;
char *name;
@@ -2323,18 +2228,6 @@ DIR *xopendirat(int fd, const char *name, int flags) {
return d;
}
-int signal_from_string_try_harder(const char *s) {
- int signo;
- assert(s);
-
- signo = signal_from_string(s);
- if (signo <= 0)
- if (startswith(s, "SIG"))
- return signal_from_string(s+3);
-
- return signo;
-}
-
static char *tag_to_udev_node(const char *tagvalue, const char *by) {
_cleanup_free_ char *t = NULL, *u = NULL;
size_t enc_len;
@@ -3291,81 +3184,6 @@ static const char* const ip_tos_table[] = {
DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(ip_tos, int, 0xff);
-static const char *const __signal_table[] = {
- [SIGHUP] = "HUP",
- [SIGINT] = "INT",
- [SIGQUIT] = "QUIT",
- [SIGILL] = "ILL",
- [SIGTRAP] = "TRAP",
- [SIGABRT] = "ABRT",
- [SIGBUS] = "BUS",
- [SIGFPE] = "FPE",
- [SIGKILL] = "KILL",
- [SIGUSR1] = "USR1",
- [SIGSEGV] = "SEGV",
- [SIGUSR2] = "USR2",
- [SIGPIPE] = "PIPE",
- [SIGALRM] = "ALRM",
- [SIGTERM] = "TERM",
-#ifdef SIGSTKFLT
- [SIGSTKFLT] = "STKFLT", /* Linux on SPARC doesn't know SIGSTKFLT */
-#endif
- [SIGCHLD] = "CHLD",
- [SIGCONT] = "CONT",
- [SIGSTOP] = "STOP",
- [SIGTSTP] = "TSTP",
- [SIGTTIN] = "TTIN",
- [SIGTTOU] = "TTOU",
- [SIGURG] = "URG",
- [SIGXCPU] = "XCPU",
- [SIGXFSZ] = "XFSZ",
- [SIGVTALRM] = "VTALRM",
- [SIGPROF] = "PROF",
- [SIGWINCH] = "WINCH",
- [SIGIO] = "IO",
- [SIGPWR] = "PWR",
- [SIGSYS] = "SYS"
-};
-
-DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
-
-const char *signal_to_string(int signo) {
- static thread_local char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
- const char *name;
-
- name = __signal_to_string(signo);
- if (name)
- return name;
-
- if (signo >= SIGRTMIN && signo <= SIGRTMAX)
- snprintf(buf, sizeof(buf), "RTMIN+%d", signo - SIGRTMIN);
- else
- snprintf(buf, sizeof(buf), "%d", signo);
-
- return buf;
-}
-
-int signal_from_string(const char *s) {
- int signo;
- int offset = 0;
- unsigned u;
-
- signo = __signal_from_string(s);
- if (signo > 0)
- return signo;
-
- if (startswith(s, "RTMIN+")) {
- s += 6;
- offset = SIGRTMIN;
- }
- if (safe_atou(s, &u) >= 0) {
- signo = (int) u + offset;
- if (signo > 0 && signo < _NSIG)
- return signo;
- }
- return -EINVAL;
-}
-
bool kexec_loaded(void) {
bool loaded = false;
char *s;
@@ -4665,16 +4483,7 @@ int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int root_fd) {
return -errno;
}
- if (setresgid(0, 0, 0) < 0)
- return -errno;
-
- if (setgroups(0, NULL) < 0)
- return -errno;
-
- if (setresuid(0, 0, 0) < 0)
- return -errno;
-
- return 0;
+ return reset_uid_gid();
}
int getpeercred(int fd, struct ucred *ucred) {
@@ -4825,10 +4634,7 @@ unsigned long personality_from_string(const char *p) {
return PER_LINUX;
#endif
- /* personality(7) documents that 0xffffffffUL is used for
- * querying the current personality, hence let's use that here
- * as error indicator. */
- return 0xffffffffUL;
+ return PERSONALITY_INVALID;
}
const char* personality_to_string(unsigned long p) {
@@ -5878,7 +5684,7 @@ int same_fd(int a, int b) {
/* The fds refer to the same inode on disk, let's also check
* if they have the same fd flags. This is useful to
- * distuingish the read and write side of a pipe created with
+ * distinguish the read and write side of a pipe created with
* pipe(). */
fa = fcntl(a, F_GETFL);
if (fa < 0)
@@ -6208,3 +6014,35 @@ int parse_mode(const char *s, mode_t *ret) {
*ret = (mode_t) l;
return 0;
}
+
+int mount_move_root(const char *path) {
+ assert(path);
+
+ if (chdir(path) < 0)
+ return -errno;
+
+ if (mount(path, "/", NULL, MS_MOVE, NULL) < 0)
+ return -errno;
+
+ if (chroot(".") < 0)
+ return -errno;
+
+ if (chdir("/") < 0)
+ return -errno;
+
+ return 0;
+}
+
+int reset_uid_gid(void) {
+
+ if (setgroups(0, NULL) < 0)
+ return -errno;
+
+ if (setresgid(0, 0, 0) < 0)
+ return -errno;
+
+ if (setresuid(0, 0, 0) < 0)
+ return -errno;
+
+ return 0;
+}
diff --git a/src/shared/util.h b/src/shared/util.h
index a2b1ec5030..467ae234a0 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -29,7 +29,6 @@
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
-#include <signal.h>
#include <sched.h>
#include <limits.h>
#include <sys/types.h>
@@ -134,6 +133,7 @@ static inline char *startswith_no_case(const char *s, const char *prefix) {
}
char *endswith(const char *s, const char *postfix) _pure_;
+char *endswith_no_case(const char *s, const char *postfix) _pure_;
char *first_word(const char *s, const char *word) _pure_;
@@ -226,9 +226,6 @@ int readlink_value(const char *p, char **ret);
int readlink_and_make_absolute(const char *p, char **r);
int readlink_and_canonicalize(const char *p, char **r);
-int reset_all_signal_handlers(void);
-int reset_signal_mask(void);
-
char *strstrip(char *s);
char *delete_chars(char *s, const char *bad);
char *truncate_nl(char *s);
@@ -333,10 +330,6 @@ bool fstype_is_network(const char *fstype);
int flush_fd(int fd);
-int ignore_signals(int sig, ...);
-int default_signals(int sig, ...);
-int sigaction_many(const struct sigaction *sa, ...);
-
int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll);
@@ -348,9 +341,6 @@ bool is_device_path(const char *path);
int dir_is_empty(const char *path);
char* dirname_malloc(const char *path);
-void sigset_add_many(sigset_t *ss, ...);
-int sigprocmask_many(int how, ...);
-
char* lookup_uid(uid_t uid);
char* getlogname_malloc(void);
char* getusername_malloc(void);
@@ -464,11 +454,6 @@ int rlimit_from_string(const char *s) _pure_;
int ip_tos_to_string_alloc(int i, char **s);
int ip_tos_from_string(const char *s);
-const char *signal_to_string(int i) _const_;
-int signal_from_string(const char *s) _pure_;
-
-int signal_from_string_try_harder(const char *s);
-
extern int saved_argc;
extern char **saved_argv;
@@ -774,7 +759,7 @@ int shall_restore_state(void);
* that only if nmemb > 0.
*/
static inline void qsort_safe(void *base, size_t nmemb, size_t size, comparison_fn_t compar) {
- if (nmemb <= 0)
+ if (nmemb <= 1)
return;
assert(base);
@@ -815,6 +800,13 @@ int open_tmpfile(const char *path, int flags);
int fd_warn_permissions(const char *path, int fd);
+#ifndef PERSONALITY_INVALID
+/* personality(7) documents that 0xffffffffUL is used for querying the
+ * current personality, hence let's use that here as error
+ * indicator. */
+#define PERSONALITY_INVALID 0xffffffffLU
+#endif
+
unsigned long personality_from_string(const char *p);
const char *personality_to_string(unsigned long);
@@ -905,3 +897,7 @@ int rename_noreplace(int olddirfd, const char *oldpath, int newdirfd, const char
char *shell_maybe_quote(const char *s);
int parse_mode(const char *s, mode_t *ret);
+
+int mount_move_root(const char *path);
+
+int reset_uid_gid(void);
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index f8e10a4710..a7b8e54a9c 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -72,6 +72,7 @@
#include "process-util.h"
#include "terminal-util.h"
#include "hostname-util.h"
+#include "signal-util.h"
static char **arg_types = NULL;
static char **arg_states = NULL;
@@ -5098,7 +5099,7 @@ static int import_environment(sd_bus *bus, char **args) {
static int enable_sysv_units(const char *verb, char **args) {
int r = 0;
-#if defined(HAVE_SYSV_COMPAT) && defined(HAVE_CHKCONFIG)
+#if defined(HAVE_SYSV_COMPAT)
unsigned f = 0;
_cleanup_lookup_paths_free_ LookupPaths paths = {};
@@ -5123,7 +5124,7 @@ static int enable_sysv_units(const char *verb, char **args) {
_cleanup_free_ char *p = NULL, *q = NULL, *l = NULL;
bool found_native = false, found_sysv;
unsigned c = 1;
- const char *argv[6] = { "/sbin/chkconfig", NULL, NULL, NULL, NULL };
+ const char *argv[6] = { ROOTLIBEXECDIR "/systemd-sysv-install", NULL, NULL, NULL, NULL };
char **k;
int j;
pid_t pid;
@@ -5149,7 +5150,10 @@ static int enable_sysv_units(const char *verb, char **args) {
break;
}
- if (found_native)
+ /* If we have both a native unit and a SysV script,
+ * enable/disable them both (below); for is-enabled, prefer the
+ * native unit */
+ if (found_native && streq(verb, "is-enabled"))
continue;
p = path_join(arg_root, SYSTEM_SYSVINIT_PATH, name);
@@ -5161,15 +5165,16 @@ static int enable_sysv_units(const char *verb, char **args) {
if (!found_sysv)
continue;
- log_info("%s is not a native service, redirecting to /sbin/chkconfig.", name);
+ if (found_native)
+ log_info("Synchronizing state of %s with SysV init with %s...", name, argv[0]);
+ else
+ log_info("%s is not a native service, redirecting to systemd-sysv-install", name);
if (!isempty(arg_root))
argv[c++] = q = strappend("--root=", arg_root);
+ argv[c++] = verb;
argv[c++] = basename(p);
- argv[c++] =
- streq(verb, "enable") ? "on" :
- streq(verb, "disable") ? "off" : "--level=5";
argv[c] = NULL;
l = strv_join((char**)argv, " ");
@@ -5185,6 +5190,7 @@ static int enable_sysv_units(const char *verb, char **args) {
/* Child */
execv(argv[0], (char**) argv);
+ log_error("Failed to execute %s: %m", argv[0]);
_exit(EXIT_FAILURE);
}
@@ -5210,6 +5216,9 @@ static int enable_sysv_units(const char *verb, char **args) {
} else
return -EPROTO;
+ if (found_native)
+ continue;
+
/* Remove this entry, so that we don't try enabling it as native unit */
assert(f > 0);
f--;
diff --git a/src/systemctl/systemd-sysv-install.SKELETON b/src/systemctl/systemd-sysv-install.SKELETON
new file mode 100755
index 0000000000..a53a3e6221
--- /dev/null
+++ b/src/systemctl/systemd-sysv-install.SKELETON
@@ -0,0 +1,47 @@
+#!/bin/sh
+# This script is called by "systemctl enable/disable" when the given unit is a
+# SysV init.d script. It needs to call the distribution's mechanism for
+# enabling/disabling those, such as chkconfig, update-rc.d, or similar. This
+# can optionally take a --root argument for enabling a SysV init script
+# in a chroot or similar.
+set -e
+
+usage() {
+ echo "Usage: $0 [--root=path] enable|disable|is-enabled <sysv script name>" >&2
+ exit 1
+}
+
+# parse options
+eval set -- "$(getopt -o r: --long root: -- "$@")"
+while true; do
+ case "$1" in
+ -r|--root)
+ ROOT="$2"
+ shift 2 ;;
+ --) shift ; break ;;
+ *) usage ;;
+ esac
+done
+
+NAME="$2"
+[ -n "$NAME" ] || usage
+
+case "$1" in
+ enable)
+ # call the command to enable SysV init script $NAME here
+ # (consider optional $ROOT)
+ echo "IMPLEMENT ME: enabling SysV init.d script $NAME"
+ ;;
+ disable)
+ # call the command to disable SysV init script $NAME here
+ # (consider optional $ROOT)
+ echo "IMPLEMENT ME: disabling SysV init.d script $NAME"
+ ;;
+ is-enabled)
+ # exit with 0 if $NAME is enabled, non-zero if it is disabled
+ # (consider optional $ROOT)
+ echo "IMPLEMENT ME: checking SysV init.d script $NAME"
+ ;;
+ *)
+ usage ;;
+esac
diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h
index 9dadae9e59..e6e2ecd0b7 100644
--- a/src/systemd/sd-bus.h
+++ b/src/systemd/sd-bus.h
@@ -141,10 +141,10 @@ int sd_bus_set_monitor(sd_bus *bus, int b);
int sd_bus_is_monitor(sd_bus *bus);
int sd_bus_set_description(sd_bus *bus, const char *description);
int sd_bus_get_description(sd_bus *bus, const char **description);
+int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t creds_mask);
+int sd_bus_negotiate_timestamp(sd_bus *bus, int b);
int sd_bus_negotiate_fds(sd_bus *bus, int b);
int sd_bus_can_send(sd_bus *bus, char type);
-int sd_bus_negotiate_timestamp(sd_bus *bus, int b);
-int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t creds_mask);
int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *creds_mask);
int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b);
int sd_bus_get_allow_interactive_authorization(sd_bus *bus);
@@ -303,7 +303,7 @@ int sd_bus_get_property(sd_bus *bus, const char *destination, const char *path,
int sd_bus_get_property_trivial(sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *ret_error, char type, void *ret_ptr);
int sd_bus_get_property_string(sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *ret_error, char **ret); /* free the result! */
int sd_bus_get_property_strv(sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *ret_error, char ***ret); /* free the result! */
-int sd_bus_set_property(sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *ret_error, const char *ret_type, ...);
+int sd_bus_set_property(sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *ret_error, const char *type, ...);
int sd_bus_reply_method_return(sd_bus_message *call, const char *types, ...);
int sd_bus_reply_method_error(sd_bus_message *call, const sd_bus_error *e);
diff --git a/src/test/test-conf-parser.c b/src/test/test-conf-parser.c
new file mode 100644
index 0000000000..463906d304
--- /dev/null
+++ b/src/test/test-conf-parser.c
@@ -0,0 +1,234 @@
+/***
+ This file is part of systemd.
+
+ Copyright 2015 Ronny Chevalier
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "conf-parser.h"
+#include "macro.h"
+#include "util.h"
+#include "strv.h"
+#include "log.h"
+
+static void test_config_parse_path_one(const char *rvalue, const char *expected) {
+ char *path = NULL;
+
+ assert_se(config_parse_path("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &path, NULL) >= 0);
+ assert_se(streq_ptr(expected, path));
+
+ free(path);
+}
+
+static void test_config_parse_log_level_one(const char *rvalue, int expected) {
+ int log_level = 0;
+
+ assert_se(config_parse_log_level("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &log_level, NULL) >= 0);
+ assert_se(expected == log_level);
+}
+
+static void test_config_parse_log_facility_one(const char *rvalue, int expected) {
+ int log_facility = 0;
+
+ assert_se(config_parse_log_facility("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &log_facility, NULL) >= 0);
+ assert_se(expected == log_facility);
+}
+
+static void test_config_parse_iec_size_one(const char *rvalue, size_t expected) {
+ size_t iec_size = 0;
+
+ assert_se(config_parse_iec_size("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &iec_size, NULL) >= 0);
+ assert_se(expected == iec_size);
+}
+
+static void test_config_parse_si_size_one(const char *rvalue, size_t expected) {
+ size_t si_size = 0;
+
+ assert_se(config_parse_si_size("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &si_size, NULL) >= 0);
+ assert_se(expected == si_size);
+}
+
+static void test_config_parse_int_one(const char *rvalue, int expected) {
+ int v = -1;
+
+ assert_se(config_parse_int("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &v, NULL) >= 0);
+ assert_se(expected == v);
+}
+
+static void test_config_parse_unsigned_one(const char *rvalue, unsigned expected) {
+ unsigned v = 0;
+
+ assert_se(config_parse_unsigned("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &v, NULL) >= 0);
+ assert_se(expected == v);
+}
+
+static void test_config_parse_strv_one(const char *rvalue, char **expected) {
+ char **strv = 0;
+
+ assert_se(config_parse_strv("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &strv, NULL) >= 0);
+ assert_se(strv_equal(expected, strv));
+
+ strv_free(strv);
+}
+
+static void test_config_parse_mode_one(const char *rvalue, mode_t expected) {
+ mode_t v = 0;
+
+ assert_se(config_parse_mode("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &v, NULL) >= 0);
+ assert_se(expected == v);
+}
+
+static void test_config_parse_sec_one(const char *rvalue, usec_t expected) {
+ usec_t v = 0;
+
+ assert_se(config_parse_sec("unit", "filename", 1, "section", 1, "lvalue", 0, rvalue, &v, NULL) >= 0);
+ assert_se(expected == v);
+}
+
+static void test_config_parse_nsec_one(const char *rvalue, nsec_t expected) {
+ nsec_t v = 0;
+
+ assert_se(config_parse_nsec("unit", "filename", 1, "nsection", 1, "lvalue", 0, rvalue, &v, NULL) >= 0);
+ assert_se(expected == v);
+}
+
+static void test_config_parse_path(void) {
+ test_config_parse_path_one("/path", "/path");
+ test_config_parse_path_one("/path//////////", "/path");
+ test_config_parse_path_one("///path/foo///bar////bar//", "/path/foo/bar/bar");
+
+ test_config_parse_path_one("not_absolute/path", NULL);
+}
+
+static void test_config_parse_log_level(void) {
+ test_config_parse_log_level_one("debug", LOG_DEBUG);
+ test_config_parse_log_level_one("info", LOG_INFO);
+
+ test_config_parse_log_level_one("garbage", 0);
+}
+
+static void test_config_parse_log_facility(void) {
+ test_config_parse_log_facility_one("mail", LOG_MAIL);
+ test_config_parse_log_facility_one("user", LOG_USER);
+
+ test_config_parse_log_facility_one("garbage", 0);
+}
+
+static void test_config_parse_iec_size(void) {
+ test_config_parse_iec_size_one("1024", 1024);
+ test_config_parse_iec_size_one("2K", 2048);
+ test_config_parse_iec_size_one("10M", 10 * 1024 * 1024);
+ test_config_parse_iec_size_one("1G", 1 * 1024 * 1024 * 1024);
+ test_config_parse_iec_size_one("0G", 0);
+ test_config_parse_iec_size_one("0", 0);
+
+ test_config_parse_iec_size_one("-982", 0);
+ test_config_parse_iec_size_one("49874444198739873000000G", 0);
+ test_config_parse_iec_size_one("garbage", 0);
+}
+
+static void test_config_parse_si_size(void) {
+ test_config_parse_si_size_one("1024", 1024);
+ test_config_parse_si_size_one("2K", 2000);
+ test_config_parse_si_size_one("10M", 10 * 1000 * 1000);
+ test_config_parse_si_size_one("1G", 1 * 1000 * 1000 * 1000);
+ test_config_parse_si_size_one("0G", 0);
+ test_config_parse_si_size_one("0", 0);
+
+ test_config_parse_si_size_one("-982", 0);
+ test_config_parse_si_size_one("49874444198739873000000G", 0);
+ test_config_parse_si_size_one("garbage", 0);
+}
+
+static void test_config_parse_int(void) {
+ test_config_parse_int_one("1024", 1024);
+ test_config_parse_int_one("-1024", -1024);
+ test_config_parse_int_one("0", 0);
+
+ test_config_parse_int_one("99999999999999999999999999999999999999999999999999999999", -1);
+ test_config_parse_int_one("-99999999999999999999999999999999999999999999999999999999", -1);
+ test_config_parse_int_one("1G", -1);
+ test_config_parse_int_one("garbage", -1);
+}
+
+static void test_config_parse_unsigned(void) {
+ test_config_parse_unsigned_one("10241024", 10241024);
+ test_config_parse_unsigned_one("1024", 1024);
+ test_config_parse_unsigned_one("0", 0);
+
+ test_config_parse_unsigned_one("99999999999999999999999999999999999999999999999999999999", 0);
+ test_config_parse_unsigned_one("1G", 0);
+ test_config_parse_unsigned_one("garbage", 0);
+ test_config_parse_unsigned_one("1000garbage", 0);
+}
+
+static void test_config_parse_strv(void) {
+ test_config_parse_strv_one("", STRV_MAKE_EMPTY);
+ test_config_parse_strv_one("foo", STRV_MAKE("foo"));
+ test_config_parse_strv_one("foo bar foo", STRV_MAKE("foo", "bar", "foo"));
+ test_config_parse_strv_one("\"foo bar\" foo", STRV_MAKE("foo bar", "foo"));
+}
+
+static void test_config_parse_mode(void) {
+ test_config_parse_mode_one("777", 0777);
+ test_config_parse_mode_one("644", 0644);
+
+ test_config_parse_mode_one("-777", 0);
+ test_config_parse_mode_one("999", 0);
+ test_config_parse_mode_one("garbage", 0);
+ test_config_parse_mode_one("777garbage", 0);
+ test_config_parse_mode_one("777 garbage", 0);
+}
+
+static void test_config_parse_sec(void) {
+ test_config_parse_sec_one("1", 1 * USEC_PER_SEC);
+ test_config_parse_sec_one("1s", 1 * USEC_PER_SEC);
+ test_config_parse_sec_one("100ms", 100 * USEC_PER_MSEC);
+ test_config_parse_sec_one("5min 20s", 5 * 60 * USEC_PER_SEC + 20 * USEC_PER_SEC);
+
+ test_config_parse_sec_one("-1", 0);
+ test_config_parse_sec_one("10foo", 0);
+ test_config_parse_sec_one("garbage", 0);
+}
+
+static void test_config_parse_nsec(void) {
+ test_config_parse_nsec_one("1", 1);
+ test_config_parse_nsec_one("1s", 1 * NSEC_PER_SEC);
+ test_config_parse_nsec_one("100ms", 100 * NSEC_PER_MSEC);
+ test_config_parse_nsec_one("5min 20s", 5 * 60 * NSEC_PER_SEC + 20 * NSEC_PER_SEC);
+
+ test_config_parse_nsec_one("-1", 0);
+ test_config_parse_nsec_one("10foo", 0);
+ test_config_parse_nsec_one("garbage", 0);
+}
+
+int main(int argc, char **argv) {
+ log_parse_environment();
+ log_open();
+
+ test_config_parse_path();
+ test_config_parse_log_level();
+ test_config_parse_log_facility();
+ test_config_parse_iec_size();
+ test_config_parse_si_size();
+ test_config_parse_int();
+ test_config_parse_unsigned();
+ test_config_parse_strv();
+ test_config_parse_mode();
+ test_config_parse_sec();
+ test_config_parse_nsec();
+
+ return 0;
+}
diff --git a/src/test/test-fdset.c b/src/test/test-fdset.c
index 91df7eb663..242c5d9dc2 100644
--- a/src/test/test-fdset.c
+++ b/src/test/test-fdset.c
@@ -154,6 +154,56 @@ static void test_fdset_iterate(void) {
unlink(name);
}
+static void test_fdset_isempty(void) {
+ int fd;
+ _cleanup_fdset_free_ FDSet *fdset = NULL;
+ char name[] = "/tmp/test-fdset_isempty.XXXXXX";
+
+ fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+ assert_se(fd >= 0);
+
+ fdset = fdset_new();
+ assert_se(fdset);
+
+ assert_se(fdset_isempty(fdset));
+ assert_se(fdset_put(fdset, fd) >= 0);
+ assert_se(!fdset_isempty(fdset));
+
+ unlink(name);
+}
+
+static void test_fdset_steal_first(void) {
+ int fd;
+ _cleanup_fdset_free_ FDSet *fdset = NULL;
+ char name[] = "/tmp/test-fdset_steal_first.XXXXXX";
+
+ fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+ assert_se(fd >= 0);
+
+ fdset = fdset_new();
+ assert_se(fdset);
+
+ assert_se(fdset_steal_first(fdset) < 0);
+ assert_se(fdset_put(fdset, fd) >= 0);
+ assert_se(fdset_steal_first(fdset) == fd);
+ assert_se(fdset_steal_first(fdset) < 0);
+ assert_se(fdset_put(fdset, fd) >= 0);
+
+ unlink(name);
+}
+
+static void test_fdset_new_array(void) {
+ int fds[] = {10, 11, 12, 13};
+ _cleanup_fdset_free_ FDSet *fdset = NULL;
+
+ assert_se(fdset_new_array(&fdset, fds, 4) >= 0);
+ assert_se(fdset_size(fdset) == 4);
+ assert_se(fdset_contains(fdset, 10));
+ assert_se(fdset_contains(fdset, 11));
+ assert_se(fdset_contains(fdset, 12));
+ assert_se(fdset_contains(fdset, 13));
+}
+
int main(int argc, char *argv[]) {
test_fdset_new_fill();
test_fdset_put_dup();
@@ -161,6 +211,9 @@ int main(int argc, char *argv[]) {
test_fdset_close_others();
test_fdset_remove();
test_fdset_iterate();
+ test_fdset_isempty();
+ test_fdset_steal_first();
+ test_fdset_new_array();
return 0;
}
diff --git a/src/test/test-hashmap-plain.c b/src/test/test-hashmap-plain.c
index 84b508f874..c1a5ccf1f5 100644
--- a/src/test/test-hashmap-plain.c
+++ b/src/test/test-hashmap-plain.c
@@ -682,7 +682,7 @@ static void test_hashmap_get2(void) {
r = hashmap_get2(m, key_orig, &key_copy);
assert_se(streq(r, val));
assert_se(key_orig != key_copy);
- assert_se(streq(key_orig, key_orig));
+ assert_se(streq(key_orig, key_copy));
r = hashmap_get2(m, "no such key", NULL);
assert_se(r == NULL);
diff --git a/src/test/test-json.c b/src/test/test-json.c
index 24dc7003bc..1058c583c3 100644
--- a/src/test/test-json.c
+++ b/src/test/test-json.c
@@ -72,6 +72,97 @@ static void test_one(const char *data, ...) {
va_end(ap);
}
+typedef void (*Test)(JsonVariant *);
+
+static void test_file(const char *data, Test test) {
+ _cleanup_json_variant_unref_ JsonVariant *v = NULL;
+ int r;
+
+ r = json_parse(data, &v);
+ assert_se(r == 0);
+ assert_se(v != NULL);
+ assert_se(v->type == JSON_VARIANT_OBJECT);
+
+ if (test)
+ test(v);
+}
+
+static void test_1(JsonVariant *v) {
+ JsonVariant *p, *q;
+ unsigned i;
+
+ /* 3 keys + 3 values */
+ assert_se(v->size == 6);
+
+ /* has k */
+ p = json_variant_value(v, "k");
+ assert_se(p && p->type == JSON_VARIANT_STRING);
+
+ /* k equals v */
+ assert_se(streq(json_variant_string(p), "v"));
+
+ /* has foo */
+ p = json_variant_value(v, "foo");
+ assert_se(p && p->type == JSON_VARIANT_ARRAY && p->size == 3);
+
+ /* check foo[0] = 1, foo[1] = 2, foo[2] = 3 */
+ for (i = 0; i < 3; ++i) {
+ q = json_variant_element(p, i);
+ assert_se(q && q->type == JSON_VARIANT_INTEGER && json_variant_integer(q) == (i+1));
+ }
+
+ /* has bar */
+ p = json_variant_value(v, "bar");
+ assert_se(p && p->type == JSON_VARIANT_OBJECT && p->size == 2);
+
+ /* zap is null */
+ q = json_variant_value(p, "zap");
+ assert_se(q && q->type == JSON_VARIANT_NULL);
+}
+
+static void test_2(JsonVariant *v) {
+ JsonVariant *p, *q;
+
+ /* 2 keys + 2 values */
+ assert_se(v->size == 4);
+
+ /* has mutant */
+ p = json_variant_value(v, "mutant");
+ assert_se(p && p->type == JSON_VARIANT_ARRAY && p->size == 4);
+
+ /* mutant[0] == 1 */
+ q = json_variant_element(p, 0);
+ assert_se(q && q->type == JSON_VARIANT_INTEGER && json_variant_integer(q) == 1);
+
+ /* mutant[1] == null */
+ q = json_variant_element(p, 1);
+ assert_se(q && q->type == JSON_VARIANT_NULL);
+
+ /* mutant[2] == "1" */
+ q = json_variant_element(p, 2);
+ assert_se(q && q->type == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
+
+ /* mutant[3] == JSON_VARIANT_OBJECT */
+ q = json_variant_element(p, 3);
+ assert_se(q && q->type == JSON_VARIANT_OBJECT && q->size == 2);
+
+ /* has 1 */
+ p = json_variant_value(q, "1");
+ assert_se(p && p->type == JSON_VARIANT_ARRAY && p->size == 2);
+
+ /* "1"[0] == 1 */
+ q = json_variant_element(p, 0);
+ assert_se(q && q->type == JSON_VARIANT_INTEGER && json_variant_integer(q) == 1);
+
+ /* "1"[1] == "1" */
+ q = json_variant_element(p, 1);
+ assert_se(q && q->type == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
+
+ /* has blah */
+ p = json_variant_value(v, "blah");
+ assert_se(p && p->type == JSON_VARIANT_REAL && fabs(json_variant_real(p) - 1.27) < 0.001);
+}
+
int main(int argc, char *argv[]) {
test_one("x", -EINVAL);
@@ -102,5 +193,10 @@ int main(int argc, char *argv[]) {
test_one("\"\\udc00\\udc00\"", -EINVAL);
test_one("\"\\ud801\\udc37\"", JSON_STRING, "\xf0\x90\x90\xb7", JSON_END);
+ test_one("[1, 2]", JSON_ARRAY_OPEN, JSON_INTEGER, (intmax_t) 1, JSON_COMMA, JSON_INTEGER, (intmax_t) 2, JSON_ARRAY_CLOSE, JSON_END);
+
+ test_file("{\"k\": \"v\", \"foo\": [1, 2, 3], \"bar\": {\"zap\": null}}", test_1);
+ test_file("{\"mutant\": [1, null, \"1\", {\"1\": [1, \"1\"]}], \"blah\": 1.27}", test_2);
+
return 0;
}
diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c
index 09f0f2f89e..0045ae6824 100644
--- a/src/test/test-path-util.c
+++ b/src/test/test-path-util.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <unistd.h>
+#include <sys/mount.h>
#include "path-util.h"
#include "util.h"
@@ -88,21 +89,9 @@ static void test_path(void) {
test_parent("/aa///file...", "/aa///");
test_parent("file.../", NULL);
- assert_se(path_is_mount_point("/", true) > 0);
- assert_se(path_is_mount_point("/", false) > 0);
-
fd = open("/", O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY);
assert_se(fd >= 0);
- assert_se(fd_is_mount_point(fd) > 0);
-
- assert_se(path_is_mount_point("/proc", true) > 0);
- assert_se(path_is_mount_point("/proc", false) > 0);
-
- assert_se(path_is_mount_point("/proc/1", true) == 0);
- assert_se(path_is_mount_point("/proc/1", false) == 0);
-
- assert_se(path_is_mount_point("/sys", true) > 0);
- assert_se(path_is_mount_point("/sys", false) > 0);
+ assert_se(fd_is_mount_point(fd, "/", 0) > 0);
{
char p1[] = "aaa/bbb////ccc";
@@ -322,6 +311,66 @@ static void test_prefix_root(void) {
test_prefix_root_one("/foo///", "//bar", "/foo/bar");
}
+static void test_path_is_mount_point(void) {
+ int fd, rt, rf, rlt, rlf;
+ char tmp_dir[] = "/tmp/test-path-is-mount-point-XXXXXX";
+ _cleanup_free_ char *file1 = NULL, *file2 = NULL, *link1 = NULL, *link2 = NULL;
+
+ assert_se(path_is_mount_point("/", AT_SYMLINK_FOLLOW) > 0);
+ assert_se(path_is_mount_point("/", 0) > 0);
+
+ assert_se(path_is_mount_point("/proc", AT_SYMLINK_FOLLOW) > 0);
+ assert_se(path_is_mount_point("/proc", 0) > 0);
+
+ assert_se(path_is_mount_point("/proc/1", AT_SYMLINK_FOLLOW) == 0);
+ assert_se(path_is_mount_point("/proc/1", 0) == 0);
+
+ assert_se(path_is_mount_point("/sys", AT_SYMLINK_FOLLOW) > 0);
+ assert_se(path_is_mount_point("/sys", 0) > 0);
+
+ /* file mountpoints */
+ assert_se(mkdtemp(tmp_dir) != NULL);
+ file1 = path_join(NULL, tmp_dir, "file1");
+ assert_se(file1);
+ file2 = path_join(NULL, tmp_dir, "file2");
+ assert_se(file2);
+ fd = open(file1, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
+ assert_se(fd > 0);
+ close(fd);
+ fd = open(file2, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
+ assert_se(fd > 0);
+ close(fd);
+ link1 = path_join(NULL, tmp_dir, "link1");
+ assert_se(link1);
+ assert_se(symlink("file1", link1) == 0);
+ link2 = path_join(NULL, tmp_dir, "link2");
+ assert_se(link1);
+ assert_se(symlink("file2", link2) == 0);
+
+ assert_se(path_is_mount_point(file1, AT_SYMLINK_FOLLOW) == 0);
+ assert_se(path_is_mount_point(file1, 0) == 0);
+ assert_se(path_is_mount_point(link1, AT_SYMLINK_FOLLOW) == 0);
+ assert_se(path_is_mount_point(link1, 0) == 0);
+
+ /* this test will only work as root */
+ if (mount(file1, file2, NULL, MS_BIND, NULL) >= 0) {
+ rf = path_is_mount_point(file2, 0);
+ rt = path_is_mount_point(file2, AT_SYMLINK_FOLLOW);
+ rlf = path_is_mount_point(link2, 0);
+ rlt = path_is_mount_point(link2, AT_SYMLINK_FOLLOW);
+
+ assert_se(umount(file2) == 0);
+
+ assert_se(rf == 1);
+ assert_se(rt == 1);
+ assert_se(rlf == 0);
+ assert_se(rlt == 1);
+ } else
+ printf("Skipping bind mount file test: %m\n");
+
+ assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
+}
+
int main(int argc, char **argv) {
test_path();
test_find_binary(argv[0], true);
@@ -333,6 +382,7 @@ int main(int argc, char **argv) {
test_strv_resolve();
test_path_startswith();
test_prefix_root();
+ test_path_is_mount_point();
return 0;
}
diff --git a/src/test/test-pty.c b/src/test/test-pty.c
index b5f4d4f094..f8807c9150 100644
--- a/src/test/test-pty.c
+++ b/src/test/test-pty.c
@@ -27,6 +27,7 @@
#include "pty.h"
#include "util.h"
+#include "signal-util.h"
static const char sndmsg[] = "message\n";
static const char rcvmsg[] = "message\r\n";
diff --git a/src/test/test-udev.c b/src/test/test-udev.c
index 23b7faa939..f3953fe26a 100644
--- a/src/test/test-udev.c
+++ b/src/test/test-udev.c
@@ -120,11 +120,6 @@ int main(int argc, char *argv[]) {
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, &sigmask_orig);
- event->fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
- if (event->fd_signal < 0) {
- fprintf(stderr, "error creating signalfd\n");
- goto out;
- }
/* do what devtmpfs usually provides us */
if (udev_device_get_devnode(dev) != NULL) {
@@ -153,8 +148,6 @@ int main(int argc, char *argv[]) {
3 * USEC_PER_SEC, USEC_PER_SEC,
NULL);
out:
- if (event != NULL && event->fd_signal >= 0)
- close(event->fd_signal);
mac_selinux_finish();
return err ? EXIT_FAILURE : EXIT_SUCCESS;
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index a9711ac9f5..31b12d50d7 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -225,6 +225,15 @@ static void test_config_parse_exec(void) {
check_execcommand(c1,
"/sbin/find", NULL, ";", "x", false);
+ log_info("/* encoded semicolon */");
+ r = config_parse_exec(NULL, "fake", 5, "section", 1,
+ "LValue", 0,
+ "/bin/find \\073",
+ &c, NULL);
+ assert_se(r >= 0);
+ c1 = c1->command_next;
+ check_execcommand(c1, "/bin/find", NULL, "\\073", NULL, false);
+
log_info("/* spaces in the filename */");
r = config_parse_exec(NULL, "fake", 5, "section", 1,
"LValue", 0,
@@ -296,6 +305,16 @@ static void test_config_parse_exec(void) {
c1 = c1->command_next;
check_execcommand(c1, "/path ", NULL, NULL, NULL, false);
+ log_info("/* quoted backslashes */");
+ r = config_parse_exec(NULL, "fake", 5, "section", 1,
+ "LValue", 0,
+ "/bin/grep '\\w+\\K'",
+ &c, NULL);
+ assert_se(r >= 0);
+ c1 = c1->command_next;
+ check_execcommand(c1, "/bin/grep", NULL, "\\w+\\K", NULL, false);
+
+
log_info("/* trailing backslash: \\ */");
/* backslash is invalid */
r = config_parse_exec(NULL, "fake", 4, "section", 1,
diff --git a/src/test/test-util.c b/src/test/test-util.c
index 9af3e757e3..e0269821d7 100644
--- a/src/test/test-util.c
+++ b/src/test/test-util.c
@@ -39,6 +39,7 @@
#include "virt.h"
#include "process-util.h"
#include "hostname-util.h"
+#include "signal-util.h"
static void test_streq_ptr(void) {
assert_se(streq_ptr(NULL, NULL));
@@ -549,6 +550,59 @@ static void test_hostname_is_valid(void) {
assert_se(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
}
+static void test_read_hostname_config(void) {
+ char path[] = "/tmp/hostname.XXXXXX";
+ char *hostname;
+ int fd;
+
+ fd = mkostemp_safe(path, O_RDWR|O_CLOEXEC);
+ assert(fd > 0);
+ close(fd);
+
+ /* simple hostname */
+ write_string_file(path, "foo");
+ assert_se(read_hostname_config(path, &hostname) == 0);
+ assert_se(streq(hostname, "foo"));
+ free(hostname);
+ hostname = NULL;
+
+ /* with comment */
+ write_string_file(path, "# comment\nfoo");
+ assert_se(read_hostname_config(path, &hostname) == 0);
+ assert_se(hostname);
+ assert_se(streq(hostname, "foo"));
+ free(hostname);
+ hostname = NULL;
+
+ /* with comment and extra whitespace */
+ write_string_file(path, "# comment\n\n foo ");
+ assert_se(read_hostname_config(path, &hostname) == 0);
+ assert_se(hostname);
+ assert_se(streq(hostname, "foo"));
+ free(hostname);
+ hostname = NULL;
+
+ /* cleans up name */
+ write_string_file(path, "!foo/bar.com");
+ assert_se(read_hostname_config(path, &hostname) == 0);
+ assert_se(hostname);
+ assert_se(streq(hostname, "foobar.com"));
+ free(hostname);
+ hostname = NULL;
+
+ /* no value set */
+ hostname = (char*) 0x1234;
+ write_string_file(path, "# nothing here\n");
+ assert_se(read_hostname_config(path, &hostname) == -ENOENT);
+ assert_se(hostname == (char*) 0x1234); /* does not touch argument on error */
+
+ /* nonexisting file */
+ assert_se(read_hostname_config("/non/existing", &hostname) == -ENOENT);
+ assert_se(hostname == (char*) 0x1234); /* does not touch argument on error */
+
+ unlink(path);
+}
+
static void test_u64log2(void) {
assert_se(u64log2(0) == 0);
assert_se(u64log2(8) == 3);
@@ -1481,6 +1535,7 @@ int main(int argc, char *argv[]) {
test_foreach_word_quoted();
test_memdup_multiply();
test_hostname_is_valid();
+ test_read_hostname_config();
test_u64log2();
test_protect_errno();
test_parse_size();
diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c
index 735668bede..d69129ee03 100644
--- a/src/timesync/timesyncd.c
+++ b/src/timesync/timesyncd.c
@@ -24,6 +24,7 @@
#include "capability.h"
#include "clock-util.h"
#include "network-util.h"
+#include "signal-util.h"
#include "timesyncd-manager.h"
#include "timesyncd-conf.h"
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index c440170f95..97251ef0aa 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -44,6 +44,7 @@
#include "def.h"
#include "process-util.h"
#include "terminal-util.h"
+#include "signal-util.h"
static enum {
ACTION_LIST,
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index b3e7d02543..ce038abee5 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -174,6 +174,9 @@ static int load_link(link_config_ctx *ctx, const char *filename) {
else
log_debug("Parsed configuration file %s", filename);
+ if (link->mtu > UINT_MAX || link->speed > UINT_MAX)
+ return -ERANGE;
+
link->filename = strdup(filename);
LIST_PREPEND(links, ctx->links, link);
@@ -376,10 +379,9 @@ int link_config_apply(link_config_ctx *ctx, link_config *config,
if (!old_name)
return -EINVAL;
- r = ethtool_set_speed(&ctx->ethtool_fd, old_name, config->speed / 1024,
- config->duplex);
+ r = ethtool_set_speed(&ctx->ethtool_fd, old_name, config->speed / 1024, config->duplex);
if (r < 0)
- log_warning_errno(r, "Could not set speed or duplex of %s to %u Mbps (%s): %m",
+ log_warning_errno(r, "Could not set speed or duplex of %s to %zu Mbps (%s): %m",
old_name, config->speed / 1024,
duplex_to_string(config->duplex));
@@ -458,8 +460,7 @@ int link_config_apply(link_config_ctx *ctx, link_config *config,
mac = config->mac;
}
- r = rtnl_set_link_properties(&ctx->rtnl, ifindex, config->alias, mac,
- config->mtu);
+ r = rtnl_set_link_properties(&ctx->rtnl, ifindex, config->alias, mac, config->mtu);
if (r < 0)
return log_warning_errno(r, "Could not set Alias, MACAddress or MTU on %s: %m", old_name);
diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h
index 34facdeb5d..9875057e84 100644
--- a/src/udev/net/link-config.h
+++ b/src/udev/net/link-config.h
@@ -66,8 +66,8 @@ struct link_config {
NamePolicy *name_policy;
char *name;
char *alias;
- unsigned int mtu;
- unsigned int speed;
+ size_t mtu;
+ size_t speed;
Duplex duplex;
WakeOnLan wol;
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index 78aef206b2..448920507a 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -91,6 +91,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
+#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <net/if.h>
@@ -166,15 +167,15 @@ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) {
/* read the 256 bytes PCI configuration space to check the multi-function bit */
static bool is_pci_multifunction(struct udev_device *dev) {
- _cleanup_fclose_ FILE *f = NULL;
+ _cleanup_close_ int fd = -1;
const char *filename;
uint8_t config[64];
filename = strjoina(udev_device_get_syspath(dev), "/config");
- f = fopen(filename, "re");
- if (!f)
+ fd = open(filename, O_RDONLY | O_CLOEXEC);
+ if (fd < 0)
return false;
- if (fread(&config, sizeof(config), 1, f) != 1)
+ if (read(fd, &config, sizeof(config)) != sizeof(config))
return false;
/* bit 0-6 header type, bit 7 multi/single function device */
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index 2fa26a40be..a5c3edbff8 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -30,9 +30,19 @@
#include <sys/wait.h>
#include <sys/signalfd.h>
-#include "udev.h"
#include "rtnl-util.h"
+#include "event-util.h"
#include "formats-util.h"
+#include "process-util.h"
+#include "signal-util.h"
+#include "udev.h"
+
+typedef struct Spawn {
+ const char *cmd;
+ pid_t pid;
+ usec_t timeout_warn;
+ usec_t timeout;
+} Spawn;
struct udev_event *udev_event_new(struct udev_device *dev) {
struct udev *udev = udev_device_get_udev(dev);
@@ -45,8 +55,7 @@ struct udev_event *udev_event_new(struct udev_device *dev) {
event->udev = udev;
udev_list_init(udev, &event->run_list, false);
udev_list_init(udev, &event->seclabel_list, false);
- event->fd_signal = -1;
- event->birth_usec = now(CLOCK_MONOTONIC);
+ event->birth_usec = clock_boottime_or_monotonic();
return event;
}
@@ -467,7 +476,7 @@ static void spawn_read(struct udev_event *event,
if (timeout_usec > 0) {
usec_t age_usec;
- age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
+ age_usec = clock_boottime_or_monotonic() - event->birth_usec;
if (age_usec >= timeout_usec) {
log_error("timeout '%s'", cmd);
return;
@@ -540,102 +549,116 @@ static void spawn_read(struct udev_event *event,
result[respos] = '\0';
}
+static int on_spawn_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
+ Spawn *spawn = userdata;
+ char timeout[FORMAT_TIMESTAMP_RELATIVE_MAX];
+
+ assert(spawn);
+
+ kill_and_sigcont(spawn->pid, SIGKILL);
+
+ log_error("spawned process '%s' ["PID_FMT"] timed out after %s, killing", spawn->cmd, spawn->pid,
+ format_timestamp_relative(timeout, sizeof(timeout), spawn->timeout));
+
+ return 1;
+}
+
+static int on_spawn_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
+ Spawn *spawn = userdata;
+ char timeout[FORMAT_TIMESTAMP_RELATIVE_MAX];
+
+ assert(spawn);
+
+ log_warning("spawned process '%s' ["PID_FMT"] is taking longer than %s to complete", spawn->cmd, spawn->pid,
+ format_timestamp_relative(timeout, sizeof(timeout), spawn->timeout));
+
+ return 1;
+}
+
+static int on_spawn_sigchld(sd_event_source *s, const siginfo_t *si, void *userdata) {
+ Spawn *spawn = userdata;
+
+ assert(spawn);
+
+ switch (si->si_code) {
+ case CLD_EXITED:
+ if (si->si_status != 0)
+ log_warning("process '%s' failed with exit code %i.", spawn->cmd, si->si_status);
+ else {
+ log_debug("process '%s' succeeded.", spawn->cmd);
+ sd_event_exit(sd_event_source_get_event(s), 0);
+
+ return 1;
+ }
+
+ break;
+ case CLD_KILLED:
+ case CLD_DUMPED:
+ log_warning("process '%s' terminated by signal %s.", spawn->cmd, signal_to_string(si->si_status));
+
+ break;
+ default:
+ log_error("process '%s' failed due to unknown reason.", spawn->cmd);
+ }
+
+ sd_event_exit(sd_event_source_get_event(s), -EIO);
+
+ return 1;
+}
+
static int spawn_wait(struct udev_event *event,
usec_t timeout_usec,
usec_t timeout_warn_usec,
const char *cmd, pid_t pid) {
- struct pollfd pfd[1];
- int err = 0;
-
- pfd[0].events = POLLIN;
- pfd[0].fd = event->fd_signal;
+ Spawn spawn = {
+ .cmd = cmd,
+ .pid = pid,
+ };
+ _cleanup_event_unref_ sd_event *e = NULL;
+ int r, ret;
- while (pid > 0) {
- int timeout;
- int timeout_warn = 0;
- int fdcount;
+ r = sd_event_new(&e);
+ if (r < 0)
+ return r;
- if (timeout_usec > 0) {
- usec_t age_usec;
+ if (timeout_usec > 0) {
+ usec_t usec, age_usec;
- age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
- if (age_usec >= timeout_usec)
- timeout = 1000;
- else {
- if (timeout_warn_usec > 0)
- timeout_warn = ((timeout_warn_usec - age_usec) / USEC_PER_MSEC) + MSEC_PER_SEC;
+ usec = now(clock_boottime_or_monotonic());
+ age_usec = usec - event->birth_usec;
+ if (age_usec < timeout_usec) {
+ if (timeout_warn_usec > 0 && timeout_warn_usec < timeout_usec && age_usec < timeout_warn_usec) {
+ spawn.timeout_warn = timeout_warn_usec - age_usec;
- timeout = ((timeout_usec - timeout_warn_usec - age_usec) / USEC_PER_MSEC) + MSEC_PER_SEC;
+ r = sd_event_add_time(e, NULL, clock_boottime_or_monotonic(),
+ usec + spawn.timeout_warn, USEC_PER_SEC,
+ on_spawn_timeout_warning, &spawn);
+ if (r < 0)
+ return r;
}
- } else {
- timeout = -1;
- }
- fdcount = poll(pfd, 1, timeout_warn);
- if (fdcount < 0) {
- if (errno == EINTR)
- continue;
- err = -errno;
- log_error_errno(errno, "failed to poll: %m");
- goto out;
- }
- if (fdcount == 0) {
- log_warning("slow: '%s' ["PID_FMT"]", cmd, pid);
+ spawn.timeout = timeout_usec - age_usec;
- fdcount = poll(pfd, 1, timeout);
- if (fdcount < 0) {
- if (errno == EINTR)
- continue;
- err = -errno;
- log_error_errno(errno, "failed to poll: %m");
- goto out;
- }
- if (fdcount == 0) {
- log_error("timeout: killing '%s' ["PID_FMT"]", cmd, pid);
- kill(pid, SIGKILL);
- }
+ r = sd_event_add_time(e, NULL, clock_boottime_or_monotonic(),
+ usec + spawn.timeout, USEC_PER_SEC, on_spawn_timeout, &spawn);
+ if (r < 0)
+ return r;
}
+ }
- if (pfd[0].revents & POLLIN) {
- struct signalfd_siginfo fdsi;
- int status;
- ssize_t size;
+ r = sd_event_add_child(e, NULL, pid, WEXITED, on_spawn_sigchld, &spawn);
+ if (r < 0)
+ return r;
- size = read(event->fd_signal, &fdsi, sizeof(struct signalfd_siginfo));
- if (size != sizeof(struct signalfd_siginfo))
- continue;
+ r = sd_event_loop(e);
+ if (r < 0)
+ return r;
- switch (fdsi.ssi_signo) {
- case SIGTERM:
- event->sigterm = true;
- break;
- case SIGCHLD:
- if (waitpid(pid, &status, WNOHANG) < 0)
- break;
- if (WIFEXITED(status)) {
- log_debug("'%s' ["PID_FMT"] exit with return code %i", cmd, pid, WEXITSTATUS(status));
- if (WEXITSTATUS(status) != 0)
- err = -1;
- } else if (WIFSIGNALED(status)) {
- log_error("'%s' ["PID_FMT"] terminated by signal %i (%s)", cmd, pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
- err = -1;
- } else if (WIFSTOPPED(status)) {
- log_error("'%s' ["PID_FMT"] stopped", cmd, pid);
- err = -1;
- } else if (WIFCONTINUED(status)) {
- log_error("'%s' ["PID_FMT"] continued", cmd, pid);
- err = -1;
- } else {
- log_error("'%s' ["PID_FMT"] exit with status 0x%04x", cmd, pid, status);
- err = -1;
- }
- pid = 0;
- break;
- }
- }
- }
-out:
- return err;
+ r = sd_event_get_exit_code(e, &ret);
+ if (r < 0)
+ return r;
+
+ return ret;
}
int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]) {
diff --git a/src/udev/udev.h b/src/udev/udev.h
index dece6eccab..1b17c615b8 100644
--- a/src/udev/udev.h
+++ b/src/udev/udev.h
@@ -44,11 +44,9 @@ struct udev_event {
struct udev_list run_list;
int exec_delay;
usec_t birth_usec;
- int fd_signal;
sd_rtnl *rtnl;
unsigned int builtin_run;
unsigned int builtin_ret;
- bool sigterm;
bool inotify_watch;
bool inotify_watch_final;
bool group_set;
diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c
index fe092cfbd9..46ec0e3225 100644
--- a/src/udev/udevadm-test.c
+++ b/src/udev/udevadm-test.c
@@ -131,12 +131,6 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) {
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, &sigmask_orig);
- event->fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
- if (event->fd_signal < 0) {
- fprintf(stderr, "error creating signalfd\n");
- rc = 5;
- goto out;
- }
udev_event_execute_rules(event,
60 * USEC_PER_SEC, 20 * USEC_PER_SEC,
@@ -154,8 +148,6 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) {
printf("run: '%s'\n", program);
}
out:
- if (event != NULL && event->fd_signal >= 0)
- close(event->fd_signal);
udev_builtin_exit(udev);
return rc;
}
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 19640cb6ea..34e88af539 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -41,6 +41,8 @@
#include <sys/inotify.h>
#include "sd-daemon.h"
+#include "sd-event.h"
+#include "event-util.h"
#include "rtnl-util.h"
#include "cgroup-util.h"
#include "process-util.h"
@@ -62,6 +64,7 @@ static usec_t arg_event_timeout_warn_usec = 180 * USEC_PER_SEC / 3;
typedef struct Manager {
struct udev *udev;
+ sd_event *event;
Hashmap *workers;
struct udev_list_node events;
char *cgroup;
@@ -74,17 +77,16 @@ typedef struct Manager {
struct udev_monitor *monitor;
struct udev_ctrl *ctrl;
struct udev_ctrl_connection *ctrl_conn_blocking;
-
- int fd_ep;
- int fd_ctrl;
- int fd_uevent;
- int fd_signal;
int fd_inotify;
- int fd_worker;
int worker_watch[2];
+ sd_event_source *ctrl_event;
+ sd_event_source *uevent_event;
+ sd_event_source *inotify_event;
+
+ usec_t last_usec;
+
bool stop_exec_queue:1;
- bool reload:1;
bool exit:1;
} Manager;
@@ -110,8 +112,8 @@ struct event {
dev_t devnum;
int ifindex;
bool is_block;
- usec_t start_usec;
- bool warned;
+ sd_event_source *timeout_warning;
+ sd_event_source *timeout;
};
static inline struct event *node_to_event(struct udev_list_node *node) {
@@ -151,6 +153,9 @@ static void event_free(struct event *event) {
udev_device_unref(event->dev);
udev_device_unref(event->dev_kernel);
+ sd_event_source_unref(event->timeout_warning);
+ sd_event_source_unref(event->timeout);
+
if (event->worker)
event->worker->event = NULL;
@@ -252,7 +257,12 @@ static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *use
}
static void worker_attach_event(struct worker *worker, struct event *event) {
+ sd_event *e;
+ uint64_t usec;
+ int r;
+
assert(worker);
+ assert(worker->manager);
assert(event);
assert(!event->worker);
assert(!worker->event);
@@ -260,9 +270,19 @@ static void worker_attach_event(struct worker *worker, struct event *event) {
worker->state = WORKER_RUNNING;
worker->event = event;
event->state = EVENT_RUNNING;
- event->start_usec = now(CLOCK_MONOTONIC);
- event->warned = false;
event->worker = worker;
+
+ e = worker->manager->event;
+
+ r = sd_event_now(e, clock_boottime_or_monotonic(), &usec);
+ if (r < 0)
+ return;
+
+ (void) sd_event_add_time(e, &event->timeout_warning, clock_boottime_or_monotonic(),
+ usec + arg_event_timeout_warn_usec, USEC_PER_SEC, on_event_timeout_warning, event);
+
+ (void) sd_event_add_time(e, &event->timeout, clock_boottime_or_monotonic(),
+ usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
}
static void manager_free(Manager *manager) {
@@ -271,7 +291,12 @@ static void manager_free(Manager *manager) {
udev_builtin_exit(manager->udev);
+ sd_event_source_unref(manager->ctrl_event);
+ sd_event_source_unref(manager->uevent_event);
+ sd_event_source_unref(manager->inotify_event);
+
udev_unref(manager->udev);
+ sd_event_unref(manager->event);
manager_workers_free(manager);
event_queue_cleanup(manager, EVENT_UNDEF);
@@ -283,8 +308,6 @@ static void manager_free(Manager *manager) {
udev_rules_unref(manager->rules);
free(manager->cgroup);
- safe_close(manager->fd_ep);
- safe_close(manager->fd_signal);
safe_close(manager->fd_inotify);
safe_close_pair(manager->worker_watch);
@@ -316,10 +339,11 @@ static void worker_spawn(Manager *manager, struct event *event) {
switch (pid) {
case 0: {
struct udev_device *dev = NULL;
+ _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
int fd_monitor;
_cleanup_close_ int fd_signal = -1, fd_ep = -1;
- _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
- struct epoll_event ep_signal, ep_monitor;
+ struct epoll_event ep_signal = { .events = EPOLLIN };
+ struct epoll_event ep_monitor = { .events = EPOLLIN };
sigset_t mask;
int r = 0;
@@ -327,13 +351,22 @@ static void worker_spawn(Manager *manager, struct event *event) {
dev = event->dev;
event->dev = NULL;
+ unsetenv("NOTIFY_SOCKET");
+
manager_workers_free(manager);
event_queue_cleanup(manager, EVENT_UNDEF);
+
manager->monitor = udev_monitor_unref(manager->monitor);
+ manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
manager->ctrl = udev_ctrl_unref(manager->ctrl);
- manager->fd_signal = safe_close(manager->fd_signal);
+ manager->ctrl_conn_blocking = udev_ctrl_connection_unref(manager->ctrl_conn_blocking);
manager->worker_watch[READ_END] = safe_close(manager->worker_watch[READ_END]);
- manager->fd_ep = safe_close(manager->fd_ep);
+
+ manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
+ manager->uevent_event = sd_event_source_unref(manager->uevent_event);
+ manager->inotify_event = sd_event_source_unref(manager->inotify_event);
+
+ manager->event = sd_event_unref(manager->event);
sigfillset(&mask);
fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
@@ -341,6 +374,10 @@ static void worker_spawn(Manager *manager, struct event *event) {
r = log_error_errno(errno, "error creating signalfd %m");
goto out;
}
+ ep_signal.data.fd = fd_signal;
+
+ fd_monitor = udev_monitor_get_fd(worker_monitor);
+ ep_monitor.data.fd = fd_monitor;
fd_ep = epoll_create1(EPOLL_CLOEXEC);
if (fd_ep < 0) {
@@ -348,15 +385,6 @@ static void worker_spawn(Manager *manager, struct event *event) {
goto out;
}
- memzero(&ep_signal, sizeof(struct epoll_event));
- ep_signal.events = EPOLLIN;
- ep_signal.data.fd = fd_signal;
-
- fd_monitor = udev_monitor_get_fd(worker_monitor);
- memzero(&ep_monitor, sizeof(struct epoll_event));
- ep_monitor.events = EPOLLIN;
- ep_monitor.data.fd = fd_monitor;
-
if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 ||
epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_monitor, &ep_monitor) < 0) {
r = log_error_errno(errno, "fail to add fds to epoll: %m");
@@ -380,9 +408,6 @@ static void worker_spawn(Manager *manager, struct event *event) {
goto out;
}
- /* needed for SIGCHLD/SIGTERM in spawn() */
- udev_event->fd_signal = fd_signal;
-
if (arg_exec_delay > 0)
udev_event->exec_delay = arg_exec_delay;
@@ -455,11 +480,6 @@ skip:
udev_device_unref(dev);
dev = NULL;
- if (udev_event->sigterm) {
- udev_event_unref(udev_event);
- goto out;
- }
-
udev_event_unref(udev_event);
/* wait for more device messages from main udevd, or term signal */
@@ -564,7 +584,10 @@ static int event_queue_insert(Manager *manager, struct udev_device *dev) {
assert(manager);
assert(dev);
- /* only the main process can add events to the queue */
+ /* only one process can add events to the queue */
+ if (manager->pid == 0)
+ manager->pid = getpid();
+
assert(manager->pid == getpid());
event = new0(struct event, 1);
@@ -687,11 +710,104 @@ static bool is_devpath_busy(Manager *manager, struct event *event) {
return false;
}
+static int on_exit_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
+ Manager *manager = userdata;
+
+ assert(manager);
+
+ log_error_errno(ETIMEDOUT, "giving up waiting for workers to finish");
+
+ sd_event_exit(manager->event, -ETIMEDOUT);
+
+ return 1;
+}
+
+static void manager_exit(Manager *manager) {
+ uint64_t usec;
+ int r;
+
+ assert(manager);
+
+ manager->exit = true;
+
+ sd_notify(false,
+ "STOPPING=1\n"
+ "STATUS=Starting shutdown...");
+
+ /* close sources of new events and discard buffered events */
+ manager->ctrl = udev_ctrl_unref(manager->ctrl);
+ manager->ctrl_event = sd_event_source_unref(manager->ctrl_event);
+
+ manager->fd_inotify = safe_close(manager->fd_inotify);
+ manager->inotify_event = sd_event_source_unref(manager->inotify_event);
+
+ manager->monitor = udev_monitor_unref(manager->monitor);
+ manager->uevent_event = sd_event_source_unref(manager->uevent_event);
+
+ /* discard queued events and kill workers */
+ event_queue_cleanup(manager, EVENT_QUEUED);
+ manager_kill_workers(manager);
+
+ r = sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec);
+ if (r < 0)
+ return;
+
+ r = sd_event_add_time(manager->event, NULL, clock_boottime_or_monotonic(),
+ usec + 30 * USEC_PER_SEC, USEC_PER_SEC, on_exit_timeout, manager);
+ if (r < 0)
+ return;
+}
+
+/* reload requested, HUP signal received, rules changed, builtin changed */
+static void manager_reload(Manager *manager) {
+
+ assert(manager);
+
+ sd_notify(false,
+ "RELOADING=1\n"
+ "STATUS=Flushing configuration...");
+
+ manager_kill_workers(manager);
+ manager->rules = udev_rules_unref(manager->rules);
+ udev_builtin_exit(manager->udev);
+
+ sd_notify(false,
+ "READY=1\n"
+ "STATUS=Processing...");
+}
+
static void event_queue_start(Manager *manager) {
struct udev_list_node *loop;
+ usec_t usec;
+ int r;
assert(manager);
+ if (udev_list_node_is_empty(&manager->events) ||
+ manager->exit || manager->stop_exec_queue)
+ return;
+
+ r = sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec);
+ if (r >= 0) {
+ /* check for changed config, every 3 seconds at most */
+ if (manager->last_usec == 0 ||
+ (usec - manager->last_usec) > 3 * USEC_PER_SEC) {
+ if (udev_rules_check_timestamp(manager->rules) ||
+ udev_builtin_validate(manager->udev))
+ manager_reload(manager);
+
+ manager->last_usec = usec;
+ }
+ }
+
+ udev_builtin_init(manager->udev);
+
+ if (!manager->rules) {
+ manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
+ if (!manager->rules)
+ return;
+ }
+
udev_list_node_foreach(loop, &manager->events) {
struct event *event = node_to_event(loop);
@@ -785,6 +901,9 @@ static int on_worker(sd_event_source *s, int fd, uint32_t revents, void *userdat
event_free(worker->event);
}
+ /* we have free workers, try to schedule events */
+ event_queue_start(manager);
+
return 1;
}
@@ -801,6 +920,9 @@ static int on_uevent(sd_event_source *s, int fd, uint32_t revents, void *userdat
r = event_queue_insert(manager, dev);
if (r < 0)
udev_device_unref(dev);
+ else
+ /* we have fresh events, try to schedule them */
+ event_queue_start(manager);
}
return 1;
@@ -839,11 +961,12 @@ static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userd
if (udev_ctrl_get_start_exec_queue(ctrl_msg) > 0) {
log_debug("udevd message (START_EXEC_QUEUE) received");
manager->stop_exec_queue = false;
+ event_queue_start(manager);
}
if (udev_ctrl_get_reload(ctrl_msg) > 0) {
log_debug("udevd message (RELOAD) received");
- manager->reload = true;
+ manager_reload(manager);
}
str = udev_ctrl_get_set_env(ctrl_msg);
@@ -882,7 +1005,7 @@ static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userd
if (udev_ctrl_get_exit(ctrl_msg) > 0) {
log_debug("udevd message (EXIT) received");
- manager->exit = true;
+ manager_exit(manager);
/* keep reference to block the client until we exit
TODO: deal with several blocking exit requests */
manager->ctrl_conn_blocking = udev_ctrl_connection_ref(ctrl_conn);
@@ -1040,7 +1163,7 @@ static int on_sigterm(sd_event_source *s, const struct signalfd_siginfo *si, voi
assert(manager);
- manager->exit = true;
+ manager_exit(manager);
return 1;
}
@@ -1050,7 +1173,7 @@ static int on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void
assert(manager);
- manager->reload = true;
+ manager_reload(manager);
return 1;
}
@@ -1105,6 +1228,36 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi
worker_free(worker);
}
+ /* we can start new workers, try to schedule events */
+ event_queue_start(manager);
+
+ return 1;
+}
+
+static int on_post(sd_event_source *s, void *userdata) {
+ Manager *manager = userdata;
+ int r;
+
+ assert(manager);
+
+ if (udev_list_node_is_empty(&manager->events)) {
+ /* no pending events */
+ if (!hashmap_isempty(manager->workers)) {
+ /* there are idle workers */
+ log_debug("cleanup idle workers");
+ manager_kill_workers(manager);
+ } else {
+ /* we are idle */
+ if (manager->exit) {
+ r = sd_event_exit(manager->event, 0);
+ if (r < 0)
+ return r;
+ } else if (manager->cgroup)
+ /* cleanup possible left-over processes in our cgroup */
+ cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, false, true, NULL);
+ }
+ }
+
return 1;
}
@@ -1286,13 +1439,7 @@ static int parse_argv(int argc, char *argv[]) {
static int manager_new(Manager **ret) {
_cleanup_(manager_freep) Manager *manager = NULL;
- struct epoll_event ep_ctrl = { .events = EPOLLIN };
- struct epoll_event ep_inotify = { .events = EPOLLIN };
- struct epoll_event ep_signal = { .events = EPOLLIN };
- struct epoll_event ep_netlink = { .events = EPOLLIN };
- struct epoll_event ep_worker = { .events = EPOLLIN };
- sigset_t mask;
- int r, one = 1;
+ int r, fd_ctrl, fd_uevent;
assert(ret);
@@ -1300,12 +1447,6 @@ static int manager_new(Manager **ret) {
if (!manager)
return log_oom();
- manager->pid = getpid();
-
- manager->fd_ep = -1;
- manager->fd_ctrl = -1;
- manager->fd_uevent = -1;
- manager->fd_signal = -1;
manager->fd_inotify = -1;
manager->worker_watch[WRITE_END] = -1;
manager->worker_watch[READ_END] = -1;
@@ -1323,14 +1464,14 @@ static int manager_new(Manager **ret) {
udev_list_node_init(&manager->events);
udev_list_init(manager->udev, &manager->properties, true);
- r = systemd_fds(&manager->fd_ctrl, &manager->fd_uevent);
+ r = systemd_fds(&fd_ctrl, &fd_uevent);
if (r >= 0) {
/* get control and netlink socket from systemd */
- manager->ctrl = udev_ctrl_new_from_fd(manager->udev, manager->fd_ctrl);
+ manager->ctrl = udev_ctrl_new_from_fd(manager->udev, fd_ctrl);
if (!manager->ctrl)
return log_error_errno(EINVAL, "error taking over udev control socket");
- manager->monitor = udev_monitor_new_from_netlink_fd(manager->udev, "kernel", manager->fd_uevent);
+ manager->monitor = udev_monitor_new_from_netlink_fd(manager->udev, "kernel", fd_uevent);
if (!manager->monitor)
return log_error_errno(EINVAL, "error taking over netlink socket");
@@ -1344,13 +1485,13 @@ static int manager_new(Manager **ret) {
if (!manager->ctrl)
return log_error_errno(EINVAL, "error initializing udev control socket");
- manager->fd_ctrl = udev_ctrl_get_fd(manager->ctrl);
+ fd_ctrl = udev_ctrl_get_fd(manager->ctrl);
manager->monitor = udev_monitor_new_from_netlink(manager->udev, "kernel");
if (!manager->monitor)
return log_error_errno(EINVAL, "error initializing netlink socket");
- manager->fd_uevent = udev_monitor_get_fd(manager->monitor);
+ fd_uevent = udev_monitor_get_fd(manager->monitor);
(void) udev_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024);
}
@@ -1363,14 +1504,26 @@ static int manager_new(Manager **ret) {
if (r < 0)
return log_error_errno(EINVAL, "error binding udev control socket");
+ *ret = manager;
+ manager = NULL;
+
+ return 0;
+}
+
+static int manager_listen(Manager *manager) {
+ sigset_t mask;
+ int r, fd_worker, one = 1;
+
+ assert(manager);
+
/* unnamed socket from workers to the main daemon */
r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch);
if (r < 0)
return log_error_errno(errno, "error creating socketpair: %m");
- manager->fd_worker = manager->worker_watch[READ_END];
+ fd_worker = manager->worker_watch[READ_END];
- r = setsockopt(manager->fd_worker, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
+ r = setsockopt(fd_worker, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
if (r < 0)
return log_error_errno(errno, "could not enable SO_PASSCRED: %m");
@@ -1383,31 +1536,60 @@ static int manager_new(Manager **ret) {
/* block and listen to all signals on signalfd */
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, &manager->sigmask_orig);
- manager->fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
- if (manager->fd_signal < 0)
- return log_error_errno(errno, "error creating signalfd");
-
- ep_ctrl.data.fd = manager->fd_ctrl;
- ep_inotify.data.fd = manager->fd_inotify;
- ep_signal.data.fd = manager->fd_signal;
- ep_netlink.data.fd = manager->fd_uevent;
- ep_worker.data.fd = manager->fd_worker;
-
- manager->fd_ep = epoll_create1(EPOLL_CLOEXEC);
- if (manager->fd_ep < 0)
- return log_error_errno(errno, "error creating epoll fd: %m");
-
- if (epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_ctrl, &ep_ctrl) < 0 ||
- epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_inotify, &ep_inotify) < 0 ||
- epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_signal, &ep_signal) < 0 ||
- epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_uevent, &ep_netlink) < 0 ||
- epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_worker, &ep_worker) < 0)
- return log_error_errno(errno, "fail to add fds to epoll: %m");
- *ret = manager;
- manager = NULL;
+ r = sd_event_default(&manager->event);
+ if (r < 0)
+ return log_error_errno(errno, "could not allocate event loop: %m");
- return 1;
+ r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating sigint event source: %m");
+
+ r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating sigterm event source: %m");
+
+ r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating sighup event source: %m");
+
+ r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating sigchld event source: %m");
+
+ r = sd_event_set_watchdog(manager->event, true);
+ if (r < 0)
+ return log_error_errno(r, "error creating watchdog event source: %m");
+
+ r = sd_event_add_io(manager->event, &manager->ctrl_event, udev_ctrl_get_fd(manager->ctrl), EPOLLIN, on_ctrl_msg, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating ctrl event source: %m");
+
+ /* This needs to be after the inotify and uevent handling, to make sure
+ * that the ping is send back after fully processing the pending uevents
+ * (including the synthetic ones we may create due to inotify events).
+ */
+ r = sd_event_source_set_priority(manager->ctrl_event, SD_EVENT_PRIORITY_IDLE);
+ if (r < 0)
+ return log_error_errno(r, "cold not set IDLE event priority for ctrl event source: %m");
+
+ r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating inotify event source: %m");
+
+ r = sd_event_add_io(manager->event, &manager->uevent_event, udev_monitor_get_fd(manager->monitor), EPOLLIN, on_uevent, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating uevent event source: %m");
+
+ r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating worker event source: %m");
+
+ r = sd_event_add_post(manager->event, NULL, on_post, manager);
+ if (r < 0)
+ return log_error_errno(r, "error creating post event source: %m");
+
+ return 0;
}
int main(int argc, char *argv[]) {
@@ -1446,23 +1628,6 @@ int main(int argc, char *argv[]) {
log_debug("set children_max to %u", arg_children_max);
}
- /* before opening new files, make sure std{in,out,err} fds are in a sane state */
- if (arg_daemonize) {
- int fd;
-
- fd = open("/dev/null", O_RDWR);
- if (fd < 0)
- log_error("cannot open /dev/null");
- else {
- if (write(STDOUT_FILENO, 0, 0) < 0)
- dup2(fd, STDOUT_FILENO);
- if (write(STDERR_FILENO, 0, 0) < 0)
- dup2(fd, STDERR_FILENO);
- if (fd > STDERR_FILENO)
- close(fd);
- }
- }
-
/* set umask before creating any file/directory */
r = chdir("/");
if (r < 0) {
@@ -1484,14 +1649,12 @@ int main(int argc, char *argv[]) {
goto exit;
}
- dev_setup(NULL);
+ dev_setup(NULL, UID_INVALID, GID_INVALID);
r = manager_new(&manager);
if (r < 0)
goto exit;
- log_info("starting version " VERSION);
-
r = udev_rules_apply_static_dev_perms(manager->rules);
if (r < 0)
log_error_errno(r, "failed to apply permissions on static device nodes: %m");
@@ -1499,6 +1662,8 @@ int main(int argc, char *argv[]) {
if (arg_daemonize) {
pid_t pid;
+ log_info("starting version " VERSION);
+
pid = fork();
switch (pid) {
case 0:
@@ -1516,187 +1681,27 @@ int main(int argc, char *argv[]) {
write_string_file("/proc/self/oom_score_adj", "-1000");
} else
- sd_notify(1, "READY=1");
+ sd_notify(false,
+ "READY=1\n"
+ "STATUS=Processing...");
- for (;;) {
- static usec_t last_usec;
- struct epoll_event ev[8];
- int fdcount;
- int timeout;
- bool is_worker, is_signal, is_inotify, is_uevent, is_ctrl;
- int i;
-
- if (manager->exit) {
- /* close sources of new events and discard buffered events */
- if (manager->fd_ctrl >= 0) {
- epoll_ctl(manager->fd_ep, EPOLL_CTL_DEL, manager->fd_ctrl, NULL);
- manager->fd_ctrl = safe_close(manager->fd_ctrl);
- }
-
- if (manager->monitor) {
- epoll_ctl(manager->fd_ep, EPOLL_CTL_DEL, manager->fd_uevent, NULL);
- manager->monitor = udev_monitor_unref(manager->monitor);
- }
-
- if (manager->fd_inotify >= 0) {
- epoll_ctl(manager->fd_ep, EPOLL_CTL_DEL, manager->fd_inotify, NULL);
- manager->fd_inotify = safe_close(manager->fd_inotify);
- }
-
- /* discard queued events and kill workers */
- event_queue_cleanup(manager, EVENT_QUEUED);
- manager_kill_workers(manager);
-
- /* exit after all has cleaned up */
- if (udev_list_node_is_empty(&manager->events) && hashmap_isempty(manager->workers))
- break;
-
- /* timeout at exit for workers to finish */
- timeout = 30 * MSEC_PER_SEC;
- } else if (udev_list_node_is_empty(&manager->events) && hashmap_isempty(manager->workers)) {
- /* we are idle */
- timeout = -1;
-
- /* cleanup possible left-over processes in our cgroup */
- if (manager->cgroup)
- cg_kill(SYSTEMD_CGROUP_CONTROLLER, manager->cgroup, SIGKILL, false, true, NULL);
- } else {
- /* kill idle or hanging workers */
- timeout = 3 * MSEC_PER_SEC;
- }
-
- fdcount = epoll_wait(manager->fd_ep, ev, ELEMENTSOF(ev), timeout);
- if (fdcount < 0)
- continue;
-
- if (fdcount == 0) {
- struct worker *worker;
- Iterator j;
-
- /* timeout */
- if (manager->exit) {
- log_error("timeout, giving up waiting for workers to finish");
- break;
- }
-
- /* kill idle workers */
- if (udev_list_node_is_empty(&manager->events)) {
- log_debug("cleanup idle workers");
- manager_kill_workers(manager);
- }
-
- /* check for hanging events */
- HASHMAP_FOREACH(worker, manager->workers, j) {
- struct event *event = worker->event;
- usec_t ts;
-
- if (worker->state != WORKER_RUNNING)
- continue;
-
- assert(event);
-
- ts = now(CLOCK_MONOTONIC);
-
- if ((ts - event->start_usec) > arg_event_timeout_warn_usec) {
- if ((ts - event->start_usec) > arg_event_timeout_usec)
- on_event_timeout(NULL, 0, event);
- else if (!event->warned) {
- on_event_timeout_warning(NULL, 0, event);
- event->warned = true;
- }
- }
- }
-
- }
-
- is_worker = is_signal = is_inotify = is_uevent = is_ctrl = false;
- for (i = 0; i < fdcount; i++) {
- if (ev[i].data.fd == manager->fd_worker && ev[i].events & EPOLLIN)
- is_worker = true;
- else if (ev[i].data.fd == manager->fd_uevent && ev[i].events & EPOLLIN)
- is_uevent = true;
- else if (ev[i].data.fd == manager->fd_signal && ev[i].events & EPOLLIN)
- is_signal = true;
- else if (ev[i].data.fd == manager->fd_inotify && ev[i].events & EPOLLIN)
- is_inotify = true;
- else if (ev[i].data.fd == manager->fd_ctrl && ev[i].events & EPOLLIN)
- is_ctrl = true;
- }
-
- /* check for changed config, every 3 seconds at most */
- if ((now(CLOCK_MONOTONIC) - last_usec) > 3 * USEC_PER_SEC) {
- if (udev_rules_check_timestamp(manager->rules))
- manager->reload = true;
- if (udev_builtin_validate(manager->udev))
- manager->reload = true;
-
- last_usec = now(CLOCK_MONOTONIC);
- }
-
- /* reload requested, HUP signal received, rules changed, builtin changed */
- if (manager->reload) {
- manager_kill_workers(manager);
- manager->rules = udev_rules_unref(manager->rules);
- udev_builtin_exit(manager->udev);
- manager->reload = false;
- }
-
- /* event has finished */
- if (is_worker)
- on_worker(NULL, manager->fd_worker, 0, manager);
-
- /* uevent from kernel */
- if (is_uevent)
- on_uevent(NULL, manager->fd_uevent, 0, manager);
-
- /* start new events */
- if (!udev_list_node_is_empty(&manager->events) && !manager->exit && !manager->stop_exec_queue) {
- udev_builtin_init(manager->udev);
- if (!manager->rules)
- manager->rules = udev_rules_new(manager->udev, arg_resolve_names);
- if (manager->rules)
- event_queue_start(manager);
- }
-
- if (is_signal) {
- struct signalfd_siginfo fdsi;
- ssize_t size;
-
- size = read(manager->fd_signal, &fdsi, sizeof(struct signalfd_siginfo));
- if (size == sizeof(struct signalfd_siginfo)) {
- switch (fdsi.ssi_signo) {
- case SIGINT:
- case SIGTERM:
- on_sigterm(NULL, &fdsi, manager);
- break;
- case SIGHUP:
- on_sighup(NULL, &fdsi, manager);
- break;
- case SIGCHLD:
- on_sigchld(NULL, &fdsi, manager);
- break;
- }
- }
- }
-
- /* we are shutting down, the events below are not handled anymore */
- if (manager->exit)
- continue;
-
- /* device node watch */
- if (is_inotify)
- on_inotify(NULL, manager->fd_inotify, 0, manager);
+ r = manager_listen(manager);
+ if (r < 0)
+ return log_error_errno(r, "failed to set up fds and listen for events: %m");
- /*
- * This needs to be after the inotify handling, to make sure,
- * that the ping is send back after the possibly generated
- * "change" events by the inotify device node watch.
- */
- if (is_ctrl)
- on_ctrl_msg(NULL, manager->fd_ctrl, 0, manager);
+ r = sd_event_loop(manager->event);
+ if (r < 0) {
+ log_error_errno(r, "event loop failed: %m");
+ goto exit;
}
+ sd_event_get_exit_code(manager->event, &r);
+
exit:
+ sd_notify(false,
+ "STOPPING=1\n"
+ "STATUS=Shutting down...");
+
if (manager)
udev_ctrl_cleanup(manager->ctrl);
mac_selinux_finish();
diff --git a/tmpfiles.d/etc.conf.m4 b/tmpfiles.d/etc.conf.m4
index ab5cd16f24..e74b02687f 100644
--- a/tmpfiles.d/etc.conf.m4
+++ b/tmpfiles.d/etc.conf.m4
@@ -11,7 +11,7 @@ L /etc/os-release - - - - ../usr/lib/os-release
L /etc/localtime - - - - ../usr/share/zoneinfo/UTC
L+ /etc/mtab - - - - ../proc/self/mounts
m4_ifdef(`ENABLE_RESOLVED',
-L /etc/resolv.conf - - - - ../run/systemd/resolve/resolv.conf
+L! /etc/resolv.conf - - - - ../run/systemd/resolve/resolv.conf
)m4_dnl
C /etc/nsswitch.conf - - - -
m4_ifdef(`HAVE_PAM',
diff --git a/tmpfiles.d/legacy.conf b/tmpfiles.d/legacy.conf
index 32196723f9..3cb0c63815 100644
--- a/tmpfiles.d/legacy.conf
+++ b/tmpfiles.d/legacy.conf
@@ -26,7 +26,7 @@ d /run/lock/subsys 0755 root root -
d /run/lock/lockdev 0775 root lock -
-# /forcefsck, /fastboot and /forcequotecheck are deprecated in favor of the
+# /forcefsck, /fastboot and /forcequotacheck are deprecated in favor of the
# kernel command line options 'fsck.mode=force', 'fsck.mode=skip' and
# 'quotacheck.mode=force'
diff --git a/units/systemd-journald-audit.socket b/units/systemd-journald-audit.socket
index 35397aaeb8..541f2cf38d 100644
--- a/units/systemd-journald-audit.socket
+++ b/units/systemd-journald-audit.socket
@@ -11,6 +11,7 @@ Documentation=man:systemd-journald.service(8) man:journald.conf(5)
DefaultDependencies=no
Before=sockets.target
ConditionSecurity=audit
+ConditionCapability=CAP_AUDIT_READ
[Socket]
Service=systemd-journald.service
diff --git a/units/systemd-nspawn@.service.in b/units/systemd-nspawn@.service.in
index 9492c8c0f8..074b916d38 100644
--- a/units/systemd-nspawn@.service.in
+++ b/units/systemd-nspawn@.service.in
@@ -18,6 +18,7 @@ KillMode=mixed
Type=notify
RestartForceExitStatus=133
SuccessExitStatus=133
+Slice=machine.slice
Delegate=yes
# Enforce a strict device policy, similar to the one nspawn configures
diff --git a/units/systemd-udevd.service.in b/units/systemd-udevd.service.in
index 32f04d901a..e7216d61f2 100644
--- a/units/systemd-udevd.service.in
+++ b/units/systemd-udevd.service.in
@@ -23,3 +23,4 @@ RestartSec=0
ExecStart=@rootlibexecdir@/systemd-udevd
MountFlags=slave
KillMode=mixed
+WatchdogSec=1min